专栏算法工具链X3派自己训练yolov5模型到单张图片推理问题

X3派自己训练yolov5模型到单张图片推理问题

已解决
zhengsiyu2022-08-12
269
13

用户您好,请详细描述您所遇到的问题:

  1. 系统软件版本:x3pi_ubuntu_v1.0.2

  2. 使用1.10.7版本OE包进行yolov5脚本进行模型验证、转换、推理

自己训练模型

1. 修改源码进行模型格式转换(pt->onnx)

首先使用YOLOv5-5.0版本的源码进行训练得到自己的模型(best.pt)

yolov5源码中yolo.py修改:(models文件夹下)

修改内容为:x[i] = x[i].permute(0, 2, 3, 1).contiguous()

yolov5源码中export.py修改:(export.py需要放到models文件夹外)

将图片的宽高修改为与地平线已训练好的模型一致的宽高672*672

input_names修改为一致的data

opset=11

修改内容如下:

parser.add_argument('--img-size', nargs='+', type=int, default=[672, 672], help='image size') # height, width
torch.onnx.export(model, img, f, verbose=False, opset_version=11, input_names=['data'],
model = ct.convert(ts, inputs=[ct.ImageType(name='image', shape=img.shape, scale=1 / 255.0, bias=[0, 0, 0])])
在终端命令行执行python export.py --weights best.pt

执行结束后源码根目录下会生成一个.onnx的文件

2. 将转换好的onnx模型放至地平线官方的oe包中对应的文件下

使用地平线AI工具链进行模型验证、转换

模型验证:

存放到OE包中下边这个路径即可并修改名字为yolov5s:

在docker环境下运行模型验证工具

运行01_check.sh

执行结束

会给出模型是否可以运行在bpu上。

预处理(准备校准数据)

执行02_preprocess.sh,校准数据图片格式有什么要求吗?尺寸,rgb、bgr,排列顺序

模型转换(构建混合异构.bin模型)

执行03_build.sh,执行完成保存在model_output文件夹下

后处理(模型推理)

转换完成后生成了yolov5s_672x672_nv12_original_float_model.onnx,yolov5s_672x672_nv12_optimized_float_model.onnx,yolov5s_672x672_nv12_quantized_model.onnx,yolov5s_672x672_nv12.bin。分别对应原始浮点ONNX模型、优化后的浮点模型,量化模型和交叉编译后可以直接在开发板上运行的二进制文件量化模型。

工具链中的04_inference.sh可以利用量化后的模型进行单张图片的推断。

在推理过程中报错:

ValueError: cannot reshape array of size 232848 into shape (1,84,84,3,85)

源onnx模型输出

转换完.bin的输出

我们训练的模型百度网盘地址:

链接:https://pan.baidu.com/s/1OENU9T_PFkKB_JsEav8XlA?pwd=etdz

提取码:etdz

我们在进行第四部推理的时候出现上述报错问题。希望能指点一下,需要修改什么地方。同样的我们使用yolov5官方源码的yolov5s.pt模型进行模型转换到第四部模型推理就可以正常使用,两种方式修改内容一致。

算法工具链
+1
评论4
0/1000
  • Horizon_guosheng
    Lv.1

    您好,问题已经收到,我们会尽快解决

    2022-08-13
    0
    5
    • zhengsiyu回复Horizon_guosheng:

      等了快半个月了,没有人解决了吗?

      2022-08-25
      0
    • xudahai回复Horizon_guosheng:

      我也是遇到了这个问题,好像说是输出维度不匹配的问题,正在找解决办法

      2022-08-29
      0
    • Horizon_guosheng回复zhengsiyu:
      • 为了更好地适配后处理代码,我们在ONNX模型导出前对Github代码做了如下修改 (代码参见:https://github.com/ultralytics/yolov5/blob/v2.0/models/yolo.py):

      • 说明: 去除了每个输出分支尾部从4维到5维的reshape(即不将channel从255拆分成3x85),然后将layout从NHWC转换成NCHW再输出。
      2022-11-11
      0
    • Captain1733回复xudahai:

      你好,请问你解决了吗,我也遇到了这个问题

      2023-02-08
      0
    • Captain1733回复Horizon_guosheng:

      请问开发板上的yolo.py文件在哪里呢?我没有找到

      2023-02-09
      1
  • Captain1733
    Lv.1

    我也遇到了同样的问题,请问最后是怎么解决的呢?

    2023-02-07
    0
    4
    • Horizon_guosheng回复Captain1733:

      B站有个帖子,可以参考下

      2023-02-08
      0
    • Captain1733回复Horizon_guosheng:

      你好,有链接吗?

      2023-02-08
      0
    • Captain1733回复Horizon_guosheng:

      或者帖子名字是什么呢?麻烦你了,谢谢?

      2023-02-09
      0
    • ziyifly回复Horizon_guosheng:

      遇到跟楼主完全一样的问题,请问B站帖子链接有吗?

      请问地平线有人帮忙解决吗?

      2023-06-10
      0
  • qiqihuang
    Lv.1

    用netron分别打开你的模型和地平线提供的模型,就知道错在哪了

    2022-10-01
    0
    0
  • ziyifly
    Lv.1

    出现了跟楼主完全一样的问题:

    按照官网的流程修改了:

    1. 下载了yolov5-2.0 tag

    2. 修改了 yolo.py x[i] = x[i].permute(0, 2, 3, 1).contiguous()
    3. 将export.py中的torch.onnx.export 的 opset_version 改为11

    4. 将 torch.onnx.export 部分的默认输入名称参数由 'images' 改为 'data',与模型转换示例包的YOLOv5x示例脚本保持一致。

    5. 将 parser.add_argument 部分中默认的数据输入尺寸640x640改为模型转换示例包YOLOv5x示例中的672x672

    转换成功后,进行第04推理时,出现错误:

    2023-06-10 17:45:40,736 INFO log will be stored in /home/lk/ros/ai/tools/data/horizon_model_convert_sample/04_detection/03_yolov5s/mapper/inference.log

    2023-06-10 17:45:43,772 ERROR cannot reshape array of size 148176 into shape (1,84,84,3,85)

    2023-06-10
    0
    0