基于 YOLOv5 和 OpenCV DNN 的目标检测

最近更新于 2024-05-05 14:19

本文资源文件下载:https://pan.baidu.com/s/1m2ibm5RFV9O9nu6xg5egbg?pwd=j2mq

方式一:OpenCV DNN + YOLOv5 预训练模型

模型文件下载及转换

这里采用的 YOLOv5 版本为 6.1

下载模型文件:https://github.com/ultralytics/yolov5/releases/tag/v6.1

使用大小为 640 的模型,根据表格数据可知,速度:n>s>m>l>x,精确度:n<s<m<l<x,具体模型选择就要看自己计算机算力了。

获取 YOLOv5 源码

git clone https://github.com/ultralytics/yolov5.git --depth=1 --branch=v6.1

安装 YOLOv5 依赖环境

pip3 install -r yolov5/requirements.txt

提供的模型文件格式为 YOLOv5 格式,OpenCV DNN 模块无法使用,这里需要转换为 ONNX 格式,我把下载的 .pt 模型文件放到了 models 文件夹下

python3 yolov5/export.py --weights models/yolov5n.pt --include onnx
python3 yolov5/export.py --weights models/yolov5s.pt --include onnx
python3 yolov5/export.py --weights models/yolov5m.pt --include onnx
python3 yolov5/export.py --weights models/yolov5l.pt --include onnx
python3 yolov5/export.py --weights models/yolov5x.pt --include onnx

转换完成得到 ONNX 文件,生成的文件是在当前运行路径下的,然后将这些文件拷贝到 models 目录下

这些预训练模型训练使用的数据集为 coco,其中包括了 80 中物体类型,具体可查看 coco.names。

目标检测程序运行

测试环境使用的是 Docker 镜像blog.iyatt.com-ubuntu_20.04-cuda_11.3.0-cuDNN_8.2.1-opencv_contrib_4.5.5-gnu_9.4.0-python_3.10.4.tar

在 jupyer 中运行目标检测.ipynb笔记本,即可通过摄像头预览并识别物体

在使用 n 模型时,CPU 计算帧率不超过 4 帧(Inter i5 8265U)

n 模型使用 GPU 加速时,虽然我轻薄本的 GPU 很垃圾,但是比起纯 CPU,帧率还是可以翻一倍(NVIDIA GeForce MX230)

上面测试使用的都是 n 模型(速度最快,准确度最差),然后我再尝试一下 x 模型(速度最慢,准确度最高),帧率就很惨了,但是确实准确度高了,前一个都没有把那些书识别出来,这个却可以识别出来。

但是 GPU 基本上满载了,风扇狂转。

对于算力不是很强的计算机设备,一般建议使用 s 模型,相比于 n 模型,计算量的提升相对于准确度的提升还是比较值得的。如果是像树梅派、Jetson Nano这些小型计算机板的话,那就建议 n 模型了,算力毕竟太有限,我在树莓派4B 4G上试了一下,帧率为 1。

方式二:YOLOv5

这里是后期补的,因为我发现直接使用 YOLOv5 比转换模型后使用 OpenCV 速度快不少,当然配置环境就要再多安装一个 PyTorch。

我测试使用的 PyTorch 版本为 1.11.0,YOLOv5 版本 6.1,很可能会遇到报错 AttributeError: ‘Upsample’ object has no attribute ‘recompute_scale_factor’,解决方案:https://blog.iyatt.com/?p=6422

代码文件为 目标检测yolov5.ipynb,下面测试都是使用的 n 模型

CPU(Inter i5 8265U)

GPU (GeForce MX230)

Jetson Nano

基于 YOLOv5 和 OpenCV DNN 的目标检测
Scroll to top