ncnn调用yolov5常见问题
yolov5代码:https://github.com/ultralytics/yolov5
ncnn yolov5推理代码: https://github.com/Tencent/ncnn/blob/master/examples/yolov5.cpp
1. 导出训练好的模型为onnx格式
这里如果参照ncnn中yolov5前推的代码,
在导出onnx模型时需要加上--train,即去掉结果合并操作(models/yolo.py forward部分),直接输出三个分支结果,即不执行下图中红色框出代码
python export.py --weights ./runs/train/exp3/weights/best.pt --include onnx --train

2. onnx to ncnn
2.1 onnx2ncnn
利用ncnn库的./onnx2ncnn 工具进行转换
onnx2ncnn *.onnx *.param *.bin
转换时如果报以下错误提示 ,则利用onnxsim库先对onnx模型进行简化再转成ncnn
python -m onnxsim tooth.onnx tooth_sim.onnx
Shape not supported yet!
Gather not supported yet!
Unsupported unsqueeze axes !
Unknown data type 0
2.2 optimize
- ncnnoptimize
对ncnn模型中部分算子进行自动优化或者更改精度,ref: https://zhuanlan.zhihu.com/p/93017149
ncnnoptimize *.param *.bin new.param new.bin flag
其中flag为0指fp32, 为1指fp16
3.动态输入问题
如果推理结果密密麻麻布满整个图片,则有可能是动态输入尺寸造成的
如果图片是动态输入,则需要将导出的param文件进行修改,因为在最后 Reshape 层把输出grid数写死了
用Netron打开param文件,从中找到三个输出前的reshape操作,将6400 1600 400 都更改为-1即可


4、Shape/Gather not support yet

模型转为onnx格式时还有很多算子需要简化,可以借助onnx-simplifier
pip install onnx-simplifier
python -m onnxsim mobilenet.onnx mobilenet_sim.onnx
参考链接
https://zhuanlan.zhihu.com/p/275989233
https://zhuanlan.zhihu.com/p/93017149

浙公网安备 33010602011771号