文章目录
前言
本文面向深度学习的初学者,使用Liunx的同学可以自写CMakeLists使用。使用的模型结构为onnx,YOLOV7中的export.py自带了转换onnx的脚本。本文使用openvino加速cpu进行推理,适配了d6、e6、w6模型。
1.环境准备
- windows 10
- openvino 2022.1
- Visual Studio 2022
2.安装OpenVINO
2.1 官网下载安装包
此处是openvino 2022官网地址,找到其中的Windows下C++ Runtime安装包,解压后一路默认安装。为了方便大家,提供了下载链接,下载第一个zip。后期可能会失效。
2.2 Runtime文件
- bin 动态链接库
- include 头文件
- lib 动态库的导出声明(也可以叫静态链接库)
- 3rdparty 第三方库
安装完成后,相应安装路径会生成类似的文件目录。这里熟悉C++的朋友已经基本明白了,对于初学者,需要给大家解释一下这些文件的涵义。我们生成C++代码的时候需要引用Inlcude和lib,然后将bin中的dll复制到生成的程序路径下。
- 注意复制plugins.xml文件和3rdparty下的tbb_debug.dll或tbb.dll
- 还需要把include\ie也加入到引用目录
- 确认好自己的版本Debug或Release,目前只支持x64下编译代码
- 前期无法确认自己所需的DLL时,可把Debug或Release下所有文件都复制到程序根目录。
3.模型导入
不要加 --grid参数,会导致输出层变化,让openvino无法读取模型。end2end加了netron没看出效果。
- python export.py --img-size 1280 1280 --weights yolov7-e6.pt
4.C++部署代码
Github代码路径 :https://github.com/BeCoolMaker/yolov7_cpp_openvino_win
4.1 记录一下几个踩过的坑
- 意外重启程序,可能会导致plugins.xml丢失,导致模型无法加载。
- yolov5中增大image size时,需要增大相应的grid,猜测可能v7也需要
- 解析outputblob数据时,数组超限导致内存报错,一般是由于grid的设置有问题。
4.2 部署代码解读(查看github代码)
Step 1. 初始化
- 注意是否缺乏依赖项
Step 2. 读取模型
- 注意根目录下的plugins.xml是否存在,否则会报错
- 导入onnx时batch设置为1,暂未测试多batch方案
Step 3. 设置为cpu推理,获取模型输入输出
- GPU方案建议使用TensorRT,而非openvino
Step 4. 创建一个输入请求inference request
Step 5. 将Mat转换为openvino tensor
- letterbox 将图像缩放至模型所需尺寸,边界用灰色缝补
- openvino所需格式为归一化后的rgb图像
Step 6. 推理模型
Step 7. Process output
- w6的模型输出是4层{160, 80, 40, 20},v7的模型输出是3层{80, 40, 20}
Step 7.1 解析模型输出
# yolov7.onnx
output_tensor get_shape{1, 3, 80, 80, 85}
output_tensor get_shape{1, 3, 40, 40, 85}
output_tensor get_shape{1, 3, 20, 20, 85}
- 推理后的数据是一个一维数组,原始形状如上,我们的目标就是解析它
- yolov7.pt是用的coco数据集其中有80类,加上xywh,conf就是85,数据格式为[x,y,w,h,边框的confidence,80类的置信度得分]
Step 8. NMS
Step 9. 可视化
5.运行结果
6. 参考项目
- https://github.com/OpenVINO-dev-contest/YOLOv7_OpenVINO_cpp-python
- https://github.com/fb029ed/yolov5_cpp_openvino