yolov5-5.0转换ncnn在安卓上应用
本文的编译应用环境及用到的编译工具为Win10、pycharm、VS2015、Android Studio.
1、NCNN编译
腾讯官方的介绍:ncnn 是一个为手机端极致优化的高性能神经网络前向计算框架。ncnn 从设计之初深刻考虑手机端的部署和使用。无第三方依赖,跨平台,手机端 cpu 的速度快于目前所有已知的开源框架。基于 ncnn,开发者能够将深度学习算法轻松移植到手机端高效执行,开发出人工智能 APP,将 AI 带到你的指尖。ncnn 目前已在腾讯多款应用中使用,如 QQ,Qzone,微信,天天P图等。
1、protobuf编译
下载protobuf :https://github.com/google/protobuf/archive/v3.4.0.zip
下载完后解压,然后打开VS2015 X64本机工具命令提示符:
进入protobuf文件夹,建立build文件夹
cd build
cmake -G"NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=%cd%/install ^
-Dprotobuf_BUILD_TESTS=OFF ^
-Dprotobuf_MSVC_STATIC_RUNTIME=OFF ../cmake
nmake
nmake install
2、编译ncnn
下载ncnn源码:https://github.com/Tencent/ncnn/releases
在cmake-gui中编译
将编译好的protobuf 库路径添加到“Protobuf_SRC_ROOT_FOLDER”
打开VS 编译ALL BUILD
生成的应用如下:
至此,NCNN编译成功。
2、pt转onnx
提前训练好Yolov5-5.0的模型,我选用yolov5s训练自己的监测模型。利用自带的export.py导出onnx文件。
python .\models\export.py --weights .\runs\train\exp\weights\best.pt
生成best.onnx文件,再利用onnxsim简化模型文件。
python -m onnxsim .\runs\train\exp\weights\best.onnx .\runs\train\exp\weights\best-sim.onnx
3、onnx转ncnn
利用编译生成的ncnn工具onnx2ncnn.exe转换.param和.bin文件
onnx2ncnn.exe best-sim.onnx
但是报异常。
这是由于focus模块转换的报错。
参考nihui大神的解决方式 详细记录u版YOLOv5目标检测ncnn实现
继续修改,也就是三个permute上紧挨着的reshape行红色矩形框要改为-1,这样就支持动态尺寸推理了。
在使用ncnnoptimize.exe进行优化,
ncnnoptimize.exe ncnn.param ncnn.bin ncnn-opt.param ncnn-opt.bin 1
其中0 表示fp32,1表示fp16,转换fp16后bin文件减小一半。
至此,ncnn文件已经转换完成。
4、安卓端部署
1)下载ncnn-yolov5-android源码
下载地址:ncnn-android-yolov5
(2)下载ncnn-android-vulkan包
下载地址: ncnn-releasesncnn-randroid-vulkan.
选择ncnn-xxx-android-vulkan.zip下载,xxx为对应的ncnn版本日期。
将ncnn-xxx-android-vulkan.zip解压到ncnn-yolov5-android的app\src\main\jni路径下
在AS中打开,配置好NDK版本后,编译运行。
很幸运也很顺利。
速度也是杠杠的。
部署成功!!!
5、问题及解决
1、yolov5-6.0的模型转换,pt转onnx时,参数中加入 --train 去掉后处理阶段。
2、如果不修改.param文件中的三个reshape 红框的值为-1,将会出现很多很多目标检测框!
3、修改yolov5ncnn_jni.cpp中多尺度检测结果提取网络的层数与.param文件中的permute对应的层数。
4、开启GPU后,加载bin文件慢。将opt.use_vulkan_compute置为false,即可解决。
写在最后,多参考知乎nihui大神的杰作,绝对有帮助!https://www.zhihu.com/people/nihui-2