目标:ubuntu20.04 配置NCNN 环境,将yolov5 模型通过ncnn部署实现
1 下载源码
下载 yolov5 6.2的版本 For yolov5 v6.2, download .pt from yolov5 release v6.2, git clone -b v6.2 GitHub - ultralytics/yolov5: YOLOv5 🚀 in PyTorch > ONNX > CoreML > TFLite
下载 ncnn git clone GitHub - Tencent/ncnn: ncnn is a high-performance neural network inference framework optimized for the mobile platform
安装相关依赖项
sudo apt install build-essential git cmake libprotobuf-dev protobuf-compiler libvulkan-dev vulkan-utils libopencv-dev
编译
cd ncnn/
mkdir -p build
cmake ..
make
2 模型转换
通过yolov5 export.py 生成 onnx
python export.py --weights yolov5s.py --img 640 --batch 1
python -m onnxsim yolov5s.onnx yolov5s-smi.onnx
通过ncnn编译生成的工具onnx2ncnn 生成 .param 和 .bin
./onnx2ncnn /home/ubuntu/yolov5/yolov5s-smi.onnx /home/ubuntu/yolov5/models/yolov5s_6.2.param /home/ubuntu/yolov5/models/yolov5s_6.2.bin
这里最好以yolov5s_6.2.param 和 yolov5s_6.2.bin命名,因为官方给的examples里面的yolov5 按6.2 ,6.0做了划分,并且指定了文件名称。
可以通过Netron 打开.param 查看相应的输入输出
编译 examples 通过yolov5 测试 转换是否成功
cd ncnn/build/examples
./yolov5 [处理文件路径]
问题
Q1: 执行./yolov5 [处理文件路径] 会报以下错误 ncnn Segmentation fault
通过gdb 追查提示错误出现在program terminated with dignal SIGSEGV, segmentation fault . in ncnn::NetPrivate::do_forward_layer
A1:参考ncnn 中yolov5 前推的代码,需要在export.py 导出模型的时候加上--train,去掉分支结果合并操作
python export.py --weights yolov5s.py --img 640 --batch 1 --train
Q2: 如果推理结果布满整个图片,如下图所示,则有可能是动态输入尺寸造成的
A2: 参考详细记录u版YOLOv5目标检测ncnn实现 - 知乎 需要对输出层进行优化。
Q3:在模型转换好后,通过./yolov5 执行推理的时候,出现以下错误 find_blob_index_by_name 401 failed
打开examples,打开yolov5.cpp ,修改以下部分代码