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里面就可重新構造一個可以對多個圖像使用相同的隨機變換的函數了。