您好,我在使用YOLOv3进行目标检测的时候遇到了问题,就是在detect前向的部分有一个4维的x[i](batch,_,ny,nx)转5维(bs,anchors,outputs,ny,nx)的reshape操作,但是我们要求在部署的时候只能支持最高4维的reshape,这样应该如何修改代码呢? 是否应该连同detect和后面的nms都处理成4维?源代码如下
def forward(self, x) :
z = [] # inference output
for i in range(self.nl):
x[i] = self.m[i](x[il) # conv
bs,_,ny, nx = x[il.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()
我之前尝试对x[i][j]进行reshape(3维转4维),但是不知道是否因为不能对tensor内部进行reshape操作,这样会报错
代码:
for j in range(bs) :
x[i][j]=x[i]lj].view(self.na, self.no, ny,nx).permute(0,2,3,1).contiguous()
报错:
runtime error:expand(torch.FloatTensor{[3,40,40,50]},size=[150,40,40]):the number of sizes provided (3) must be greater or equal to the number of dimensions in the tensor (4)
你是需要导出的onnx变成4维的吗还是pt就得是4维的?你这里改的话,如果部署用的是detect.py,运行就会出问题,因为forward下面的代码是需要这个五维的。如果你是导出onnx用别的去部署,那么学它的view的写法,直接改成下面的,至于维度数,你可以自己改成想要的shape,但是需要记住的是,这些维度的总和要保持不变,不然就会报维度不匹配的错误,然后导出onnx,但是记得训练和运行detect.py的时候是需要改回来的,不然会报错,这个修改仅限于导出onnx的时候修改onnx的输出shape。
x[i] = x[i].view(bs, self.na*self.no, ny, nx).contiguous()
你可以参考下我之前对于yolov5旧版本的修改,之前旧版本也是5个输出,我这里是改成了2个维度,你可以换成上面的代码就是4个维度