0

我在 PyTorch 中微调了 resnet50 分类模型。训练期间,火炬。transforms 用于图像的预处理。当我在 OpenCV 中使用相同的预处理执行推理时,我没有得到相同的输出。请帮我解决这个问题。

Torch.transforms 预处理:

transform = transforms.Compose(
    [
        transforms.Resize((224, 224)),
        transforms.ToTensor(),
        transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
    ]
)

OpenCV preprocessing:


def preprocess_image(image):
    ## swap the color channels from BGR to RGB, resize it, and scale
    ## the pixel values to [0, 1] range
    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    image = cv2.resize(image, (224, 224), interpolation = cv2.INTER_CUBIC)
    image = image.astype("float32") / 255.0
    ## subtract ImageNet mean, divide by ImageNet standard deviation,
    ## set "channels first" ordering, and add a batch dimension
    image -= [0.485, 0.456, 0.406]
    image /= [0.229, 0.224, 0.225]
    image = np.transpose(image, (2, 0, 1))
    image = np.expand_dims(image, 0)
    ### return the preprocessed image
    return image
4

1 回答 1

0

transforms.Resize()方法默认使用 INTERPOLATION 模式InterpolationMode.BILINEAR,而您的 OpenCV 代码使用interpolation = cv2.INTER_CUBIC.

你应该使用cv2.resize(interpolation=cv2.INTER_LINEAR).

另外,看看这个线程可能是合适的:https ://discuss.pytorch.org/t/difference-between-pil-resize-and-opencv-resize/33138

否则,transforms.Normalize()您使用的操作是正确的,因为参数的顺序是mean(减去)和std_dev(减去结果除以谁)。

最后,我假设您操作np.transpose(image, (2, 0, 1))是为了在预处理OpenCVPyTorch预处理中具有相同的顺序(channels,height,width)

于 2021-08-13T12:34:49.457 回答