torch-onnx-ncnn过程(yolov5)

torch-onnx-ncnn 以yolov5为例子

  • 安装ncnn
    • 如果需要用vscode进行代码调试
  • torch2onnx
    • 下载
    • 测试
    • 转换onnx
  • onnx2ncnn
    • 1.生成param和bin文件
    • 2.打开生成的.param文件,去除不支持的网络层。
    • 3.除去split 和crop 及concat层,一共十层,换成YoloV5Focus,总层数309变成300,如图所示。
    • 4.将Permute的前一层Reshape 中0=xxx 改成 0 = -1。修改结果如下:
    • 5. 用 ncnnoptimize 过一遍模型,顺便转为 fp16 存储减小模型体积
    • 6.修改param和bin位置(在path_to_ncnn/example/yolov5.cpp)
    • 7.修改相关输出层位置
    • 7.测试

安装ncnn

建议下载代码从gitee下载,速度会快很多
参考网站:https://yyingbiu.github.io/2019/08/21/linux-xia-bian-yi-an-zhuang-ncnn/
vulkansdk最好选择合适的下载

$ wget https://sdk.lunarg.com/sdk/download/1.1.92.1/linux/vulkansdk-linux-x86_64-1.1.92.1.tar.gz?Human=true -O vulkansdk-linux-x86_64-1.1.92.1.tar.gz
$ tar -xf vulkansdk-linux-x86_64-1.1.92.1.tar.gz
$ export VULKAN_SDK=`pwd`/1.1.92.1/x86_64

按cpp编译流程走

$ git clone https://github.com/Tencent/ncnn.git
$ cd 
$ mkdir -p build
$ cd build
$ cmake -DNCNN_VULKAN=OFF ..
$ make -j4

如果需要用vscode进行代码调试

在path_to_ncnn/CMakeList.txt中开头加入,后再编译

SET(CMAKE_BUILD_TYPE "Debug")
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")

vscode打开方程后,在lanch.json中的program改为yolov5的执行路径就可以用vscode调试程序
注意:yolov5需要输入image路径,arg也需要添加图片路径

torch2onnx

教程:https://blog.csdn.net/excelNo1/article/details/119246829
针对模型的输出位置做修改:https://blog.csdn.net/x_248369/article/details/116503218

下载

下载yolov5
git clone -b v5.0 https://github.com/ultralytics/yolov5
下载预训练权重
https://github.com/ultralytics/yolov5/releases/download/v5.0/yolov5s.pt
注意版本的选择(这里选择v5.0

测试

测试代码(前提把requirement.txt内的库下载)

python3 detect.py --source inference/images --weights yolov5s.pt --conf 0.25

转换onnx

python3 models/export.py --weights yolov5s.pt --img 640 --batch 1
python3 -m onnxsim yolov5s.onnx yolov5s-sim.onnx

onnx2ncnn

1.生成param和bin文件

cd path_to_ncnn/build/tools/onnx
./onnx2ncnn yolov5s-sim.onnx yolov5s.param yolov5s.bin

2.打开生成的.param文件,去除不支持的网络层。

torch-onnx-ncnn过程(yolov5)_第1张图片

3.除去split 和crop 及concat层,一共十层,换成YoloV5Focus,总层数309变成300,如图所示。

在这里插入图片描述
在这里插入图片描述

4.将Permute的前一层Reshape 中0=xxx 改成 0 = -1。修改结果如下:

torch-onnx-ncnn过程(yolov5)_第2张图片

5. 用 ncnnoptimize 过一遍模型,顺便转为 fp16 存储减小模型体积

cd path_to_ncnn/build/tools
./ncnnoptimize yolov5s.param yolov5s.bin yolov5s-opt.param yolov5s-opt.bin 65536

6.修改param和bin位置(在path_to_ncnn/example/yolov5.cpp)

torch-onnx-ncnn过程(yolov5)_第3张图片

7.修改相关输出层位置

这三个位置看是否和param文件下的最后Permute层的输出位置是否相同
torch-onnx-ncnn过程(yolov5)_第4张图片torch-onnx-ncnn过程(yolov5)_第5张图片torch-onnx-ncnn过程(yolov5)_第6张图片

7.测试

cd path_to_ncnn/build/example/
./yolov5 imagepath

参考:
1、https://yyingbiu.github.io/2019/08/21/linux-xia-bian-yi-an-zhuang-ncnn/
2、https://blog.csdn.net/excelNo1/article/details/119246829
3、https://blog.csdn.net/x_248369/article/details/116503218

你可能感兴趣的