YOLOv5 在最新 OpenVINO 2021R02 版本的部署与代码演示详解

YOLOv5 在 OpenVINO 上的部署,网上有很多 python 版本的代码,但是基本都有个很内伤的问题,就是还在用 pytorch 的一些库做解析,C++的代码有个更大的内伤就是自定义解析解释的不是很清楚,所以本人阅读 YOLOv5 的 pytorch 代码推理部分,从原始的三个输出层解析实现了 boxes, classes, nms 等关键 C++ 代码输出,实现了纯 OpenVINO+OpenCV 版本的 YOLOv5s 模型推理的代码演示。下面就是详细的系统环境与各个部分解释,以及代码实现与演示图像。

系统版本信息与依赖

Window 10 64bit

Pytorch1.7+CUDA10.0

Python3.8.5

VS2015

OpenVINO_2021.2.185

01

YOLOv5 下载与测试运行

YOLOv5 是第二个非官方的 YOLO 对象检测版本,也是第一个 Pytorch 实现的 YOLO 对象检测版本。Github 地址如下:

https://github.com/ultralytic...

需要克隆到本地

git clone https://github.com/ultralytic...

然后运行

pip install -r requirements.txt

安装所有依赖。

最后运行一段视频或者图像完成测试

python detect.py --source D:imagesvideoSungEun.avi --weights yolov5s.pt --conf 0.25

02

模型转换

模型转换主要是把原始的 YOLOv5 的 pytorch 模型文件转换为通用的开放模型格式 ONNX 与 OpenVIN 特有的文件格式IR(.xml与.bin)。

OpenVINO 从 2020R02 以后版本开始支持直接读取 ONNX 格式文件,所以我们既可以通过脚本直接导出 onnx 格式文件,直接给 OpenVINO 调用,也远程桌面可以对得到 ONNX 文件通过 OpenVINO 的模型转换脚本做进一步转换生成IR中间格式(.bin文件与.xml文件)。

导出ONNX格式文件的脚本

Pytorch 的 YOLOv5 项目本身已经提供了转换脚本,命令行运行方式如下:

export at 640x640 with batch size 1python models/export.py --weights yolov5s.pt --img 640 --batch 1

然后循环每个输出层,解析每个特征点对应的3个框与相关数据。由于在导出的时候 ONNX 格式文件时模型的推理得到的三个输出层原始结果,所以还需要对每个数据先完成 sigmoid 归一化,然后再计算相关值,这部分的代码实现我参考了项目中的 yolo.py 中的 Detection 部分,得到初始每个对象的检测框之后,采用 OpenVINO 中自带非最大抑制函数,完成非最大抑制,就得到了最终的预测框,然后绘制显示。

你可能感兴趣的:(程序员)