Ubuntu18 yolov5使用ncnn部署

本文详细介绍了如何将YOLOv5的.pt模型转换成适用于NCNN的.onnx模型,并进行ncnn的编译、模型优化及C++代码实现。过程中涉及onnx2ncnn的转换、ncnnoptimize优化以及C++代码的修改以适应模型输入输出。此外,还解决了转换过程中遇到的ncnn不支持focus层的问题,通过手动修改.param文件完成转换。
摘要由CSDN通过智能技术生成

准备工作

  • yolov5 v5.0:
git clone https://github.com/ultralytics/yolov5.git
git checkout v5.0
  • ncnn源码
git clone https://github.com/Tencent/ncnn.git
cd ncnn
git submodule update --init
  • 安装依赖
sudo apt install build-essential git cmake libprotobuf-dev protobuf-compiler libvulkan-dev vulkan-utils libopencv-dev
  • 安装vulkan_sdk(作者下载的是vulkansdk-linux-x86_64-1.2.148.1.tar.gz)
# https://vulkan.lunarg.com/sdk/home
wget https://sdk.lunarg.com/sdk/download/1.2.154.0/linux/vulkansdk-linux-x86_64-1.2.154.0.tar.gz?Human=true -O vulkansdk-linux-x86_64-1.2.154.0.tar.gz
tar -xf vulkansdk-linux-x86_64-1.2.154.0.tar.gz
export VULKAN_SDK=$(pwd)/1.2.154.0/x86_64
sudo apt install mesa-vulkan-drivers
  • 安装protobuf3.1.0(坑最多)
wget https://github.com/google/protobuf/archive/v3.1.0.tar.gz
tar xvzf protobuf-3.1.0.tar.gz
./autogen.sh
./configure  --prefix=/usr/local/protobuf
sudo make
sudo make check
sudo make install
sudo ldconfig

编译ncnn

cd ncnn
mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=Release -DNCNN_VULKAN=ON -DNCNN_SYSTEM_GLSLANG=ON -DNCNN_BUILD_EXAMPLES=ON ..
make -j$(nproc)

此时如果报错

tools/caffe/CMakeFiles/caffe2ncnn.dir/build.make:70: recipe for target 'tools/caffe/CMakeFiles/caffe2ncnn.dir/caffe2ncnn.cpp.o' failed
make[2]: *** [tools/caffe/CMakeFiles/caffe2ncnn.dir/caffe2ncnn.cpp.o] Error 1
CMakeFiles/Makefile2:203: recipe for target 'tools/caffe/CMakeFiles/caffe2ncnn.dir/all' failed
make[1]: *** [tools/caffe/CMakeFiles/caffe2ncnn.dir/all] Error 2
Makefile:127: recipe for target 'all' failed
make: *** [all] Error 2

解决方案:

在ncnn/cmakelist.txt中加一句add_definitions(-std=c++11)

.pt文件转.onnx文件

将yolov5从torch框架转到ncnn上前需要用onnx工具先将.pt模型文件转化为.onnx文件,这里主要有两个中的步骤

# pip install onnx
# pip install onnx-simplifier
python models/export.py --weights yolov5s.pt --img 640 --batch 1    #将.pt文件用onnx转化为.onnx文件
python -m onnxsim yolov5s.onnx yolov5s-sim.onnx   #onnxsim 精简模型

onnx2ncnn(有坑)

在yolov5的环境下执行,./onnx2ncnn 在build/tools/onnx/下

./onnx2ncnn yolov5s-sim.onnx yolov5s.param yolov5s.bin #这里yolov5s-sim.onnx为“.pt文件转.onnx文件”生成的文件,输出yolov5s.param yolov5s.bin

这里会出现以下问题,这是由于ncnn不支持focus,这是focus模块转换的报错,我们需要手动修改生成的.param文件的参数。
在这里插入图片描述
可以用vim或者其他文本编辑器打开.param文件,该文件主要修改两个大的地方,如图所示:
在这里插入图片描述
修改之后
在这里插入图片描述
这里主要是删除了不支持的层,并在ncnn中实现focus,删除10层 添加一层 减少了9层
添加的一层的输出可以根据下一层的输入填写,图中已标红,这里176的计算方法为原始层数185-10+1(添加的Yolov5Focus层),167是下一个卷积层的输入。
主要完成下面的转化:
在这里插入图片描述
在这里插入图片描述
第二处 修改网络输出的shape,例如原图:
在这里插入图片描述
第二处修改后:
在这里插入图片描述
这里输出全部改为-1(修改位置为绿色框选的部分),否则回归会出来一堆bounding box,同时记住红色框出的字段,该字段为网络输出的name,在预测代码中,会根据该字段去结果,所以不同的网络需要修改此处。

ncnnoptimize优化

./ncnnoptimize yolov5s.param yolov5s.bin yolov5s-opt.param yolov5s-opt.bin 1

其中最后的flag 如果是0指的的是fp32,如果是1指的是fp16

C++代码处理

路径:ncnn/examples/yolov5.cpp
这里主要修改网络的输入和输出,输入为模型训练时image 的size,输出层name为第四步中红色框出的字段。
在这里插入图片描述
在这里插入图片描述

测试

加载模型更改为自己的模型yolov5s-opt.param 和yolov5s-opt.bin
在这里插入图片描述
再次编译和运行展示

cd build
sudo make install
cd examples
./yolov5 example.jpg
  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
根据引用内容和,yolov5lite ncnn是一个基于ncnn框架实现的轻量级目标检测模型。在使用yolov5lite ncnn之前,需要将模型转化为ncnn模型。首先,需要将onnx模型转化为ncnn模型,可以使用命令"./onnx2ncnn yolov5ss-sim.onnx yolov5-lite.param yolov5-lite.bin"来进行转化。接着,可以使用命令"./ncnnoptimize yolov5-lite.param yolov5-lite.bin yolov5-lite-opt.param yolov5-lite-opt.bin 65536"对模型进行优化。然后,可以使用命令"./ncnn2table yolov5-lite-opt.param yolov5-lite-opt.bin imagelist.txt yolov5-lite.table mean=[104,117,123 norm=[0.017,0.017,0.017 shape=[640,640,3 pixel=BGR thread=8 method=kl"将模型转换为table格式。最后,可以使用命令"./ncnn2int8 yolov5-lite-opt.param yolov5-lite-opt.bin yolov5-ite-opt-int8.param yolov5-lite-opt-int8.bin yolov5-lite.table"将模型转换为int8格式。 关于yolov5lite ncnn的编译和安装,可以参考引用内容中提到的在Linux环境下的教程进行操作。其中,需要进行onnx模型的提取和转换。可以使用命令"python models/export.py --weights weights/yolov5-lite.pt --img 640 --batch 1"来提取模型,并使用命令"python -m onnxsim weights/yolov5-lite.onnx weights/yolov5-lite-sim.onnx"来进行简化和优化。 总结起来,yolov5lite ncnn是一个基于ncnn框架的目标检测模型,需要将模型转化为ncnn模型,并进行优化和转换为table和int8格式。关于编译和安装,可以参考在Linux环境下的教程进行操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [YOLOv5-Lite:NCNN+Int8部署和量化,树莓派也可实时](https://blog.csdn.net/weixin_45829462/article/details/119787840)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值