yolov5-6.0相关记录

微生学
2023-12-01

1. 获得最佳训练效果的建议

在大多数情况下,只要数据集足够大且标记良好,无需更改模型或训练设置即可获得良好的结果。如果一开始没有得到好的结果,可以采取一些步骤来改进,但官方总是建议用户在考虑任何更改之前首先使用所有默认设置进行训练。这有助于建立基本标准并找出需要改进的地方。

结果图(训练损失、val 损失、P、R、mAP)、PR 曲线、混淆矩阵、训练马赛克,测试结果和数据集统计图像都位于project/name目录中,通常是yolov5/runs/train/exp

数据集制作

  • 每个班级的图像。每类≥1.5k 图像
  • 每个类的实例。每类总计≥10k 个实例(标记对象)
  • 图像多样性。必须代表已部署的环境。对于实际用例,我们推荐来自一天中不同时间、不同季节、不同天气、不同光照、不同角度、不同来源(在线抓取、本地收集、不同相机)等的图像。
  • 标签一致性。所有图像中所有类的所有实例都必须标记。部分标签将不起作用。
  • 标签准确性。标签必须紧密地包围每个对象。对象与其边界框之间不应存在空间。任何对象都不应缺少标签。
  • 背景图片。背景图像是没有对象的图像,这些图像被添加到数据集中以减少误报 (FP)。我们推荐使用 0-10% 左右的背景图片来帮助减少 FPs(COCO 有 1000 张背景图片可供参考,占总数的 1%)。

网络选择

  • YOLOv5x 和YOLOv5x6等较大的模型几乎在所有情况下都会产生更好的结果,但参数更多,需要更多的 CUDA 内存来训练,并且运行速度较慢。s/m适合移动端部署,l/x适合云端部署。
  • 中小型数据集(即 VOC、VisDrone、GlobalWheat)可以使用预训练权重开始训练。
  • 大型数据集(即 COCO、Objects365、OIv6)可以不使用与训练权重。

训练设置

在修改任何内容之前,首先使用默认设置进行训练来得到基本性能指标。train.py 设置的完整列表可以在train.py argparser中找到。

  • Epochs.从 300 个 epoch 开始。如果这过早过拟合,那么您可以减少 epochs。如果在 300 个 epoch 后没有发生过拟合,则训练更长时间,即 600、1200 个等 epoch。
  • Image size.有–img 640和–img 1280的选择. 如果有许多小对象,那么自定义数据集将受益于本机或更高分辨率的训练。最好的推理结果是在–img训练运行的同时获得的,即如果你在 --img 1280训练,你也应该在 --img 1280进行测试和检测。
  • Batch size. 使用–batch-size,您的硬件允许的最大尺寸。小批量会产生较差的批量规范统计数据,应避免使用。
  • Hyperparameters。 默认超参数在hyp.scratch.yaml 中。我们建议您先使用默认超参数进行训练,然后再考虑修改任何超参数。一般来说,增加增强超参数将减少和延迟过拟合,允许更长的训练和更高的最终 mAP。减少损失分量增益超参数hyp[‘obj’]将有助于减少那些特定损失分量的过度拟合。有关优化这些超参数的自动化方法,请参阅https://docs.ultralytics.com/tutorials/training-tips-best-results/

2.权重和偏差的记录

起到一个可视化的作用,可以实时监控。

需要安装注册wandb,要创建账户和生成密钥,如果在服务器上训练,可以把这部分功能代码引掉。

  • 具体信息请参阅https://docs.ultralytics.com/tutorials/weights-and-biasis-logging/

3.多 GPU 训练配置

  • 具体信息请参阅https://docs.ultralytics.com/tutorials/multi-gpu-training/

4. 测试时间增加 (TTA)

在尝试 TTA 之前,我们希望通过在默认设置下进行测试来建立基准性能。

  • 用 TTA 测试
    附加--augment到任何现有test.py命令以启用 TTA,并将图像大小增加约 30% 以改善结果。请注意,启用 TTA 的推理通常需要大约正常推理时间的 2-3 倍,因为图像在 3 种不同分辨率下左右翻转和处理,输出在 NMS 之前合并。部分速度下降仅仅是由于较大的图像尺寸(832 对 640),而部分原因是实际的 TTA 操作。
    $ python test.py --weights yolov5x.pt --data coco.yaml --img 832 --augment
    
  • 使用 TTA 进行推理
    detect.pyTTA 推理的操作与test.pyTTA相同:只需附加--augment到任何现有detect.py命令:
    $ python detect.py --weights yolov5s.pt --img 832 --source ./inference/images/ --augment
    
  • 具体信息请参阅https://docs.ultralytics.com/tutorials/test-time-augmentation/

5. 模型集成

集成建模是一个过程,其中通过使用许多不同的建模算法或使用不同的训练数据集,创建多个不同的模型来预测结果。集成模型然后聚合每个基本模型的预测,并导致对未见数据的最终预测。使用集成模型的动机是减少预测的泛化误差。只要基础模型多样且独立,使用集成方法时模型的预测误差就会降低。该方法在做出预测时寻求群体的智慧。即使集成模型在模型中具有多个基本模型,它仍作为单个模型运行和执行。

  • 在集成之前,我们要建立单个模型的基线性能。此命令在 COCO val2017 上以 640 像素的图像大小测试 YOLOv5x。yolov5x.pt是可用的最大和最准确的模型。其他选项是 yolov5s.pt,yolov5m.pt, yolov5l.pt, 或者您拥有训练自定义数据集的检查点./weights/best.pt
  • 集成测试
    通过简单地将额外的模型附加到–weights任何现有 test.pydetect.py 命令中的参数,可以在测试和推理时将多个预训练模型集成在一起。
    $ python test.py --weights yolov5x.pt yolov5l.pt --data coco.yaml --img 640
    
  • 具体信息请参阅https://docs.ultralytics.com/tutorials/model-ensembling/

6. 模型修剪

  • 具体信息请参阅https://docs.ultralytics.com/tutorials/pruning-sparsity/

7. 超参数演化

  • 具体信息请参阅https://docs.ultralytics.com/tutorials/hyperparameter-evolution/
    超参数进化的方法超参数优化使用遗传算法(GA)进行优化。

ML 中的超参数控制训练的各个方面,为它们找到最佳值可能是一个挑战。由于 1) 高维搜索空间 2) 维度之间未知的相关性,以及 3) 评估每个点的适应度的昂贵性质,诸如网格搜索之类的传统方法很快就会变得难以处理,这使得 GA 成为超参数搜索的合适候选者。

  1. 初始化超参数
    YOLOv5 有大约 25 个超参数用于各种训练设置。这些在 /data 目录中的 yaml 文件中定义。更好的初始猜测会产生更好的最终结果,因此在进化之前正确初始化这些值很重要。如果有疑问,只需使用默认值,这些值从头开始针对 YOLOv5 COCO 训练进行了优化。
    https://github.com/ultralytics/yolov5/blob/3bb414890a253bb1a269fb81cc275d11c8fffa72/data/hyp.scratch.yaml#L1-L33

  2. 定义适合度
    合适是我们寻求最大化的价值。在 YOLOv5 中,我们将默认适应度函数定义为度量的加权组合:mAP@0.5 贡献了 10% 的权重,而 mAP@0.5:0.95 贡献了剩余的 90%。您可以根据需要调整这些设置或使用默认的适合度定义。https://github.com/ultralytics/yolov5/blob/c5d233189729a9e7e25d3aa2d347aed02b545d30/utils/general.py#L917-L921

  3. 进化
    进化是针对我们寻求改进的基本场景进行的。本示例中的基本场景是使用预训练的 YOLOv5 对 COCO128 进行 10 个时期的微调。基本场景训练命令是:

    python train.py --epochs 10 --data coco128.yaml --weights yolov5s.pt --cache
    

    为了演化特定于此场景的超参数,从我们在第 1. 节中定义的初始值开始,并最大化第 2. 节中定义的适应度,附加–evolve:
    ```
    # Single-GPU
    python train.py --epochs 10 --data coco128.yaml --weights yolov5s.pt --cache --evolve

     # Multi-GPU
     for i in 0 1 2 3; do
     nohup python train.py --epochs 10 --data coco128.yaml --weights yolov5s.pt --cache --evolve --device $i > evolve_gpu_$i.log &
     done
    
     # Multi-GPU bash while (not recommended)
     for i in 0 1 2 3; do
     nohup "$(while true; do python train.py ... --evolve --device $i; done)" > evolve_gpu_$i.log &
     done
     ```
    

    默认进化设置将运行基本场景 300 次,即 300 代:https://github.com/ultralytics/yolov5/blob/c5d233189729a9e7e25d3aa2d347aed02b545d30/train.py#L497

    主要的遗传算子是交叉和变异。在这项工作中,使用变异以 90% 的概率和 0.04 的方差,根据所有前几代的最佳父母的组合来创建新的后代。结果在 中跟踪yolov5/evolve.txt,并且每代保存最高适应度的后代为yolov5/runs/evolve/hyp_evolved.yaml

    建议至少进行 300 代进化以获得最佳结果。请注意,进化通常既昂贵又耗时,因为基本场景经过数百次训练,可能需要数百或数千个 GPU 小时。

  4. 可视化
    结果保存为yolov5/evolve.png,每个超参数有一个图。值在 x 轴上,适应度在 y 轴上。黄色表示较高的浓度。垂直线表示参数已被禁用且不会发生变化。这是用户可以在metatrain.py的字典中选择的,对于固定参数和防止它们演变很有用。

8. TensorRT 部署

具体信息请参阅https://github.com/wang-xinyu/tensorrtx/tree/master/yolov5

 类似资料: