YOLO 问题与修复
动态输入尺寸 动态输入大小允许导出的模型处理不同的图像尺寸,从而为不同的用例提供灵活性并优化处理效率。当导出为 ONNX 或 TensorRT 等格式时,启用动态输入大小可确保模型能够无缝适应不同的输…
动态输入尺寸
动态输入大小允许导出的模型处理不同的图像尺寸,从而为不同的用例提供灵活性并优化处理效率。当导出为 ONNX 或 TensorRT 等格式时,启用动态输入大小可确保模型能够无缝适应不同的输入形状。
1from ultralytics import YOLO
2# 要启用此功能,请使用 dynamic=True 导出期间的标志
3model = YOLO("yolo26n.pt")
4model.export(format="onnx", dynamic=True)
模型尺寸
YOLOv8 系列模型(比如你提到的 YOLOv8n、YOLOv8s、YOLOv8m)其实是不同规模(规模指参数量、计算量和推理速度)的模型变体。每个字母代表一种模型尺寸,随着字母往后模型越来越大、精度越高、推理越慢。
这些模型主要有以下五种:
- n(Nano):最轻量、最小的模型
适合算力受限场景,比如移动端、嵌入式设备、实时低延迟推理。速度最快,但精度最低。
- s(Small):小型模型
速度和精度之间比较平衡,适合实时检测任务,例如实时摄像头、监控场景。
- m(Medium):中型模型
在精度和速度上处于中等水平,是通用任务的常用选择。
- l(Large):大型模型
参数更多,精度提升明显,适合对检测精度要求较高但仍能接受较长推理时间的场景。
- x(X-Large):超大模型
拥有最多参数和最高精度,但推理时间最长,适用于不太受延迟限制的高精度应用或服务器/离线分析环境。
模型之间的本质差异
从 n → s → m → l → x,核心差异在于:
- 网络深度和宽度
宽度表示通道数,深度表示层数。尺寸越大,网络越深、通道越多,能学习更丰富的特征。
- 参数量和计算量(FLOPs)增长
例如 YOLOv8n 参数极少,YOLOv8x 参数最多,因此性能和资源需求差异明显。
精度与速度权衡
- 大模型能提高 mAP(标准检测精度指标),但推理速度和对硬件需求也随之增加。
简单选型建议
- 资源极其有限或实时要求非常高:选 YOLOv8n
- 通用实时场景:选 YOLOv8s
- 需要更高精度同时硬件条件还不错:选 YOLOv8m
- 数据复杂或任务难度大:考虑 YOLOv8l 或 YOLOv8x
- 离线分析或服务器端批量处理:优先 YOLOv8x
模型调用方式
1model = YOLO("yolov8n.yaml")
2
3model = YOLO("yolov8n.pt")
这两个 YOLO() 调用的区别:
1YOLO("yolov8n.yaml")
从 YAML 配置文件加载模型架构,只包含结构定义,不包含预训练权重,通常用于从头开始训练或自定义架构
1YOLO("yolov8n.pt")
从 PyTorch 权重文件加载模型,包含预训练权重,通常用于迁移学习、推理或继续训练
在上述代码中,第 3 行会覆盖第 1 行的 model,所以实际使用的是 yolov8n.pt(预训练模型)。
建议:
- 如果要从头训练:使用 yolov8n.yaml
- 如果要迁移学习/微调:使用 yolov8n.pt(推荐)
术语
标签、边界框、分割掩码
1. 标签(Label)
“标签”是用来 描述图像或图像中的目标类别的文字或编号。
- 在图像分类中,一个图像整体通常只有一个标签,比如“狗”、“猫”。
- 在目标检测或分割中,每一个被识别的目标也需要有一个类别标签,比如“人”、“汽车”、“猫”等。
本质上标签就是告诉模型:这是哪类东西。
2. 边界框(Bounding Box)
边界框是一个 矩形框,它把图像中某个对象包起来,用来告诉模型:
- 这个矩形区域包含了一个目标;
- 目标大致的位置和大小。
具体来说:
- 你在图片中拖一个矩形框把目标圈出来;
- 框的位置和大小被表示为坐标(左上角和右下角,或者中心 + 宽高形式等)。
边界框的重要性:
- 它是很多目标检测模型(例如 YOLO、Faster-R-CNN)训练和预测的基础;
- 训练时模型要学习预测这些框的位置和类别。
3. 分割掩码(Segmentation Mask)
分割掩码比边界框更细致,因为它是 像素级的标注。
它告诉模型:
- 图像中的每个像素属于哪个类别;
- 不只是矩形区域,而是精确到真实对象的形状。
例如:
- 一张汽车图片的分割掩码会为每一个汽车像素赋予一个特定值;
- 背景像素则标记为其他类别或背景。
常见的分割掩码类型:
- 语义分割:对像素分配类别(像“车”、“人”、“路”),不区分同类实例;
- 实例分割:分割每个单独对象的像素轮廓(例如车1、车2、车3,不只是“车”类别)。
分割掩码在训练时常作为单独的图像(二值图、类标签图)提供给模型。
标注格式(YOLO)
每张图片对应一个 .txt 文件,格式:
class_id center_x center_y width height
- 所有坐标都是归一化的(0-1之间)
- 每行一个目标
10 0.5 0.5 0.3 0.4 # 类别0,中心(0.5,0.5),宽30%,高40%
21 0.2 0.3 0.1 0.15 # 类别1,中心(0.2,0.3),宽10%,高15%
训练好的两个模型区别
1weights
2 best.pt
3 last.pt
- best.pt - 最佳模型
- 含义:在验证集上表现最好的模型权重
- 特点:训练过程中验证集指标(如 mAP、精确度)最高的检查点
- 用途:通常用于推理和部署,性能更稳定
- last.pt - 最后一轮模型
- 含义:训练最后一轮(第3轮)的模型权重
- 特点:训练结束时的最终状态,但不一定是验证集上最好的
- 用途:可用于继续训练(resume)或对比分析
建议
- 优先使用 best.pt 进行推理和部署
- 需要继续训练时,使用 last.pt 作为起点
训练参数
1. 基础训练参数
| 参数 | 说明 | 默认值 | 常用值 | 调整建议 |
|---|---|---|---|---|
| epochs | 训练轮数 | 100 | 50-300 | 小数据集用更多,大数据集用较少 |
| batch | 批次大小 | 16 | 8-64 | 根据 GPU 内存调整,内存不足时减小 |
| imgsz | 输入图像尺寸 | 640 | 320/640/1280 | 越大精度越高但速度越慢 |
| device | 训练设备 | ‘cpu’ | ‘0’/‘mps’/‘cuda’ | GPU 训练更快 |
2. 模型选择
| 参数 | 说明 | 默认值 | 可选值 |
|---|---|---|---|
| model | 模型文件 | - | ‘yolov8n.pt’/‘yolov8s.pt’/‘yolov8m.pt’/‘yolov8l.pt’/‘yolov8x.pt’ |
| data | 数据集配置文件 | - | ‘coco8.yaml’ 等 |
常用参数(根据情况调整)
3. 学习率参数
| 参数 | 说明 | 默认值 | 调整场景 |
|---|---|---|---|
| lr0 | 初始学习率 | 0.01 | 训练不稳定时减小(如 0.001) |
| lrf | 最终学习率因子 | 0.01 | 学习率衰减比例 |
| momentum | 动量 | 0.937 | 一般不改 |
| weight_decay | 权重衰减 | 0.0005 | 过拟合时增大 |
4. 早停与保存
| 参数 | 说明 | 默认值 | 调整建议 |
|---|---|---|---|
| patience | 早停耐心值 | 100 | 验证集无提升时提前停止 |
| save_period | 保存周期 | -1 | 每 N 个 epoch 保存一次 |
5. 数据增强(过拟合时调整)
| 参数 | 说明 | 默认值 | 调整建议 |
|---|---|---|---|
| mosaic | Mosaic 增强概率 | 1.0 | 过拟合时减小 |
| mixup | Mixup 增强概率 | 0.0 | 可设为 0.1-0.3 |
| fliplr | 水平翻转概率 | 0.5 | 0.0-0.5 |
| hsv_h/s/v | HSV 颜色增强 | 0.015/0.7/0.4 | 调整颜色变化幅度 |
| degrees | 旋转角度 | 0.0 | 0-45 |
| translate | 平移比例 | 0.1 | 0.0-0.2 |
| scale | 缩放比例 | 0.5 | 0.0-1.0 |
6. 正则化(过拟合时调整)
| 参数 | 说明 | 默认值 | 调整建议 |
|---|---|---|---|
| dropout | Dropout 比率 | 0.0 | 过拟合时设为 0.1-0.3 |
| label_smoothing | 标签平滑 | 0.0 | 过拟合时设为 0.1 |
高级参数(特殊需求时调整)
7. 损失函数权重
| 参数 | 说明 | 默认值 |
|---|---|---|
| box | 边界框损失权重 | 7.5 |
| cls | 分类损失权重 | 0.5 |
| dfl | DFL 损失权重 | 1.5 |
8. 其他参数
| 参数 | 说明 | 默认值 | 用途 |
|---|---|---|---|
| workers | 数据加载线程数 | 8 | 加快数据加载 |
| cache | 缓存数据集 | False | 设为 True 可加速但占用内存 |
| amp | 混合精度训练 | True | 加速训练 |
| resume | 恢复训练 | False | 从上次中断处继续 |
| freeze | 冻结层数 | None | 微调时冻结部分层 |
数据标注平台
https://github.com/HumanSignal/label-studio 网页本地标注(可本地部署与多人协作)
https://github.com/wkentaro/labelme 极简本地标注(只能本地部署)
https://platform.ultralytics.com yolo 官方在线标注
Labelme AI 标注模型保存位置
/Users/zailiang/.cache/osam/models/blobs/
Label Studio 集成 AI 自动标注
指南:https://labelstud.io/guide/ml
如果您使用 SAM 后端和 SegmentAnything 模型 ,则模型名称将为 segment_anything_model ,这与存储库中的目录名称匹配:
1git clone https://github.com/HumanSignal/label-studio-ml-backend.git
2cd label-studio-ml-backend/label_studio_ml/examples/segment_anything_model
3docker compose up
测试:
1> curl http://localhost:9090
2{"model_class":"SamMLBackend","status":"UP"}