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模型

YOLO部署到Android Studio yolov5部署到mcu_java


YOLO部署到Android Studio yolov5部署到mcu_pytorch_02

然后分别cd到安装编译好的ncnn目录下,ncnn/build/tools/ncnn/和ncnn/build/tools/ 找到onnx2ncnn和ncnnoptimize两个可执行文件,可以复制到yolov5-4.0的文件夹下,方面之后操作,运行以下语句:

./onnx2ncnn best-sim.onnx yolov5s.param yolov5s.bin

YOLO部署到Android Studio yolov5部署到mcu_pytorch_03


在使用onnx2ncnn转换为 ncnn 模型时,会输出很多 Unsupported slice step,这是focus模块转换的报错,只需gedit打开yolov5s.param修改部分参数,重要的已标红。

YOLO部署到Android Studio yolov5部署到mcu_pytorch_04


下图为修改后的

删掉 Split、Crop、Concat 层,新增YoloV5Focus层,一共减少9行,将开头的185减去9,改写为176。

YOLO部署到Android Studio yolov5部署到mcu_pytorch_05


最后最重要的参数,最后的 Reshape 层,把输出数量改为 -1 ,否则最终导出的apk,测试时会有很多框。具体如下图,将6400,1600,400,全部改写为-1.

YOLO部署到Android Studio yolov5部署到mcu_数据集_06


最后用 ncnnoptimize 优化模型,ncnnoptimize 工具会自动将无用的 MemoryData 删除。

./ncnnoptimize yolov5s.param yolov5s.bin yolov5s-opt.param yolov5s-opt.bin 65536

至此,整个模型转化的部分已经完成。

(5.0的版本可以看这里,)

5.0版本export文件不进行修改会出现如下三层输出,

YOLO部署到Android Studio yolov5部署到mcu_android_07


需要在文件中修改找到这行代码,

torch.onnx.export(model, img, f, training=TrainingMode.TRAINING, verbose=False, opset_versinotallow=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文件,修改分类为自己数据集的标签。

YOLO部署到Android Studio yolov5部署到mcu_android_08


其次,修改输出层信息,将其中的761,741,修改为自己param文件中的具体数值。可以通过netron进行可视化查看,如图我这里是437和417,双击permute可显示输出层数。

YOLO部署到Android Studio yolov5部署到mcu_android_09


YOLO部署到Android Studio yolov5部署到mcu_pytorch_10


最后,同理在java的文件夹中也要进行修改box.java中的标签信息。

至此完成所有准备工作,进行编译。

在编译中本人也遇到了一部分问题,由于当时未进行记录,这里就先不进行撰写了,如果大家遇到了欢迎大家提问,我会尽可能的解答。