机器视觉 - yolo 调参

大小目标的分类

  • 小目标, 尺寸32*32以下, 或者长宽比超过20
  • 大目标, 尺寸96*96以上
  • 中目标, 介于大小目标之间的尺寸
  • 被检查物size如果小于 15 * 15 , 效果可能很差, 如要检测小物体最好搭配 yolov8 P2模型. 另外也可以搭配 SAHI 库进行tile平铺推理, 或者实验Yolo NAS.

yolov8 模型文件

  • 预训练模型下载: https://github.com/ultralytics/assets/releases
  • 各个模型的yaml文件: https://github.com/ultralytics/ultralytics/tree/main/ultralytics/cfg/models/v8
  • yolov8 模型结构 https://blog.csdn.net/Priplex/article/details/132339275 , https://blog.csdn.net/qq_42452134/article/details/135246245
  • model=yolov8n.yaml 正常版本, backbone 会将P3、P4、P5输出至Neck融合得到新的P3、P4、P5, head基于P3、P4、P5的特征金字塔进行detect. yolo detect 的数据集是基于 coco 数据集的, 该数据集基本没有小物体, 所以正常版本对于小物体检测效果一般并不会很好.
  • model=yolov8n-p2.yaml 小目标检测版本(即p2版), head基于P2、P3、P4、P5的特征金字塔进行detect, 因为增加了P2层,P2层卷积次数较小感受野更小,有利于检测小目标. 该版本也有多个scale, 比如 yolov8n-p2、yolov8s-p2等等, 官方未提供对应的预训练权重文件, 使用该网络模型可以搭配正常版yolov8预训练参数文件.
  • model=yolov8n-p6.yaml 高分辨率版本(即p6版),, head基于P3、P4、P5、P6的特征金字塔进行detect, 因为增加了P6层, P6层卷积次数较多感受野更大, 同时训练图像的分辨率为1280,图片信息更丰富, 适合于高分辨率图片检测. 该版本官方仅提供了一个预训练参数文件, 即 yolov8x6.
  • yolov8x6-oiv7.pt 是基于 Open image V7 数据集训练的.
  • yolov8x6-500.pt 是有500个class的训练集
  • object detect正常版预训练是基于 coco 数据集, 共80个class.

模型训练通用规则:

  • 如果 train 效果挺好, 但test或predict效果较差, 说明过拟合(overfit)了. 原因有: (1)模型太复杂了, 这时候应该减少epoch 或者使用更小scale的模型. (2) 数据集太小, 这时候需要增加训练数据. (3)增大val数据集的比例
  • 如果 train 效果不佳, 可以使用更大规模的模型, 或者增加训练数据, 或者增大 epoch.
  • 大模型在小数据集上更容易过拟合.
  • 数据集的分类物体, 如果特征较少, 推荐使用小模型. 如何确定特征的多少, 看这个维度: (1)物体的形状是否变化多样,(2)颜色是否多样,(3)纹理是否复杂,(4)大小是否差异较大.
  • 小模型通常能更好地过滤噪声信息, 如果图像质量不高, 使用小模型效果可能会更好.
  • 大目标检查, 模型深度越高, 感受野越大, 效果会更好, 推荐使用 yolov8x 或 yolov8x6 模型.
  • 小目标检测, 如果模型太深, 优势反而不利, 推荐使用 yolov8s 或 yolov8m 或 yolov8l.
  • 大小目标混合检测, 推荐使用 yolov8l6 或 yolov8x6
  • 计算过程中不用关心 loss 是否太大, 重要的是loss 是否可以收敛. 如果始终不收敛, 尝试调整优化器类型或降低学习率.
  • from scratch 训练模型需要足够的算力和数据集, 基本上每种object需要训练2000多次, 另外需要有强大的调参能力, 否则毫无意义.
  • 调整神经网络结构. 选择合适的模型规格( n/s/m/l/x 以及 p2/p6), 增加网络深度和宽度可以增强模型的表达能力.
  • 数据集应该大于 500, 否则效果很难上来.
  • 数据集应有较高质量, 标签不能错误, box边框要准确, 正负样本要平衡, 增加数据多样性.
  • 调整预测的阈值, 降低conf阈值可以提升recall, 提高conf阈值可以提升precision.
  • 调整超参, 学习率/batch/优化器/epoch 等参数

yolov8 参数设置技巧:

  • train/val/test/predict 超参最好要一致, 不一致的参数有可能会引起predict显著变化.
  • task 参数默认为 detect, 可以传递 task 如:[detect、classify、segment]
  • mode 参数默认为train, train模式下默认包含 val, ,mode 有:[train、predict、val、export]
  • model 选择v8的预训练 yolov8n.pt 模型文件, 该文件初始时不存在, 但软件包会自动下载 yolov8n.pt 模型到当前目录.
  • epochs: 训练数据集需要重复训练多少次, yolov5 推荐初始为 300 个, 而 yolov8推荐初始为500, 如果发现有过拟合overfit, 则适当减少, 如果没有overfit, 则增加到600、1200. 如果使用 CPU, 为了缩短时间epochs可从100开始试. 过拟合最优先的应对策略是增加验证集比例和增加验证集多样性.
  • batch: batch size 为一次前向传播送入模型的图片数量, 完成后将做反向传递, 进行weight/bias参数调整, batch size 取值必须为2的n次方, 最小值为2. 这个参数应使用硬件支持的最大 batch size, 比如64开始, 如果不爆内存/显存问题, 则增加到 128、256, batch size越大 batchNorm 效果越好, 精度越高.
  • lr0 为初始学习率, 学习率是梯度下降的步长系数
  • lrf 为最终学习率, 学习率是梯度下降的步长系数
  • patience 为 EarlyStopping 的 epoch 数量, 默认为 patience=50 , 如果要禁用早停特性, 设置0即可.
  • workers: 并行加载数据集的线程数量, 在windows下如果报错, 可以调整为0
  • rect 参数, yolo在进行训练之前总是会将图像按letterbox方式做resize, 所以缩放后的图像仍然保留原来真实的长宽比例. 如果rect设置为False(缺省), 表示yolo会统一将它们resize成一个正方形, 该取值适合原始图像宽高差异不大的情况; 如果rect=True, yolo resize的结果将是一个长方形而不是正方形, 比较适合原始图像宽高差异较大的情况, 在这种情况下, 如果仍然缩放到宽高相等, 图像中padding的区域就会很大, 浪费GPU算力, rect如果取值为True时候, imgsz参数应该同时设置宽高两个值.
  • imgsz 参数: 这个参数非常重要:
    • 用来将实际图像统一缩放到一个固定的尺寸送入到网络中
    • imgsz 参数必须是 32 的倍数
    • train/val/test/predict 不要求有相同的原始图像尺寸, 但最好差异不要太大.
    • 通常 imgsz 越大效果也越好, 但这并不绝对, 如果被检查物非常小, img size 太大反而不行.
    • 采用较大 imgsz, 比较容易爆显存同时训练速度也会降低, 如果原始图像是3840*2160这样高清图像,最好还是设置 imgsz=1280, 这个数值应该是速度和准确性比较好的平衡点.
    • 通常设置 imgsz=640 是一个很好的选择, yolo会自动将我们的图像缩放到640*640的尺寸, 方法是:将图像的长边缩放到640, 图像的短边按照长边缩放的比例缩放, 如果不足640, 则在短边两侧自动padding黑色像素.
    • yolov8 预训练模型基于 640 尺寸的图像训练, 如果我们的数据集为高清图像, 可以采用 yolov8 P6模型, 这个系列的模型文件分别为yolov8m6, yolov8l6, yolov8x6,

参考

https://docs.ultralytics.com/guides/yolo-common-issues/
https://docs.ultralytics.com/guides/yolo-performance-metrics/
https://docs.ultralytics.com/yolov5/tutorials/tips_for_best_training_results/#dataset
深度学习模型训练和关键参数调优详解

posted @ 2024-01-18 21:03  harrychinese  阅读(1810)  评论(1编辑  收藏  举报