Python torch transform.resize()与cv2.resize()的比较

Python torch transform.resize()与cv2.resize()的比较,python,pytorch,Python,Pytorch,CNN模型将大小为112x112的图像张量作为输入,并将1x512大小的张量作为输出 使用Opencv函数cv2.resize或使用pytorch中的Transform.resize将输入调整为112x112,会给出不同的输出 这是什么原因?我知道opencv大小调整和torch大小调整的底层实现的差异可能是造成这种情况的原因,但我想对其有一个详细的了解 import cv2 import numpy as np from PIL import image import torch impor

CNN模型将大小为112x112的图像张量作为输入,并将1x512大小的张量作为输出

使用Opencv函数cv2.resize或使用pytorch中的Transform.resize将输入调整为112x112,会给出不同的输出

这是什么原因?我知道opencv大小调整和torch大小调整的底层实现的差异可能是造成这种情况的原因,但我想对其有一个详细的了解

import cv2
import numpy as np 
from PIL import image
import torch
import torchvision
from torchvision import transforms as trans


# device for pytorch
device = torch.device('cuda:0')

torch.set_default_tensor_type('torch.cuda.FloatTensor')

model = torch.jit.load("traced_facelearner_model_new.pt")
model.eval()

# read the example image used for tracing
image=cv2.imread("videos/example.jpg")

test_transform = trans.Compose([
            trans.ToTensor(),
            trans.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
        ])   
test_transform2 = trans.Compose([
            trans.Resize([int(112), int(112)]),
            trans.ToTensor(),
            trans.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
        ])      

resized_image = cv2.resize(image, (112, 112))

tensor1 = test_transform(resized_image).to(device).unsqueeze(0)
tensor2 = test_transform2(Image.fromarray(image)).to(device).unsqueeze(0)
output1 = model(tensor1)
output2 = model(tensor2)
output1和output2张量的值不同。

基本上,默认情况下,torchvision.transforms.Resize使用PIL.Image.BILINEAR插值

而在代码中,您只需使用cv2.resize,它不使用任何插值

比如说

import cv2
from PIL import Image
import numpy as np

a = cv2.imread('videos/example.jpg')
b = cv2.resize(a, (112, 112))
c = np.array(Image.fromarray(a).resize((112, 112), Image.BILINEAR))
您将看到b和c略有不同

编辑: 实际上opencv文档说

INTER_LINEAR-默认情况下使用的双线性插值

但是,是的,它不会给出与PIL相同的结果

编辑2: 这也在文档中

要缩小图像,通常使用INTER_区域插值效果最佳

显然

d = cv2.resize(a, (112, 112), interpolation=cv2.INTER_AREA)

给出了与c几乎相同的结果。但不幸的是,这些并没有回答这个问题。

OpenCV默认情况下不使用插值读取,在Python中不使用插值读取,但默认情况下cv::resize使用INTER_LINEAR@Natthaphon洪查伦。PIL在调整大小之前应用一些抗锯齿过滤器。但不是cv2,这也会导致一些differences@NatthaphonHongcharoen这里我们讨论的是Python而不是C++