介紹transforms之前先簡單介紹一下torchvision。
torchvision是PyTorch的計算機視覺工具包,包含了一些與CV相關的處理。有三個需要重要介紹:
在transforms中除了具體的預處理方法之外,有一個Compose操作,這裏提前介紹,它可以將一系列transforms操作有序地組合包裝,以此按順序執行每一項操作。
torchvision.transforms.Compose(transforms)
參數:
如:
>>> transforms.Compose([
>>> transforms.CenterCrop(10),
>>> transforms.ToTensor(),
>>> ])
transforms的操作一般的目的是爲了影象預處理和數據增強,所謂數據增強,又稱數據增廣、數據擴增,它是對訓練集進行變換,使訓練集更豐富,從而讓模型更具泛化能力。下面 下麪將介紹二十多種具體的transforms的方法。
功能:從圖片中隨機裁剪出尺寸爲size的部分,影象可以是PIL格式或者是張量。
torchvision.transforms.RandomCrop(size, padding=None, pad_if_needed=False, fill=0, padding_mode='constant')
參數如下:
下面 下麪看一下隨機裁剪的幾個例子及其效果,變換前圖片的原始尺寸爲224×224,如下圖所示:
(1)隨機裁剪尺寸爲224,padding=16,即四邊都填充16個畫素,就是在256×256的範圍隨機裁剪224×224的大小,效果如下圖所示:
transforms.RandomCrop(224, padding=16)
(2)隨機裁剪尺寸爲224,padding=(16, 64),即左右填充16個畫素,上下填充64個畫素,就是在256×352 的範圍隨機裁剪224×224的大小,效果如下圖所示:
transforms.RandomCrop(224, padding=(16, 64))
(3)與(1)不同之處就在於畫素的填充,這裏設定了填充的畫素值爲(255, 0, 0),效果如下圖所示:
transforms.RandomCrop(224, padding=16, fill=(255, 0, 0))
(4)隨機裁剪的尺寸爲512,大於原始影象的尺寸224,所以pad_if_needed必須設定爲True來進行自動填充,擴大尺寸(填充是隨機的),效果如下圖所示:
transforms.RandomCrop(512, pad_if_needed=True)
(5)與(1)或(3)不同的是,填充模式設定爲‘edge’,效果如下圖所示:
transforms.RandomCrop(224, padding=64, padding_mode='edge')
(6)與(1)或(3)或(5)不同的是,填充模式設定爲 ‘reflect’ ,效果如下圖所示:
transforms.RandomCrop(224, padding=64, padding_mode='reflect')
(7)最後看一個綜合一點的:
transforms.RandomCrop(1024, padding=1024, padding_mode='symmetric')
功能:從影象中心裁剪圖片,圖片可以是PIL格式或是張量。
torchvision.transforms.CenterCrop(size)
例子如下:
transforms.CenterCrop(128)
transforms.CenterCrop(512)
功能:隨機大小、長寬比裁剪圖片,圖片可以是PIL格式或是張量。
torchvision.transforms.RandomResizedCrop(size, scale=(0.08, 1.0), ratio=(0.75, 1.3333333333333333), interpolation=2)
參數如下:
例子如下:裁剪出來的部分是原來部分面積的0.5倍,但是大小又必須爲224不變,所以用了默認了插值方法PIL.Image.BILINEAR。
transforms.RandomResizedCrop(size=224, scale=(0.5, 0.5))
功能:對給定影象的四個角以及中心進行裁剪,圖片可以是PIL格式或是張量,返回一個包含五個元素的元組(tuple),一般都要緊跟一個將元組轉變爲張量的操作,而且還要注意前後程式碼尺寸上的匹配。
torchvision.transforms.FiveCrop(size)
參數size同上。
例子如下,緊跟了一個將元組變換爲張量的操作:
transforms.FiveCrop(112),
transforms.Lambda(lambda crops: torch.stack([(transforms.ToTensor()(crop)) for crop in crops])),
功能:在影象(PIL格式或者是張量)的上下左右四個角以及中心裁剪出尺寸爲size的5張圖片,TenCrop對這5張圖片進行水平或垂直映象從而獲得10張圖片。
torchvision.transforms.TenCrop(size, vertical_flip=False)
參數如下:
transforms.TenCrop(112, vertical_flip=False),
transforms.Lambda(lambda crops: torch.stack([(transforms.ToTensor()(crop)) for crop in crops])),
功能:依概率水平翻轉,輸入影象爲PIL格式或是張量。
torchvision.transforms.RandomHorizontalFlip(p=0.5)
參數:
例子如下:
transforms.RandomHorizontalFlip(p=1)
功能:依概率垂直翻轉,輸入影象爲PIL格式或是張量。
torchvision.transforms.RandomVerticalFlip(p=0.5)
例子如下:
transforms.RandomVerticalFlip(p=1)
功能:隨機旋轉圖片。
torchvision.transforms.RandomRotation(degrees, resample=False, expand=False, center=None, fill=None)
參數如下:
注意:expand的計算公式是針對中心點旋轉的,若設定爲左上角旋轉或者其他點爲旋轉中心,則不能保證保持原圖資訊。
下面 下麪看幾個例子:
(1)中心點旋轉,範圍(-90度,90度):
transforms.RandomRotation(90)
(2)設定expand保持原圖資訊,影象尺寸自動擴大:
transforms.RandomRotation((90), expand=True)
(3)旋轉中心改爲左上角:
transforms.RandomRotation(30, center=(0, 0))
(4)旋轉中心爲左上角並進行expand:
transforms.RandomRotation(30, center=(0, 0), expand=True)
結果不能保證保持原圖資訊: