ncnn 是腾讯公司开源的一个专为手机端极致优化的高性能神经网络前向计算框架。 ncnn 从设计之初,就深刻考虑手机端的部署和使用,无需第三方依赖,跨平台,手机端 cpu 的速度快于目前所有已知的开源框架。基于 ncnn ,开发者能够将深度学习算法轻松移植到手机端高效执行,开发出人工智能 APP ,将 AI 带到你的指尖。

ncnn部署yolov5的整体步骤可以分为如下:

  1. 训练.pt,把.pt模型转为.onnx模型
  2. 把.onnx模型转换为ncnn模型(.bin和.param)
  3. Android Studio编译工程成.apk

注意整个流程的版本要求很严格,如果对于ncnn不熟的话,会踩很多坑,本人用yolov5(v6.0)版本的yolov5s.pt模型实验成功。简单列举下我的环境:

  • python==3.6
  • torch==1.10.0+cu111
  • onnx==1.7.0
  • onnx-simplifier==0.4.10
  • onnxruntime==1.10.0

一、转换.pt到.onnx

github上下载yolov5的6.0版本,下载yolov5s.pt预训练文件,然后调用export.py进行模型转换

python export.py --weights yolov5s.pt --include onnx --img 640 --train --simplify

--include用来指明转换为什么格式的模型

--train是为了去除后处理,即不直接输出一个分类结果output,而是将三个特征图作为输出

--simplify是简化模型,这里一步完成,不再需要onnxsim进行单独简化。

二、转换onnx到ncnn

ncnn格式的模型包含两个文件,分别是.bin和.param。这里的转换模型可以编译ncnn生成转换工具进行转换,当然,简单粗暴的,我们也可以用现成的工具。

一键转换 Caffe, ONNX, TensorFlow 到 NCNN, MNN, Tengine

转换成功后,把生成的yolov5s-sim-opt.bin和yolov5s-sim-opt.param下载下来即可。这两个文件后续要放在ncnn的AS工程里。

三、Android Studio编译yolov5生成.apk

在github上下载工程

https://github.com/nihui/ncnn-android-yolov5

然后把此工程用Android Studio打开。注意下载AS时,可以不下载JDK,使用AS自带的JDK就行,然后下载必要的SDK后就可以进行开发了。具体AS下载过程这里不再赘述。

然后来到ncnn的版本发布页,下载编译好的包 Releases · Tencent/ncnn · GitHub


Android yolo 程序 怎么在安卓手机上部署yolov5_python

下载好后提取到 app/src/main/jni里。

然后把yolov5s-sim-opt.bin和yolov5s-sim-opt.param放在文件夹ncnn-andorid-yolov5/app/src/main/assets里。

此时文件基本准备好了,但需要修改几个地方:

3.1. CMakeLists.txt修改

这个文件定义了工程的名字,编译规则等信息。主要注意下ncnn_DIR的变量修改,要指向刚才下载的ncnn-andoroid-vulkan

Android yolo 程序 怎么在安卓手机上部署yolov5_开发语言_02

3.2. param修改

打开yolov5s-sim-opt.param,找到Reshape行,把0=6400    0=1600    0=400全部修改为0=-1

Android yolo 程序 怎么在安卓手机上部署yolov5_开发语言_03

3.3. yolov5ncnn_jni.cpp修改

这个文件是网络推理的主要文件,需要修改读取ncnn模型的路径,如果是自己训练的模型还要修改class_name的列表, 另外还需修改stride16和stride32的输出

Android yolo 程序 怎么在安卓手机上部署yolov5_python_04

stride16和stride32的修改根据.param文件里的Permute后的数字进行修改,如下:

Android yolo 程序 怎么在安卓手机上部署yolov5_Android yolo 程序_05


Android yolo 程序 怎么在安卓手机上部署yolov5_开发语言_06

修改完成后,运行程序,就可以愉快的玩耍了。可以直接数据线连接手机进行调试,效果图如下:

Android yolo 程序 怎么在安卓手机上部署yolov5_Android yolo 程序_07