最近项目需要yolov5做检测,用c++实现,在cpu上运行,所以想到一些部署方法:
1、u版yolov5训练好模型就是.pt文件转onnx,然后再转ncnn.
2、u版yolov5训练好模型就是.pt,使用libtorch进行inference.
3、使用opencv接口去做.opencv现在越来越强大.
之前用过ncnn,所以就选择了.pt->onnx->ncnn.老板要的比较急,所以最好的方法就是找开源,快速复现。第一步当然是要配置环境。当前环境是win10操作系统。需要的依赖是opencv,protobuf.于是开始进行相应的环境配置。我采用的是cmake实现的,没什么难度,具体就不说了。注意:protobuf编译的时候需要gmock,gmock是Google开源的一款测试工具。下载地址。版本为1.7.0,应该是最新版,我看有博客指出,需要注意版本匹配问题。我用的protobuf 是3.4.0,gmock是1.7.0 是ok的。ncnn 编译的时候注意依赖的路径配置好,详情参照上篇博客。
下载u版yolov5,以及自带的模型文件,这里注意,一定要看清版本。不同版本的yolov5模型有不同,比如激活函数哦。我使用的是yolov5-3.0。ncnn 是20210720版本的。
下载好模型,利用export 导出模型。
python export.py --weights yolov5s.pt
python -m onnxsim yolov5s.onnx yolov5s-sim.onnx
onnx2ncnn.exe yolov5-sim.onnx yolov5-sim.param yolov5-sim.bin
此时会出现:
Unsupported slices axes!
解决方法,修改yolov5s-sim.param。
1、替换成:
YoloV5Focus focus 1 1 images 215
2、input 上面那个数字192 ,计算方法=当前数字-(删除层数-1),删除层数指的是,被focus 替换的层数的个数。
3 Permute 前面的 改成0=-1
如果想要再继续减少参数量可以使用命令:
ncnnoptimize.exe yolov5-sim.param yolov5-sim.bin yolov5-opt.param yolov5-opt.bin 0
参数0 代表 fp32位, 1代表位16位。
生成的yolov5-sim.param yolov5-sim.bin yolov5-opt.param yolov5-opt.bin 都可以进行调用。
最关键的调用代码部分,nihui大神也已经写好了,在examples下自行阅读,测试。至此这种方法就已搞定,后两种方法有时间再进行总结对比。