目标检测 YOLOv5 转ncnn移动端部署
flyfish
ncnn的版本20210507
YOLOv5版本YOLOv5:v5
ncnn的编译
一 导出onnx
python models/export.py --weights yolov5s.pt --img 320 --batch 1
二 onnx-simplifer简化模型
python -m onnxsim yolov5s.onnx yolov5s-sim.onnx
三 转ncnn
./onnx2ncnn yolov5s-sim.onnx yolov5s.param yolov5s.bin
四 处理转ncnn产生的Unsupported slice step !
1 处理YOLOv5的Focus模块
目的变成
编辑 yolov5s.param文件
处理步骤如下
(1)红框内4行到13行删除
(2) 一共删除了10层,第二行的173更改为164,计算方法173-(10-1)=164
(3)增加自定义层
YoloV5Focus focus 1 1 images 159
159来自下图,找到删除的第13行
Foucs更改之后的结果是
2 支持动态尺寸输入
将reshape中的960,240,60更改为-1,或者其他 0=后面的数
五 ncnnoptimize优化
./ncnnoptimize yolov5s.param yolov5s.bin yolov5s-opt.param yolov5s-opt.bin 1
其中最后的flag 如果是0指的的是fp32,如果是1指的是fp16
六 C++代码处理
1 三个extract
ncnn-20210507/examples目录下的yolov5.cpp
我们仿照代码中output,781,801 进行更改
代码举例
代码更改依据以781,801 为例
我们自己的C++代码可以依据onnx文件更改三个输出
也可以根据ncnn的Permute的每一个output
分别是output,395,415
2 代码中Anchor
(1)可以依据模型在训练时的输出
(2)也可以依据yolov5/models/中的配置文件
以yolov5s.yaml为例
七 最后的运行
加载模型更改为自己的模型yolov5s-opt.param 和yolov5s-opt.bin
再次编译
ncnn-20210507/build$ make install
运行展示
ncnn-20210507/build/examples$ ./yolov5 1.jpg
Android运行参考 https://github.com/nihui/ncnn-android-yolov5