在这篇文章中,将探讨并实现YOLO v4中的十种高级策略,帮助构建最佳的自定义数据集对象检测模型。注意,本文假设已经训练过YOLO v4。如果刚开始,可以查看YOLOv4训练指南。这里的高级策略将基于基本的训练流程进行构建。
收集更多数据
图像预处理和增强
图像输入分辨率大小
何时使用预训练权重
选择模型大小和架构
从之前的训练运行中恢复
训练后选择最佳模型
跟踪模型评估
导出模型
优化推理时间
提高对象检测模型的最佳方式是收集更具代表性的数据,YOLO v4也不例外。正如特斯拉AI高级总监Andrej Karpathy在解释特斯拉如何教汽车停止时所说:“数据集是活的,标注指令一直在变化。需要不断地策划和改变数据集。”
收集和标注更多数据是昂贵的。幸运的是,有几种方法可以通过增强来改善训练集的范围和大小。首先,可以直接在Roboflow中标注图像——这可以为节省时间——已经开发了标注图像的最佳实践。
YOLO v4训练管道会自动进行增强(参见这篇文章关于YOLO v4中的数据增强),但可能需要考虑在Roboflow中添加额外的增强。
图像预处理也是另一个重要步骤,以确保图像具有正确的图像分辨率大小,并且已经标准化了诸如类别本体、灰度和对比度等要素。最重要的预处理决策是图像输入分辨率。
输入分辨率决定了将传递给模型学习的像素数量。较大的像素分辨率可以提高准确性,但会牺牲训练和推理时间。较大的像素分辨率可以帮助模型检测到小物体。
YOLO模型的像素分辨率必须是32的倍数。选择的标准分辨率大小是416x416。如果在Roboflow中管理数据集,可以在调整预处理步骤中选择数据集输入分辨率大小。
在Roboflow中调整图像大小。重要的是:为了确保输入分辨率大小流经YOLOv4模型,必须调整模型配置文件。在cfg文件夹中,指定模型配置的地方,改变这里的宽度和高度。
[net]
batch=64
subdivisions=8
# Training
#width=512
#height=512
width=608
height=608
channels=3
momentum=0.949
decay=0.0005
angle=0
saturation = 1.5
exposure = 1.5
hue=.1
要开始在YOLOv4上训练,通常下载预训练的权重,并在训练期间从这个预训练的检查点开始:
!wget https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v3_optimal/yolov4.conv.137
!./darknet detector train data/obj.data cfg/custom-yolov4-detector.cfg yolov4.conv.137 -dont_show -map
这些权重已经在COCO数据集上进行了预训练,包括人、自行车和汽车等常见物体。通常,从预训练的权重开始是一个好主意,特别是如果认为物体与COCO中的对象相似。
然而,如果任务比COCO(空中、文档等)明显困难,可能需要从头开始训练。
!./darknet detector train data/obj.data cfg/custom-yolov4-detector.cfg -dont_show -map
当然,总是有优势去尝试两者,并从经验上看看什么对模型最有效。
YOLOv4有两种版本:YOLOv4和YOLOv4-tiny。如果最终目标是推理速度,较小的模型可能更有趣。并且通过改进数据集,可能可以弥补精度的下降。
从YOLOv4切换到YOLOv4-tiny是一个模型配置的问题。可以实验中间配置来构建自定义的YOLO模型。为此,请查看cfg文件夹,并尝试更改网络架构和层。需要考虑的一件事可能是实现自定义锚定框,如果对象形状与COCO数据集大不相同。这是一个非常高级的策略!
[yolo]
mask = 0,1,2
anchors = 12, 16, 19, 36, 40, 28, 36, 75, 76, 55, 72, 146, 142, 110, 192, 243, 459, 401
classes=80
num=9
jitter=.3
ignore_thresh = .7
truth_thresh = 1
scale_x_y = 1.2
iou_thresh=0.213
cls_normalizer=1.0
iou_normalizer=0.07
iou_loss=ciou
nms_kind=greedynms
beta_nms=0.6
max_delta=5
在Darknet框架中训练YOLOv4模型可能需要一段时间。定期保存模型是很重要的。总是可以通过使用先前训练运行的权重来恢复训练:
!./darknet detector train data/obj.data cfg/custom-yolov4-detector.cfg [YOUR WEIGHTS HERE] -dont_show -map
确保权重是用相同的配置文件训练的,并在相同版本的Darknet框架下训练!就像预训练的权重一样,可以从先前的训练运行中恢复,并应用模型从其他数据集到新数据集的学习。
Darknet模型权重保存在backup文件夹中,并自动保存每1000次迭代。Darknet将自动为保存最佳模型,扩展名为_best.weights。这基于验证集上的表现。
Darknet还会保存训练运行的最后权重,扩展名为_last.weights。
当在数据集和YOLOv4建模中进行各种调整时,跟踪结果可能很有用,这样就可以看到哪种技术的组合对数据集最有效。
Darknet会输出一个平均精度均值分数,这是决定哪个模型在数据上工作得最好的主要指标。另一个需要考虑的重要指标是推理速度。
一旦有了训练好的模型,它将处于Darknet的.weights格式。可能会想将其转换为新格式以进行部署。
YOLOv4 Darknet模型转换指南:
YOLOv4 TFLite用于移动部署
YOLOv4 OpenVino和OAK部署
YOLOv4 Tensorflow Repo
加快模型推理时间的主要方式是使用较小的模型,如YOLOv4-tiny。通过硬件选择,如GPU或使用Intel VPU上的OpenVino进行推理,还可以进一步提高推理时间。对于GPU推理,建议使用YOLOv4 TensorRT框架进行部署。
恭喜!现在有十种新的高级策略,可以充分利用YOLO v4为自定义数据集创建对象检测器。
想查看最新的PyTorch中的YOLOv4吗?查看Scaled-YOLOv4。