YOLOv5 全面解析教程⑥:模型训练流程详解
作者 | Fengwen、BBuf
欢迎 Star、试用 One-YOLOv5:
https://github.com/Oneflow-Inc/one-yolov5
1
结构项目预览
2
安装
3
训练
两种训练方式
带权重训练
2. 不带权重训练
单 GPU 训练
多 GPU 训练
注意:
--nproc_per_node 指定要使用多少 GPU。举个例子:在上面多 GPU 训练指令中它是 2。
--batch 是总批量大小。它将平均分配给每个 GPU。在上面的示例中,每 GPU 是 64/2=32。
--cfg : 指定一个包含所有评估参数的配置文件。
上面的代码默认使用 GPU 0…(N-1)。使用特定的 GPU?可以通过简单在 --device 后跟指定 GPU 来实现。「案例」,在下面的代码中,我们将使用 GPU 2,3。
恢复训练
如果你的训练进程中断了,你可以这样恢复先前的训练进程。
你也可以通过 --resume 参数指定要恢复的模型路径。
使用 SyncBatchNorm
SyncBatchNorm 可以提高多 gpu 训练的准确性,但会显著降低训练速度。它仅适用于多 GPU DistributedDataParallel 训练。建议最好在每个 GPU 上的样本数量较小(样本数量<=8)时使用。
要使用 SyncBatchNorm,只需将添加 --sync-bn 参数选项,具体「案例」如下:
4
评估
下面的命令是在 COCO val2017 数据集上以 640 像素的图像大小测试 yolov5x 模型。yolov5x 是可用小模型中最大且最精确的,其它可用选项是 yolov5n ,yolov5m,yolov5s,yolov5l ,以及他们的 P6 对应项比如 yolov5s6 ,或者你自定义的模型,即 runs/exp/weights/best 。
5
推理
首先,下载一个训练好的模型权重文件,或选择你自己训练的模型;然后,通过 detect.py 文件进行推理。
6
训练结果
本地日志
默认情况下,所有结果都记录为 runs/train,并为每个新训练创建一个新的训练结果目录,如 runs/train/exp2、runs/train/exp3 等。查看训练和测试 JPG 以查看 mosaics, labels, predictions and augmentation 效果。注意:Mosaic Dataloader 用于训练(如下所示),这是 Ultralytics 发表的新概念,首次出现在 YOLOv4 中。
train_batch0.jpg 显示 batch 为 0 的 (mosaics and labels):
val_batch0_labels.jpg 展示测试 batch 为 0 的 labels:
val_batch0_pred.jpg 展示测试 batch 为 0 predictions(预测):
训练训损失和性能的指标有记录到 Tensorboard 和自定义结果中 results.csv 日志文件,训练训完成后作为结果绘制 results.png 如下。在这里,我们展示了在 COCO128 上训练的 YOLOV5 结果
从零开始训练 (蓝色)。
加载预训练权重 --weights yolov5s (橙色)。
具体的指标分析详见文章《模型精确度评估》
7
训练技巧
声明:大多数情况下,只要数据集足够大且标记良好,就可以在不改变模型或训练设置的情况下获得良好的结果。如果一开始你没有得到好的结果,你可以采取一些步骤来改进,但我们始终建议用户在考虑任何更改之前先使用所有默认设置进行一次训练。这有助于建立评估基准和发现需要改进的地方。
模型选择
类似于 YOLOv5x 和 YOLOv5x6 的大型模型在几乎所有情况下都会产生更好的结果,但参数更多,需要更多的 CUDA 内存进行训练,运行速度较慢。
对于移动部署,我们推荐 YOLOv5s/m,对于云部署,我们建议 YOLOV5l/x。
(有关所有模型的完整比较)
从预先训练的权重开始训练。建议用于中小型数据集(即 VOC、VisDrone、GlobalWheat)。将模型的名称传递给--weights 参数。模型自动从 latest YOLOv5 releasse 下载 。
从头开始训练的话,推荐用大的数据集(即 COCO、Objects365、OIv6 )在 --cfg 选项后传递你感兴趣的网络结构文件参数 以及空的 --weights '' 参数:
训练配置
在修改任何内容之前,首先使用默认设置进行训练,以建立性能基线。训练参数的完整列表,能够在 train.py 文件中发现。
Epochs : 默认训练 300 个 epochs。如果早期过拟合,则可以减少训练。如果在 300 个周期后未发生过拟合,则可以训练更长,比如 600、1200 个 epochs。
Image size: COCO 以 --img 640,的分辨率进行训练,但由于数据集中有大量的小对象,它可以从更高分辨率(如--img 1280)的训练中训练。如果有许多小对象,则自定义数据集将从更高分辨率的训练中获益。最好的推断结果是在相同的--img 处获得的 ,即如果在-img 1280 处进行训练,也应该在--img 1280 处进行测试和检测。
Batch Size: 使用更大的 --batch-size 。能够有效缓解小样本数产生的 batchnorm 统计的错误。
Hyperparameters:默认超参数在 hyp.scratch-low.yaml 文件中。我们建议你在考虑修改任何超参数之前,先使用默认超参数进行训练。一般来说,增加增强超参数将减少和延迟过度拟合,允许更长的训练和得到更高 mAP 值。减少损耗分量增益超参数,如 hyp['obj'],将有助于减少这些特定损耗分量中的过度拟合。有关优化这些超参数的自动化方法,请参阅我们的 《超参数演化教程》。
...更多训练的超参数配置请查看本文的附录。
8
拓展
使用多机训练
这仅适用于多 GPU 分布式数据并行训练。
在训练之前,确保所有机器上的文件都相同,数据集、代码库等。之后,确保机器可以相互通信。
你必须选择一台主机器(其他机器将与之对话)。记下它的地址(master_addr)并选择一个端口(master-port)。对于下面的示例,将使用 master_addr=192.168.1.1 和 master_ port=1234。
要使用它,可以执行以下指令:
其中 G 是每台机器的 GPU 数量,N 是机器数量,R 是从 0 到(N-1)的机器数量。
假设我有两台机器,每台机器有两个 GPU,对于上面的情况,G=2,N=2,R=1。
在连接所有 N 台机器之前,训练不会开始。输出将仅显示在主机上!
注意:
oneflow 目前不支持 windows 平台
--batch 必须是 GPU 数量的倍数。
GPU 0 将比其他 GPU 占用略多的内存,因为它维护 EMA 并负责检查点等。
如果你得到 RuntimeError: Address already in use ,可能是因为你一次正在运行多个训练程序。要解决这个问题,只需通过添加--master_port 来使用不同的端口号,如下所示
配置代码
附件
train.py 参数解析表
Reference
https://github.com/ultralytics/yolov5/wiki/Train-Custom-Data
https://docs.ultralytics.com/quick-start/
其他人都在看
欢迎 Star、试用 OneFlow 最新版本:https://github.com/Oneflow-Inc/oneflow/
版权声明: 本文为 InfoQ 作者【OneFlow】的原创文章。
原文链接:【http://xie.infoq.cn/article/074f5501d51b843b9e39aabef】。文章转载请联系作者。
评论