yolov8训练的模型文件转换至Android应用使用

模型.pt -onnx-ncnn转换训练模型

下面1,2两点说到的源码最好备份一下,训练模型时需要恢复原始代码,否则训练可能会报错,这里修改只是为了转换模型使用

  1. ultralytics/ultralytics/nn/modules/block.py中的class C2f(nn.Module)如下:
def forward(self, x):
        x = self.cv1(x)
        x = [x, x[:, self.c:, ...]]
        x.extend(m(x[-1]) for m in self.m)
        x.pop(1)
        return self.cv2(torch.cat(x, 1))
  1. ultralytics/ultralytics/nn/modules/head.py中的class Detect(nn.Module)改动如下:
def forward(self, x):
        shape = x[0].shape  # BCHW
        for i in range(self.nl):
            x[i] = torch.cat((self.cv2[i](x[i]), self.cv3[i](x[i])), 1)
        if self.training:
            return x
        elif self.dynamic or self.shape != shape:
            self.anchors, self.strides = (x.transpose(0, 1) for x in make_anchors(x, self.stride, 0.5))
            self.shape = shape
        # 中间部分注释掉,return语句替换为
        return torch.cat([xi.view(shape[0], self.no, -1) for xi in x], 2).permute(0, 2, 1)
  1. 安装onnx包,在终端运行下面命令

pip install onnx coremltools onnx-simplifier

  1. 根据官方文档,创建demo.py,将pt权重文件转换成onnx格式,代码如下
# 将模型导出为 ONNX 格式
 
from ultralytics import YOLO
 model = YOLO("runs/detect/train4/weights/best.pt")
 success = model.export(format="onnx", simplify=True, opset=11)

opset的参数(11、12、13),使用其他会造成手机上运行出现很多框重叠错误识别

  1. 对onnx文件进行压缩,进入到onnx文件所在目录,运行下面命令
python -m onnxsim best.onnx best-sim.onnx

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

完成上面步骤包含pt文件的weights目录下会生成对应文件best

  1. 将onnx文件转换成param、bin文件,并将best.onnx复制到该文件夹的对应位置,地址栏输入cmd后,在打开的命令行窗口输入onnx2ncnn.exe best-sim.onnx best.param best.bin回车即可,原文件夹生成了需要的bin文件和param文件
    在这里插入图片描述再将bin param文件复制到相应AndroidStudio ncnn-android-yolov8项目中,生成app进行测试

参考代码:
https://github.com/Tencent/ncnn
https://github.com/FeiGeChuanShu/ncnn-android-yolov8

Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐