最近使用好几个算法都碰到了关于图像size的报错:
RuntimeError: The size of tensor a (588) must match the size of tensor b (587) at non-singleton dimension 2
这个是由于在卷积过程中,当stride为2时,有个向下取整的过程,所以如果图像的size是奇数的话就会导致前后的size不同。所以如果有N层卷积层,那么要保证图像的size是2^N的整数倍。
这个时候就需要resize了。
这里使用的是skimage和cv2。PIL读取的图像格式不同,所以这里没有使用。如果使用的是PIL的话,使用torchvision.transforms模块也是很便捷的(torchvision.transforms.CenterCrop(Size)等)。
以4层卷积层为例,则图像需要为16的倍数。
import cv2
import numpy as np
from skimage.io import imread, imsave
Cropping:
input_image = imread(input_dir)
size=input_image.shape
h=size[0]
w=size[1]
new_w=int(w/16)*16
new_h=int(h/16)*16
i=h-new_h
j=w-new_w
cropImg = input_image[int(i/2):int(h-i/2), int(j/2):int(w-j/2)]#CenterCrop
Padding:
padImg = cv2.copyMakeBorder(input_image, top, bottom, left, right, cv2.BORDER_CONSTANT, value = 0)#上下左右要填补的像素数量,数值为0(黑边)