[个人技术博客] YOLOv5 模型训练,并移植至 OpenCV,若干注意事项

制作数据集

Train Custom Data - YOLOv5 Documentation

手动标记数据的时候,注意方框要与目标物体边缘相切。

模仿COCO128 的实例即可,此处没有太多需要注意的地方。(除了 Windows 路径要使用双反斜杠 \\ )

训练

# 官方文档使用的命令
# Train YOLOv5s on COCO128 for 5 epochs
python train.py --img 640 --batch 16 --epochs 5 --data coco128.yaml --weights yolov5s.pt

实际上,5 epoch 不足以训练出可靠的模型。由如下图表可知:epoch 7 以后,metrics/precision 才超过 0.8。

笔者建议训练至少 16 epoch。[个人技术博客] YOLOv5 模型训练,并移植至 OpenCV,若干注意事项_第1张图片

另外,同时只训练一个模型时,batch_size 建议让 PyTorch 自行决定。最终建议命令如下:

python train.py --img 640 --batch -1 --epochs 16 --data coco128.yaml --weights yolov5s.pt

导出为 OpenCV ONNX 模型

https://docs.ultralytics.com/tutorials/torchscript-onnx-coreml-export/

通常情况下建议导出 best.pt。

在 Python cv2 中使用

笔者参考了下方卡片的实现。这个实现会捕获视频流并截取画面。

doleron/yolov5-opencv-cpp-pythonicon-default.png?t=M5H6https://github.com/doleron/yolov5-opencv-cpp-python/笔者自己的实现可以参考此处。这个实现直接接受传入图片。

recognizer/bicycle_counter.py · dev-recognizericon-default.png?t=M5H6https://gitcode.net/SoftwareEngineering2022ClassF/STOP/systemanddatabasedesignteam3/-/blob/dev-recognizer/recognizer/bicycle_counter.py

此处需要注意:

  • 如果输入网络的图片被裁剪/缩放,那么输出识别结果的时候要注意坐标转换。
  • NMS_THRESHOLD 不宜过高或过低。过高将导致单个目标被检测多次,太低会导致相邻目标在检测时被合并。

[个人技术博客] YOLOv5 模型训练,并移植至 OpenCV,若干注意事项_第2张图片

NMS Threshold 过高,导致相邻目标被合并。

[个人技术博客] YOLOv5 模型训练,并移植至 OpenCV,若干注意事项_第3张图片

 降低 NMS Threshold,问题解决。

 

你可能感兴趣的:(python,计算机视觉,pytorch)