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