X3派使用自训练yolov5模型并转换后,模型无法进行推理

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

  1. 系统软件版本:x3pi_ubuntu_v1.0.2
  2. 问题涉及的技术领域: 使用自训练的yolov5模型进行模型验证、转换、推理
  3. 问题描述:

1)在yolov5中使用自己的数据集训练得到best.pt文件;

2)利用yolov5自带的export.py将.pt模型转化成.onnx模型,其中opset_version=11,image_size=(672, 672);

3)将转换好的onnx模型放至地平线官方的oe包中对应的文件下,依次进行01_check.sh,02_preprocess.sh,03_build.sh后,正常输出得到.bin模型文件;

4)将上述得到的bin文件放入x3_pi自带的test_yolov5.py中,与postprocess.py共同处理模型,通过查看该模型的output,修改postprocess.py的部分代码,如图:

1.修改35-39行代码

2.模型的output如下

5)运行test_yolov5.py后,报错:

pred_sbbox = model_output[0].buffer.reshape([1, 84, 84, 3,

ValueError: cannot reshape array of size 166698 into shape (1,84,84,3,6)

6)运行04_inference.sh也会出现上述报错

现在不知道应该怎么修改代码,请求官方和大佬的帮助,不胜感激!!!

代码及.bin模型已上传进附件。

代码及模型附件_20230208222921.zip

你好,请问下为啥我的模型在Netron里面的output只有一层总的,没有像你一样分成三个;还有个问题就是为啥我地平线/usr/local/lib/python3.8/dist-packages下面没有yolov5这个文件夹

这里很明显是你导出的输出层有问题导致的

1.首先到yolo.py里面对Detect层里面的forward做修改

def forward(self, x):-
z = # inference output-
for i in range(self.nl):-
x[i] = self.m[i](x[i]) # conv-
bs, by, ny, nx = x[i].shape # x(bs,255,20,20) to x(bs,3,20,20,85)-
x[i] = x[i].view(bs,by,ny,nx).permute(0,2,3,1).contiguous()-

# if not self.training: # inference-
# if self.grid[i].shape[2:4] != x[i].shape[2:4] or self.onnx_dynamic:-
# self.grid[i], self.anchor_grid[i] = self._make_grid(nx, ny, i)-

# y = x[i].sigmoid()-
# if self.inplace:-
# y[…, 0:2] = (y[…, 0:2] * 2. - 0.5 + self.grid[i]) * self.stride[i] # xy-
# y[…, 2:4] = (y[…, 2:4] * 2) ** 2 * self.anchor_grid[i] # wh-
# else: # for YOLOv5 on AWS Inferentia https://github.com/ultralytics/yolov5/pull/2953-
# xy = (y[…, 0:2] * 2. - 0.5 + self.grid[i]) * self.stride[i] # xy-
# wh = (y[…, 2:4] * 2) ** 2 * self.anchor_grid[i] # wh-
# y = torch.cat((xy, wh, y[…, 4:]), -1)-
# z.append(y.view(bs, -1, self.no))-
return x

2.在detect里面 进行导出

将device里面改成cpu,然后对输入模型进行model.float()

请问你说的这个“detect”在哪里呀?我没有找到诶,是yolov5的detect.py吗?

detect.py

你好,是在这里文件夹找到yolo.py 和detect.py,然后进行修改吗?抱歉,我是在刚入门,抱歉一直打扰您了

首先,你在PC端训练完之后获取到了best.pt文件,文件需要转换为onnx-opset11之后。对于地平线官网给的python代码里面的不是完整的yolo代码,是经过裁剪的,将输出层裁剪掉的。所以需要在进行pt转onnx之前需要进行修改,首先需要在pc端yolo代码中对yolo.py里面的Detect进行修改上图已经发给你了。

然后在yolo代码中的detect.py里面添加如上图二的地方修改,不需要全部执行,通过调试执行

dummy = torch.zeros(1, 3, 640, 640).float()-
torch.onnx.export(-
model, (dummy,),-
“deepsort_yolov5.onnx”,-
input_names=[“image”],-
output_names=[“output”],-
opset_version=11

好的,谢谢您的解答