赞
踩
Ubuntu 18.04.5 LTS
py3.8-rknn2-1.4.0
迅为itop-3568开发板
采用yolov5训练并将pt转换为onnx,再将onnx采用py3.8-rknn2-1.4.0推理转换为rknn出现置信度大于1,并且图像乱框问题。
类似下面这样
经过网上一顿查找发现是在将pt文件转化为onnx时对models/yolo.py的修改有问题。网上大部分的修改都是下面这种
models/yolo.py
def forward(self, x): z = [] # inference output for i in range(self.nl): x[i] = self.m[i](x[i]) # conv return x # def forward(self, x): # z = [] # inference output # for i in range(self.nl): # x[i] = self.m[i](x[i]) # conv # bs, _, ny, nx = x[i].shape # x(bs,255,20,20) to x(bs,3,20,20,85) # x[i] = x[i].view(bs, self.na, self.no, ny, nx).permute(0, 1, 3, 4, 2).contiguous() # if not self.training: # inference # if self.dynamic or self.grid[i].shape[2:4] != x[i].shape[2:4]: # self.grid[i], self.anchor_grid[i] = self._make_grid(nx, ny, i) # if isinstance(self, Segment): # (boxes + masks) # xy, wh, conf, mask = x[i].split((2, 2, self.nc + 1, self.no - self.nc - 5), 4) # xy = (xy.sigmoid() * 2 + self.grid[i]) * self.stride[i] # xy # wh = (wh.sigmoid() * 2) ** 2 * self.anchor_grid[i] # wh # y = torch.cat((xy, wh, conf.sigmoid(), mask), 4) # else: # Detect (boxes only) # xy, wh, conf = x[i].sigmoid().split((2, 2, self.nc + 1), 4) # xy = (xy * 2 + self.grid[i]) * self.stride[i] # xy # wh = (wh * 2) ** 2 * self.anchor_grid[i] # wh # y = torch.cat((xy, wh, conf), 4) # z.append(y.view(bs, self.na * nx * ny, self.no)) # return x if self.training else (torch.cat(z, 1),) if self.export else (torch.cat(z, 1), x)
这是导致问题的根源,至于为什么现在我还没办法回答。正确的应该按如下方式修改
models/yolo.py
def forward(self, x): z = [] # inference output for i in range(self.nl): if os.getenv('RKNN_model_hack', '0') != '0': x[i] = torch.sigmoid(self.m[i](x[i])) # conv return x # def forward(self, x): # z = [] # inference output # for i in range(self.nl): # x[i] = self.m[i](x[i]) # conv # bs, _, ny, nx = x[i].shape # x(bs,255,20,20) to x(bs,3,20,20,85) # x[i] = x[i].view(bs, self.na, self.no, ny, nx).permute(0, 1, 3, 4, 2).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._make_grid(nx, ny).to(x[i].device) # # 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].view(1, self.na, 1, 1, 2) # wh # y = torch.cat((xy, wh, y[..., 4:]), -1) # z.append(y.view(bs, -1, self.no)) # # return x if self.training else (torch.cat(z, 1), x)
export.py文件的run函数
# shape = tuple((y[0] if isinstance(y, tuple) else y).shape) # model output shape
shape = tuple(y[0].shape) # model output shape
export.py文件的开头加上
#onn转换添加内容
import os
os.environ['RKNN_model_hack'] = 'npu_2'
#
修改之后按照如下命令导出onnx
其中./runs/train/exp3/weights/best.pt换成自己训练的pt文件
python export.py --weights ./runs/train/exp3/weights/best.pt --img 640 --batch 1 --include onnx --opset 12
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。