运行DEMO
下载ncnn框架和ncnn-android的demo
链接: ncnn
链接: ncnn-android
下面的教程主要以带加速的ncnn-android-vulkan为例
- 将下载好的压缩包解压
- 然后将ncnn-android-vulkan中的文件拷贝到ncnn-android-yolov5-master\app\src\main\jni中
打开android studio,选择ncnn-android-yolov5-master项目打开
打开src/main/jni/CMakeList.txt,修改ncnn路径
将作者的根目录删除改为自己的路径,像上述操作后路径由
set(ncnn_DIR ${CMAKE_SOURCE_DIR}/ncnn-20201218-android-vulkan/${ANDROID_ABI}/lib/cmake/ncnn)
变为
set(ncnn_DIR ${CMAKE_SOURCE_DIR}/${ANDROID_ABI}/lib/cmake/ncnn)
重新同步,成功后,将app安装到手机上
出现这个问题的原因是,使用的新版本的ndk中不包含这个文件,需要将老版本,例如R21版本toolchains文件夹中对应文件拷贝到当前应用的ndk版本对应文件夹中,或者在local.properties文件中指定ndk路径
- 这里如果出现点击gpu识别没有反应,大概率是因为下载的ncnn-android-vulkan版本与ndk版本新旧关系
换成自己的训练模型
- 将训练好的模型转为NCNN需要的,需要通过一种中介,通过它在不同的框架之间进行转换,即Open Neural Network Exchange 简称 ONNX,意思是开放神经网络交换格式
- 我们采用.pt ->onnx->ncnn的路线来转换自己训练的模型
1.首先,安装onnx包
在pytorch环境下安装onnx包
pip install onnx coremltools onnx-simplifier
2.使用YOLOv5自带的export.py进行转换
修改export文件内weights和data的路径
下面的train模式default=True,否则最终生成的APP会闪退
运行export.py,onnx会生成一个best.onnx
如果无法直接运行,可以在yolov5环境中运行脚本命令
python export.py --train --weights weights/yolov5s.pt --include torchscript onnx
weights/yolov5s.pt可以改为你自己的pt文件
3.对onnx进行压缩
python -m onnxsim best.onnx best-sim.onnx
压缩完之后会生成一个best-sim.onnx的文件,压缩可以去除一些不必要的结构,这一步很重要
4.将onnx文件转换成param文件
第一种方法是使用protobuf来完成这个onnx文件到ncnn权重的转换,但是现在有更好的解决方法,转换效率更高速度、更快,也更傻瓜化;这个过程在Ubuntu系统上完成,可以使用真的Ubuntu系统或者使用虚拟机。后续会有介绍,这里我们直接选择第二种方法使用onnxsim的在线端进行转换。得到best-sim-sim.bin和best-sim-sim.param两个文件
- 将这两个文件替换掉assets文件夹下的两个文件
在这里可以修改文件名
5.修改param文件中的参数
搜索Reshape层,将后面对应的 0=6400、0=1600、0=400 均修改为 0=-1 ,这是为了解决实际中出现的多检测框的问题
6.修改yolov5ncnn_jni.cpp文件
将文件中的分类类别名改成自己模型的实际类别名
7.修改stride 16和32部分
我们使用Netron打开这个yolov5s.param文件,找到permute节点,这个permute节点一共有3个,分别是128,256,512尺寸的,我们需要的是256和512的输出维度,我们需要的是256和512的输出维度,将对应节点的输出名更改,如下图
8.安装测试
https://github.com/fizzHEY/ncnn-android-yolo