YOLOV5部署全系列教程(1) 为防止以后方便查看与学习,特此记录自己部署全系列中遇到的一些问题和部署步骤。本文建立在U版yolov5已经运行基于自己的数据集导出了pt模型文件,若后续有时间,会简单记录一下yolov5自定义数据集训练部分。
本系列目前主要采用两个方面的部署,一个是基于ncnn的安卓软件编译部署,另一个是基于tensorRT的nvidia jetson xavier NX 系列开发板的部署。
文章目录
- YOLOV5部署全系列教程(1)
- 一、ncnn软件部署
- 二、具体步骤
-
- 1.onnx模型导出
- 2.apk编译
一、ncnn软件部署 整个部署过程我会尽可能详细的记录,大致整体流程可以分为pt模型文件—>onnx—>ncnn格式文件(.param和.bin文件)—>apk的编译。
二、具体步骤 1.onnx模型导出 u版的yolov5代码库中有自带的export.py文件,因此导出onnx模型很简单,
将.pt文件用onnx转化为.onnx文件
首先可以将训练好的权重文件放到models文件夹下,cd到根目录下,(若在其他目录下执行可能会出现找不到models模块问题)执行以下语句:
python models/export.py --weights models/yolov5s.pt --img 640 --batch 1
python -m onnxsim models/yolov5s.onnx best-sim.onnx
得到以下结果说明成功导出onnx模型
文章图片
文章图片
【深度学习|YOLOV5部署全系列教程(1)】然后分别cd到安装编译好的ncnn目录下,ncnn/build/tools/ncnn/和ncnn/build/tools/ 找到onnx2ncnn和ncnnoptimize两个可执行文件,可以复制到yolov5-4.0的文件夹下,方面之后操作,运行以下语句:
./onnx2ncnn best-sim.onnx yolov5s.param yolov5s.bin
文章图片
在使用onnx2ncnn转换为 ncnn 模型时,会输出很多 Unsupported slice step,这是focus模块转换的报错,只需gedit打开yolov5s.param
修改部分参数,重要的已标红。
文章图片
下图为修改后的
删掉 Split、Crop、Concat 层,新增YoloV5Focus层,一共减少9行,将开头的185减去9,改写为176。
文章图片
最后最重要的参数,最后的 Reshape 层,把输出数量改为 -1 ,否则最终导出的apk,测试时会有很多框。具体如下图,将6400,1600,400,全部改写为-1.
文章图片
最后用 ncnnoptimize 优化模型,ncnnoptimize 工具会自动将无用的 MemoryData 删除。
./ncnnoptimize yolov5s.param yolov5s.bin yolov5s-opt.param yolov5s-opt.bin 65536
至此,整个模型转化的部分已经完成。
(5.0的版本可以看这里,)
5.0版本export文件不进行修改会出现如下三层输出,
文章图片
需要在文件中修改找到这行代码,
torch.onnx.export(model, img, f, training=TrainingMode.TRAINING, verbose=False, opset_version=12, input_names=[‘images’],
dynamic_axes={‘images’: {0: ‘batch’, 2: ‘height’, 3: ‘width’}, # size(1,3,640,640)
‘output’: {0: ‘batch’, 2: ‘y’, 3: ‘x’}} if opt.dynamic else None)
添加 training=TrainingMode.TRAINING
并在文件开始导入相关模块
import torch._C as _C
TrainingMode = _C._onnx.TrainingMode
(最新的版本作者已经修改了export.py文件,可以尝试直接导出,如果有问题,还是建议直接采用4.0版本)
2.apk编译 关于后处理这块,网上有很多,但不知道为什么大部分,其他很多编译通过后,导出的apk都存在闪退的问题,只有这个https://github.com/djh123/yolov5Android,目前本人使用,可以完美运行。
整个流程是通过Android studio 进行编译,整体编译中存在不少问题,首先主要讲一下后处理代码的这部分修改。
首先打开文件夹,用我们刚刚导出的文件替换掉assets文件夹中bin文件和param文件。
然后打开cpp文件夹中yolov5.h文件,修改分类为自己数据集的标签。
文章图片
其次,修改输出层信息,将其中的761,741,修改为自己param文件中的具体数值。可以通过netron进行可视化查看,如图我这里是437和417,双击permute可显示输出层数。
文章图片
文章图片
最后,同理在java的文件夹中也要进行修改box.java中的标签信息。
至此完成所有准备工作,进行编译。
在编译中本人也遇到了一部分问题,由于当时未进行记录,这里就先不进行撰写了,如果大家遇到了欢迎大家提问,我会尽可能的解答。
后续会继续更新jetson系列的部署,如有问题,感谢大家的指正。
系列第二篇https://blog.csdn.net/weixin_45265693/article/details/118154152
非常感谢一下博客给我的帮助:
https://blog.csdn.net/qq_45057749/article/details/115013509
https://blog.csdn.net/qq_28664681/article/details/112650644
https://blog.csdn.net/djstavaV/article/details/113578063
https://blog.csdn.net/Sophia_11/article/details/113355845
推荐阅读
- yolov5学习|yolov5通过ncnn在安卓平台部署
- 笔记|AndroidStudio创建手机登录注册跳转界面
- java|职教云自动选题、答题并自动修改答题已用时间 脚本
- 毕业设计|安卓毕设项目总结(二)校园订餐app
- 程序员|【吐血整理】最新阿里Java面试题目,轻松拿下offer
- 程序员|Java连接redis哨兵模式
- 程序员|狂刷1个月Java面试题,给大家安排上!
- spring|SpringBoot使用RestTemplate调用接口
- Java小案例|Java小案例(台灯类Lamp,有开关on这个方法...)