pytorch模型导出到onnx时预测固定标签

pytorch model predicts fixed label when it exports to onnx

我在 pytorch 中训练了 resnet-18 模型。而且在pytorch中效果很好
但是,当我将其转换为 onnx 并在 cv2 中进行预测时,模型仅预测 1~2 个标签(它应该预测 0~17 个标签)。
这是我的模型导出代码

    model.eval()
    x = torch.randn(1, 3, 512, 384, requires_grad=True)

    # export model
    torch.onnx.export(model, x, "model.onnx", export_params=True, opset_version=10, do_constant_folding=True, input_names = ['input'], output_names = ['output'])

这是我在 cv2 中进行推理的代码

self.transform = albumentations.Compose([
        albumentations.Resize(512, 384, cv2.INTER_LINEAR),
        albumentations.GaussianBlur(3, sigma_limit=(0.1, 2)),
        albumentations.Normalize(mean=(0.5), std=(0.2)),
        albumentations.ToFloat(max_value=255)
        ])
...
#image crop code: works fine in pytorch
image = frame[ymin:ymax, xmin:xmax]  #type(frame)==numpy.array, RGB form
augmented = self.transform(image=image)
image = augmented["image"]
...
#inference code: does not work well
net=cv2.dnn.readNet("Model.onnx")
blob = cv2.dnn.blobFromImage(image, swapRB=False, crop=False)
net.setInput(blob)
label = np.array(net.forward())
text  =  'Label: '+str(np.argmax(label[0]))

所有转换设置在 pytorch 中运行良好。
这段代码可能有什么问题?

您的代码的问题可能与以不同方式预处理图像有关:self.transform 重新缩放图像,但是当您阅读 blob 时,您并没有这样做。要验证这一点,您可以读取相同的图像并检查 imageblob 是否相等(例如,使用 torch.allclose),当实际(随机)增强被禁用时。