‹ 返回笔记 Esc·

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,核心差异在于:

  1. 网络深度和宽度

宽度表示通道数,深度表示层数。尺寸越大,网络越深、通道越多,能学习更丰富的特征。

  1. 参数量和计算量(FLOPs)增长

例如 YOLOv8n 参数极少,YOLOv8x 参数最多,因此性能和资源需求差异明显。

精度与速度权衡

  1. 大模型能提高 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
  1. best.pt - 最佳模型
  • 含义:在验证集上表现最好的模型权重
  • 特点:训练过程中验证集指标(如 mAP、精确度)最高的检查点
  • 用途:通常用于推理和部署,性能更稳定
  1. 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"}