TNN将YOLOV5部署到移动端---pytorch转onnx转tnn全套流程

TNN将YOLOV5部署到移动端—pytorch转onnx转tnn全套流程

直接利用腾讯的TNN-master跑通android demo可以参考这篇博客
TNN入门笔记——从零跑通Android demo

有些电脑性能受限,可能不支持虚拟机技术,可以通过usb连接手机,直接部署到真机上测试,参考博客Android studio 连接手机调试。

中间可能会遇到一些问题,每个人情况不一定相同,根据问题来查找解决方案,最终可以将TNN-master提供的android-demo成功部署到手机上。

因为在TNN-master中所使用的权重已经是转换好的tnn权重,如果要想按照自己的需求来更换模型,则需要将pytorch(或者其他类型)权重转为tnn格式。下面介绍如何将pytorch权重转为tnn格式,替换掉tnn-master中的权重,实现按照自己的需要展示android-demo。

1.下载yolov5工程文件
根据查找,tnn-master中所转换的yolov5版本号为 41bb70b32598c016cc55debae7bafd26ec94e984,但此版本的权重已无法下载,所以选择了与其发布时间相近的yolov5-3.1版本。经过验证,选择yolov5-5.0版本同样操作也可以实现最终demo部署与测试。yolov5工程文件下载地址为yolov5各历史版本

2.将pytorch格式权重转为onnx格式
yolov5工程中有写好的pytorch格式权重转onnx格式的代码,在yolov5-3.1/models文件夹下export.py。但是这个文件夹下的yolo.py和export.py都有需要修改的地方,否则虽然可以成功转换,但最终部署到手机上的demo检测不出结果。装环境需要啥就装啥,按照报的缺少什么包挨个装。

2.1修改yolo.py文件
tnn似乎不支持5维的计算,所以在模型输出部分有5维的数据需要修改成为4维的输出:
TNN将YOLOV5部署到移动端---pytorch转onnx转tnn全套流程_第1张图片
2.2 修改export.py
TNN-master中所使用的图片尺寸为448640,而yolov5中为640640。如果模型转换时不修改尺寸,则需要在tnn-master中修改相应图片尺寸。建议在此处修改,更加方便。
TNN将YOLOV5部署到移动端---pytorch转onnx转tnn全套流程_第2张图片
3. 模型简化
经过上述操作后可以得到onnx格式的模型,使用代码python3 -m onnxsim /yolov5-master/weights/yolov5s.onnx /yolov5-master/weights/yolov5s_sim.onnx来进行模型简化,前一个地址为待简化的模型及地址,后一个为简化后的模型及地址。模型简化这一步必须得做,不然后续onnx转tnn时不能成功。

4. onnx转tnn
得到简化的onnx模型后,这一步将onnx转为tnn模型。推荐使用网页版转换工具,方便快捷,不用装环境。网页地址convertmodel

如果要自己配置环境安装编译工具,如果按照TNN官方文档进行操作,会出现很多莫名奇妙问题。尤其是照官方文档安装protobuf时,从源码安装又麻烦又报各种错,装好之后后面的有些包还装不了,浪费了大量时间和精力。最后自己摸索发现,不用先安装protobuf,在安装onnx时会附带安装protobuf,最终成功配置好环境,安装了编译工具。下面给出配置环境每一步骤及代码:
创建虚拟环境: conda create -n o2t python=3.8
激活环境: conda activate o2t
安装onnx : pip3 install onnx==1.6.0
安装onnxruntime: pip3 install onnxruntime
安装onnx-simplifier: pip3 install onnx-simplifier
安装cmake: 由于我所用的服务器上已经有cmake,就没有重新安装
编译: onnx2tnn 工具在 Mac 以及 Linux 上有自动编译脚本直接运行即可以 cd /tools/onnx2tnn/onnx-converter ./build.sh
如果显示没有操作权限,那么给文件赋予权限 chmod +x ./build.sh 赋予了权限之后再 ./build.sh
模型转换: cd /tools/onnx2tnn/onnx-converter python3 onnx2tnn.py /yolov5-master/weights/yolov5s.onnx -version=v1.0 -optimize=1 -half=0 -o /yolov5-master/weights/ -input_shape input:1,3,448,640 参数的设定可以参照官方文档,模型路径按实际更改。

5. 查看输出位置
模型转换之后得到 .tnnmodel和.tnnproto两个文件,使用查看输出位置。
TNN将YOLOV5部署到移动端---pytorch转onnx转tnn全套流程_第3张图片

6. 替换模型及修改输出位置
在TNN-master中将它自带的yolov5模型替换成自己转换的模型
TNN将YOLOV5部署到移动端---pytorch转onnx转tnn全套流程_第4张图片
在AS所打开的TNN-master android-demo中打开object_detector_yolo.cc,找到输出位置,修改为上面.tnnproto文件查看的输出位置,注意顺序和对应,防止出错,可以用netron查看一下tnn-master自带的.tnnproto文件中输出位置和object_detector_yolo.cc中对应关系。
TNN将YOLOV5部署到移动端---pytorch转onnx转tnn全套流程_第5张图片
TNN将YOLOV5部署到移动端---pytorch转onnx转tnn全套流程_第6张图片

7. 去除冗余
TNN-master中给出了较多模型,部署到android端时demo比较大,而且很多功能也不一定需要,所以可以给它们去了,减小内存消耗。例如这里我们仅用yolov5模型来做物体检测,所以只保留这一个模型即可。

先将模型删除只剩yolov5
TNN将YOLOV5部署到移动端---pytorch转onnx转tnn全套流程_第7张图片
再在 TNN-master\examples\android\demo\src\main\java\com\tencent\tnn\demo其中MainActivity.java将多余的activity注销掉
TNN将YOLOV5部署到移动端---pytorch转onnx转tnn全套流程_第8张图片
应该还可以找到界面显示那一部分代码将多余的显示按钮删除,就可以得到比较清洁的android-demo。

最后,如果要自己训练模型,修改类别或者其他内容,那么应该在TNN-master中修改对应文件,目前还未进行这种尝试。

你可能感兴趣的:(android,pytorch)