當你想要對圖像設置transforms策略時,如:
from torchvision import transforms as T normalize = T.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) data_transforms = { 'train': T.Compose([ T.RandomResizedCrop(224), # 從圖片中心截取 T.RandomHorizontalFlip(), # 隨機水平翻轉給定的PIL.Image,翻轉概率為0.5 T.ToTensor(), # 轉成Tensor格式,大小范圍為[0,1] normalize ]), 'val': T.Compose([ T.Resize(256), # 重新設定大小 T.CenterCrop(224), T.ToTensor(), normalize ]), }
但是有時官方提供的方法並不能夠滿足你的需要,這時候你就需要自定義自己的transform策略
方法就是使用transforms.Lambda
舉例說明:
比如當我們想要截取圖像,但並不想在隨機位置截取,而是希望在一個自己指定的位置去截取
那么你就需要自定義一個截取函數,然后使用transforms.Lambda去封裝它即可,如:
# coding:utf-8 from torchvision import transforms as T def __crop(img, pos, size): """ :param img: 輸入的圖像 :param pos: 圖像截取的位置,類型為元組,包含(x, y) :param size: 圖像截取的大小 :return: 返回截取后的圖像 """ ow, oh = img.size x1, y1 = pos tw = th = size # 有足夠的大小截取 # img.crop坐標表示 (left, upper, right, lower) if (ow > tw or oh > th): return img.crop((x1, y1, x1+tw, y1+th)) return img # 然后使用transforms.Lambda封裝其為transforms策略 # 然后定義新的transforms為 normalize = T.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) data_transforms = T.Compose([ T.Lambda(lambda img: __crop(img, (5,5), 224)), T.RandomHorizontalFlip(), # 隨機水平翻轉給定的PIL.Image,翻轉概率為0.5 T.ToTensor(), # 轉成Tensor格式,大小范圍為[0,1] normalize ])