yolov5学习|yolov5通过ncnn在安卓平台部署

yolov5通过ncnn在安卓平台部署 目录 1.ncnn与yolov5的关系 2.ncnn模型转换 3.ncnn安卓环境部署 4.修改ncnn-android-yolov5源码 5.运行效果 -------------------------------------- 1.ncnn与yolov5的关系
NCNN官方的定义:NCNN是腾讯公司开源的一个专为手机端极致优化的高性能神经网络前向计算框架。NCNN从设计之初,就深刻考虑手机端的部署和使用,无需第三方依赖,跨平台,手机端CPU的速度快于目前所有已知的开源框架。基于NCNN,开发者能够将深度学习算法轻松移植到手机端高效执行,开发出人工智能APP,将AI带到你的指尖。
目前NCNN已经支持大部分的CNN网络,包括本文中用到的YOLOv5,如下图是YOLOv5 for Android与YOLOv5,ONNX,NCNN的关系。
yolov5学习|yolov5通过ncnn在安卓平台部署
文章图片

2.ncnn模型转换
首先安装相关库

pip install onnx coremltools onnx-simplifier

(1)用/yolov5/module/export.py生成onnx文件
在yolov5文件中cmd进入命令行输入以下语句转换模型(–weights为需要转换权重文件位置和名字)
python models/export.py --weights yolov5s.pt

执行这句之后,会在权重文件相同文件夹下生成yolov5s.onnx、yolov5s.mlmodel和yolov5s.torchscript.pt三种文件。
(2)简化onnx文件
python -m onnxsim yolov5s.onnx yolov5s-sim.onnx

执行之后将yolov5s.onnx文件简化成yolov5s-sim.onnx文件
(3)通过onnxsim文件生成bin和param文件
①准备基础安装环境
sudo apt install build-essential libopencv-dev cmake

【yolov5学习|yolov5通过ncnn在安卓平台部署】如果报错就更换镜像源,比如你是Ubuntu20,就搜ubuntu20镜像源更换。
②编译安装protobuf依赖库
下载protobuf源码放到ubuntu然后编译
下载地址:protobuf-master.
cd protobuf-master ./autogen.sh ./configure make sudo make install sudo ldconfig

然后通过下面语句查看protoc是否安装成功
protoc --version

③保证protoc安装成功后,接着编译安装ncnn
下载ncnn源文件放进ubuntu然后编译
下载地址:ncnn-master.
cd ncnn-master mkdir build cd build cmake .. make sudo make install

④make成功之后在ncnn-master/build/tools/onnx/onnx2ncnn的可执行文件
⑤最后在ncnn-master/build/tools/onnx下打开终端输入下面语句
./onnx2ncnn yolov5s-sim.onnx yolov5s.param yolov5s.bin

执行之后得到yolov5s.param和yolov5s.bin文件就转换成功了
3.ncnn安卓环境部署
(1)下载ncnn-yolov5-android源码
下载地址:ncnn-android-yolov5.
(2)下载ncnn-android-vulkan包
下载地址: ncnn-releases.
选择ncnn-20210525-android-vulkan.zip下载 yolov5学习|yolov5通过ncnn在安卓平台部署
文章图片

(3)将下载好的ncnn-20210525-android-vulkan.zip解压后放在放在ncnn/cpp下
yolov5学习|yolov5通过ncnn在安卓平台部署
文章图片

(4)将CMakeLists.txt图中蓝色部分路径名改成与包名一样
yolov5学习|yolov5通过ncnn在安卓平台部署
文章图片

改好之后可以运行试试,应用的模型是yolov5s,如果想要应用自己训练的模型请继续操作。
4.修改ncnn-android-yolov5源码
(1)将文章开头ncnn模型转换生成的bin和param文件导入assets(名字要一样)
yolov5学习|yolov5通过ncnn在安卓平台部署
文章图片

(2)修改.cpp文件
①把yolov5ncnn_jni.cpp文件的class_names改成自己数据集的
yolov5学习|yolov5通过ncnn在安卓平台部署
文章图片

②也是修改yolov5ncnn_jni.cpp文件改16,32步长参数(这个根据自己yolov5s.param文件的参数修改)
yolov5学习|yolov5通过ncnn在安卓平台部署
文章图片

yolov5学习|yolov5通过ncnn在安卓平台部署
文章图片

③改conf0.85(可选)
也是yolov5ncnn_jni.cpp文件的代码,这个代表置信度大于等于0.85才会显示
yolov5学习|yolov5通过ncnn在安卓平台部署
文章图片

(3)修改param文件
①第二行第一个参数(比如图中的186)减9改成(186-9=177)
这个根据自己param文件参数修改,不同模型参数也是不一样的
yolov5学习|yolov5通过ncnn在安卓平台部署
文章图片

②前10行删去,加一行yolov5foucs在第一行foxus 1 1 images 还有个数字等于下一行的第二个参数,如图
YoloV5Focusfocus1 1 images 159

修改器前yolov5学习|yolov5通过ncnn在安卓平台部署
文章图片

修改后
yolov5学习|yolov5通过ncnn在安卓平台部署
文章图片

④支持动态尺寸输入,将reshape中的960,240,60更改为-1
yolov5学习|yolov5通过ncnn在安卓平台部署
文章图片

5.运行效果
修改完成后就可以运行在手机或者模拟器上,如下图所示
yolov5学习|yolov5通过ncnn在安卓平台部署
文章图片

yolov5学习|yolov5通过ncnn在安卓平台部署
文章图片

常见问题补充:
①安卓中文路径问题:使用英文路径
②gradle版本问题:修改build.gradle、gradle-wrapper.properties

    推荐阅读