当前位置:网站首页 > 云计算与后端部署 > 正文

onnx模型部署(onnx模型部署到手机)



目录

1. 项目准备

1.1 安装Android studio

1.2 下载解压源码

2. 安卓源码重新编译

2.1 构建工程

2.2 修改源码

2.3 重新重新Sync Project

 2.4 安装APP到手机端

3. 换成自己的训练模型

3.1 导出需要的onnx文件

3.2 将onnx文件转换成param文件

3.3 修改项目源码

3.4 测试

4. 版本设置


NCNN源码:https://github.com/Tencent/ncnn

我们接下来主要以带加速的ncnn-android-vulkan.zip展开

1.1 安装Android studio

根据自己的手机版本来选择对应的开发环境,最后点击应用下载

1.2 下载解压源码

下载解压NCNN和ncnn-android-yolov5工程

  • Releases · Tencent/ncnn · GitHub

ncnn--android-vulkan里面的文件复制一份到ncnn-android-yolov5-masterappsrcmainjni目录下

2.1 构建工程

用Android studio 打开这个ncnn-android-yolov5-master项目的build.gradle文件

之后Android studio会帮我们构建整个工程,耐心等待他走完

2.2 修改源码

(1)修改CMakeLists.txt中的路径

  • 打开ncnn-android-yolov5-masterappsrcmainjniCMakeLists.txt

将第五行的路径改为自己的路径

 

改为

 

也就是把作者的根目录给删除掉,修改之后

  • 简单说明一下:ANDROID_ABI对应的是不同架构下的文件夹名称

2.3 重新重新Sync Project

 2.4 安装APP到手机端

利用Android Studio连接手机进行APP的安装,连接手机教程在上面里有详细教程,之后点击这个开始按钮即可

可以看到,手机端已经安装好这个APP了

点开看一下界面

当我们训练好了自己的检测模型后,就需要一种中介,通过它在不同的框架之间进行转换,Open Neural Network Exchange 简称 ONNX,意思是开放神经网络交换格式,它就是我们需要的中介。

转换自己训练的pt权重为ncnn格式

我们采用.pt ->onnx->ncnn的路线来转换自己训练的模型

3.1 导出需要的onnx文件

(1)安装onnx包,在终端运行下面命令

 

(2)使用YOLOv5自带的export.py进行转换

  • 执行export.py操作前,修改weights和data的路径

  • 这里有一点非常重要,一定要选择train模式去掉后处理,否则最终生成的APP会闪退

  • 执行export.py操作后,会在权重文件夹下面生成一个onnx文

  • 如果PyCharm直接运行无法生成onnx的话,使用下面的脚本命令应该就可以成功了
 

(3)对onnx文件进行压缩,进入到onnx文件所在目录,运行下面命令

 
  • 压缩完之后会生成一个best-sim.onnx的文件,这一步是必须的,如果这一步不做,后面ONNX转NCNN可能会报错

3.2 将onnx文件转换成param文件

将best.onnx转成param和bin文件,可以下载以下文件之一 

地址:Releases · Tencent/ncnn · GitHub

解压后,打开文件夹,并将best.onnx复制到该文件夹的对应位置,地址栏输入cmd后,在打开的命令行窗口输入例如onnx2ncnn.exe best.onnx best.param best.bin回车即可,原文件夹生成了需要的bin文件和param文件

3.3 修改项目源码

  • 将刚才生成的best.bin、best.param文件放到ncnn-android-yolov5-masterappsrcmainassets文件夹下
  • 然后我们修改yolov5ncnn_jni.cpp文件(上图中的绿色框)。修改模型权重路径,输入输出、anchors大小和类别名。
  • 全局搜索yolov5.load_param,将后面的yolov5s.param修改为自己的param名。就在这个代码附近有bin的加载.同理修改

  • 打开yolov5s.param,搜索Reshape层,将后面对应的 0=6400、0=1600、0=400 均修改为 0=-1 ,这是为了解决实际中出现的多检测框的问题,相对应的permute结点,在下面out既然点修改

  •  将ncnn-android-yolov5-masterappsrcmainjni文件夹下的yolov5ncnn_jni.cpp的分类类别名改成自己模型的实际类别名

  • 修改源码文件yolov5ncnn_jni.cpp中Permute 节点的 output
  • 将param文件中permute部分与stride部分中blob_name后面的数字对应起来
  • param文件中搜索permute会出来3个结果,我们选择
  • 我们使用Notre打开这个yolov5s.param文件,找到permute节点,这个permute节点一共有3个,分别是128,256,512尺寸的,我们需要的是256和512的输出维度

3.4 测试

连上手机,点击run按钮,编译安装调试

Android Studio运行yolov5 7.0项目,以下版本只是参考,也可以用其他版本,根据错误提示下载相应版本即可

Android APP闪退问题

 

输入输出
打开https://netron.app/,然后将param拖进去, 最上面的这个名字是images,将images填写到ex.input中。 模型有三个输出,分别对应stride 8,stride 16和stride 32.将这个输出的名字也填写到对应位置。一般情况下,stride 8对应out0,stride 16对应out1,stride 32对应out2.

stride 8对应out0

stride 16对应out1

stride 32对应out2.

到此这篇onnx模型部署(onnx模型部署到手机)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • 苹果软件后缀名是啥(苹果手机软件的后缀名是什么)2025-03-17 21:09:10
  • 服务器的部署(服务器的部署和搭建)2025-03-17 21:09:10
  • onnx模型部署到手机(onnx安卓部署)2025-03-17 21:09:10
  • windows nfs客户端(windows2012 nfs客户端)2025-03-17 21:09:10
  • 达梦客户端安装 linux(linux安装达梦创建实例)2025-03-17 21:09:10
  • 电视软件后缀大全(电视软件后缀名)2025-03-17 21:09:10
  • 服务器部署springboot项目(部署springboot项目到服务器上)2025-03-17 21:09:10
  • nfs服务器(nfs客户端服务)2025-03-17 21:09:10
  • linux连接redis客户端(linux连接远程redis)2025-03-17 21:09:10
  • 手机软件后缀怎么改(手机软件后缀改名)2025-03-17 21:09:10
  • 全屏图片