赞
踩
yolov5下载地址:https://github.com/ultralytics/yolov5
yolov5的模型训练参考:https://github.com/wudashuo/yolov5
.pt
格式文件转换成.onnx
格式文件参考:https://github.com/ultralytics/yolov5/issues/251
在yolov5主目录下运行以下命令:
python models/export.py --weights yolov5s.pt --img 640 --batch 1
出现以下图示情况说明.pt
格式文件转换成.onnx
格式文件成功,会看到在yolov5主目录下多了yolov5s.onnx
等文件
转换完成后可以使用Netron:https://github.com/lutzroeder/netron.git 进行可视化.对于陌生的模型,该可视化工具对模型结构的认识有很大的帮助。
首先需要安装OpenVINO,可以参考我的另外一篇博客:Ubuntu18安装OpenVINO https://blog.csdn.net/qq_40700822/article/details/115707156
安装完成后运行如下脚本实现.onnx
模型到.xml
和.bin
模型的转换。
python /opt/intel/openvino/deployment_tools/model_optimizer/mo_onnx.py --input_model yolov5.onnx --output_dir /home/inbc
如果执行完后可能会一直报错,并无法生成.xml
和.bin
模型:
需要修改yolov5 yolov5/models/export.py
文件中的opset_version
设置把12改为10,即:
torch.onnx.export(model, img, f, verbose=False, opset_version=10, input_names=['images'],
output_names=['classes', 'boxes'] if y is None else ['output'],
dynamic_axes={'images': {0: 'batch', 2: 'height', 3: 'width'}, # size(1,3,640,640)
'output': {0: 'batch', 2: 'y', 3: 'x'}} if opt.dynamic else None)
然后重新执行一下命令:
python models/export.py --weights yolov5s.pt --img 640 --batch 1
导出成功,就可以看到主目录下已经生成了yolov5.onnx
文件了。
然后在执行命令:
python /opt/intel/openvino/deployment_tools/model_optimizer/mo_onnx.py --input_model yolov5.onnx --output_dir /home/inbc
看到一下画面就说明.xml
和.bin
文件导出成功了。
运行成功之后会获得.xml
和.bin
文件,.xml
和.bin
是OpenVINO
中的模型存储方式。
获得了yolov5s.xml
和yolov5s.bin
就可以进行c++实现yolov5的OpenVINO部署了。
https://github.com/fb029ed/yolov5_cpp_openvino
先测试一下大佬的代码是否可用。
直接编译demo中的cpp文件即可:
cd demo
mkdir build
cd build
cmake ..
make
编译完成后就可以直接运行程序了:
./detect_test
出现一下图像说明环境搭建的还算比较成功:
.pt
模型转换为.onnx
模型,进而在转换为.xml
和.bin
再在demo中使用。我用yolov5训练好的模型文件名为last_1000.pt
。
模型转换过程见上文。
首先需要修改main.cpp
文件中的文件路径(大约在第6行,我这里使用的是last_1000.xml
):
#include "detector.h"
int main(int argc, char const *argv[])
{
Detector* detector = new Detector;
string xml_path = "../res/last_1000.xml";
detector->init(xml_path,0.1,0.5);
/*
更改测试图片的路径,大约在程序的第28行左右:
waitKey(1);
}
*/
Mat src = imread("../res/32.png");
Mat osrc = src.clone();
resize(osrc,osrc,Size(640,640));
vector<Detector::Object> detected_objects;
auto start = chrono::high_resolution_clock::now();
detector->process_frame(src,detected_objects);
这里需要修改测试对象的种类,需要修改第15行左右的item_size
为6,因为我的模型只训练了一个对象,所以是1+5=6
,item_size=n+5
其中n
为你模型训练的物品的种类。
const float *output_blob = blobMapped.as<float *>();
//80个类是85,一个类是6,n个类是n+5
//int item_size = 6;
int item_size = 6;
size_t anchor_n = 3;
for(int n=0;n<anchor_n;++n)
for(int i=0;i<net_grid;++i)
for(int j=0;j<net_grid;++j)
{
之后编译运行测试一下:
cd demo_02
mkdir build
cd build
cmake ..
make
编译成功后,生成了detect_test
文件,直接执行该文件:
./detect_test
耗时间use 0.219407 s
,(本人用的Vm的Ubuntu18虚拟机,分配了3个处理器)如果出现一下画面,那恭喜你!!就可以愉快的用C++使用yolov5的模型训练了。
接下来就可以在大佬的肩膀上仰望星空了( ̄▽ ̄)!
在main.cpp的第86行左右。
将
_network = ie.LoadNetwork(cnnNetwork, "CPU");
改为
_network = ie.LoadNetwork(cnnNetwork, "GPU");
这样
如果OpenVINO环境配置设置无误程序应该可以直接运行.
检测环境是否配置无误的方法是运行:
cd /opt/intel/openvino/deployment_tools/demo
./demo_security_barrier_camera.sh
若成功运行则cpu环境正常.
./demo_security_barrier_camera.sh -d GPU
运行正常则gpu环境运行正常.
在推理之外的数据预处理和解析中存在大量循环,这些循环都可以利用openmp进行并行优化.
模型优化如定点化为int8类型
在模型转换时通过设置参数可以实现模型的定点化.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。