torchvision.transforms
在transforms的工具包中都是一些随机变换的函数,像RandomHorizontalFlip,RandomCrop等。这些函数都会在每次调用的时候生成一个随机数,这就导致不能对多个图片一起变换或者是像unet这样的有input和mask需要做相同变换。
解决方法
在pytorch官网上可以找到相应的transforms的函数,以randomcrop函数为例[https://pytorch.org/vision/stable/_modules/torchvision/transforms/transforms.html#RandomCrop]
def forward(self, img):
"""
Args:
img (PIL Image or Tensor): Image to be cropped.
Returns:
PIL Image or Tensor: Cropped image.
"""
if self.padding is not None:
img = F.pad(img, self.padding, self.fill, self.padding_mode)
width, height = F._get_image_size(img)
# pad the width if needed
if self.pad_if_needed and width < self.size[1]:
padding = [self.size[1] - width, 0]
img = F.pad(img, padding, self.fill, self.padding_mode)
# pad the height if needed
if self.pad_if_needed and height < self.size[0]:
padding = [0, self.size[0] - height]
img = F.pad(img, padding, self.fill, self.padding_mode)
i, j, h, w = self.get_params(img, self.size)
return F.crop(img, i, j, h, w)
可以发现在最后的return里面调用了一个F.crop这个函数,那这个F函数其实是torchvision.transforms.functional as F,在这里面有一些基本函数。这是该函数的链接
[https://pytorch.org/vision/stable/transforms.html?highlight=functional#module-torchvision.transforms.functional]
那么利用这些函数就可以自定义一些自己想要的变化,同时也可以对多个图像做相同的变换
另外
虽然说这些函数非常直接,但是假如想要对多个图像做随机变换,就需要生成一些随机数,反而又有些麻烦。
其实可以直接利用transforms里面的get_params函数,这个函数在不同的random变换中会get到不同的参数,将这些参数保存,在传入相应torchvision.transforms.functional里面就可重新构造一个可以对多个图像使用相同的随机变换的函数了。