文章做者:Tyan
博客:noahsnail.com | CSDN | 簡書
html
0. 運行環境
python 3.6.8, pytorch 1.5.0python
1. torchvision.transforms
在深度學習中,計算機視覺(CV)是其中的一大方向,而在CV任務中,圖像變換(Image Transform)一般是必不可少的一環,其能夠用來對圖像進行預處理,數據加強等。本文主要整理PyTorch中torchvision.transforms
提供的一些功能(代碼加示例)。具體定義及參數可參考PyTorch文檔。git
1.1 torchvision.transforms.Compose
Compose
的主要做用是將多個變換組合在一塊兒,具體用法可參考2.5。下面的示例結果左邊爲原圖,右邊爲保存的結果。github
2. Transforms on PIL Image
這部分主要是對Python最經常使用的圖像處理庫Pillow中Image的處理。基本環境及圖像以下:網絡
import torchvision.transforms as transforms from PIL import Image img = Image.open('tina.jpg') ... # Save image img.save('image.jpg')
2.1 torchvision.transforms.CenterCrop(size)
CenterCrop
的做用是從圖像的中心位置裁剪指定大小的圖像。例如一些神經網絡的輸入圖像大小爲224*224
,而訓練圖像的大小爲256*256
,此時就須要對訓練圖像進行裁剪。示例代碼及結果以下:app
size = (224, 224) transform = transforms.CenterCrop(size) center_crop = transform(img) center_crop.save('center_crop.jpg')
2.2 torchvision.transforms.ColorJitter(brightness=0, contrast=0, saturation=0, hue=0)
ColorJitter
的做用是隨機修改圖片的亮度、對比度和飽和度,經常使用來進行數據加強,尤爲是訓練圖像類別不均衡或圖像數量較少時。示例代碼及結果以下:dom
brightness = (1, 10) contrast = (1, 10) saturation = (1, 10) hue = (0.2, 0.4) transform = transforms.ColorJitter(brightness, contrast, saturation, hue) color_jitter = transform(img) color_jitter.save('color_jitter.jpg')
2.3 torchvision.transforms.FiveCrop(size)
FiveCrop
的做用是分別從圖像的四個角以及中心進行五次裁剪,圖像分類評估時分爲Singl Crop Evaluation/Test
和Multi Crop Evaluation/Test
,FiveCrop
能夠用在Multi Crop Evaluation/Test
中。示例代碼及結果以下:學習
size = (224, 224) transform = transforms.FiveCrop(size) five_crop = transform(img)
2.4 torchvision.transforms.Grayscale(num_output_channels=1)
Grayscale
的做用是將圖像轉換爲灰度圖像,默認通道數爲1,通道數爲3時,RGB三個通道的值相等。示例代碼及結果以下:ui
transform = transforms.Grayscale() grayscale = transform(img) grayscale.save('grayscale.jpg')
2.5 torchvision.transforms.Pad(padding, fill=0, padding_mode=‘constant’)
Pad
的做用是對圖像進行填充,能夠設置要填充的值及填充的大小,默認是圖像四邊都填充。示例代碼及結果以下:lua
size = (224, 224) padding = 16 fill = (0, 0, 255) transform = transforms.Compose([ transforms.CenterCrop(size), transforms.Pad(padding, fill) ]) pad = transform(img) pad.save('pad.jpg')
2.6 torchvision.transforms.RandomAffine(degrees, translate=None, scale=None, shear=None, resample=False, fillcolor=0)
RandomAffine
的做用是保持圖像中心不變的狀況下對圖像進行隨機的仿射變換。示例代碼及結果以下:
degrees = (15, 30) translate=(0, 0.2) scale=(0.8, 1) fillcolor = (0, 0, 255) transform = transforms.RandomAffine(degrees=degrees, translate=translate, scale=scale, fillcolor=fillcolor) random_affine = transform(img) random_affine.save('random_affine.jpg')
2.7 torchvision.transforms.RandomApply(transforms, p=0.5)
RandomApply
的做用是以必定的機率執行提供的transforms
操做,便可能執行,也可能不執行。transforms
能夠是一個,也能夠是一系列。示例代碼及結果以下:
size = (224, 224) padding = 16 fill = (0, 0, 255) transform = transforms.RandomApply([transforms.CenterCrop(size), transforms.Pad(padding, fill)]) for i in range(3): random_apply = transform(img)
2.8 torchvision.transforms.RandomChoice(transforms)
RandomChoice
的做用是從提供的transforms
操做中隨機選擇一個執行。示例代碼及結果以下:
size = (224, 224) padding = 16 fill = (0, 0, 255) degrees = (15, 30) transform = transforms.RandomChoice([transforms.RandomAffine(degrees), transforms.CenterCrop(size), transforms.Pad(padding, fill)]) for i in range(3): random_choice = transform(img)
2.9 torchvision.transforms.RandomCrop(size, padding=None, pad_if_needed=False, fill=0, padding_mode=‘constant’)
RandomCrop
的做用是在一個隨機位置上對圖像進行裁剪。示例代碼及結果以下:
size = (224, 224) transform = transforms.RandomCrop(size) random_crop = transform(img)
2.10 torchvision.transforms.RandomGrayscale(p=0.1)
RandomGrayscale
的做用是以必定的機率將圖像變爲灰度圖像。示例代碼及結果以下:
p = 0.5 transform = transforms.RandomGrayscale(p) for i in range(3): random_grayscale = transform(img)
2.11 torchvision.transforms.RandomHorizontalFlip(p=0.5)
RandomHorizontalFlip
的做用是以必定的機率對圖像進行水平翻轉。示例代碼及結果以下:
p = 0.5 transform = transforms.RandomHorizontalFlip(p) for i in range(3): random_horizontal_filp = transform(img)
2.12 torchvision.transforms.RandomOrder(transforms)
RandomOrder
的做用是以隨機順序執行提供的transforms
操做。示例代碼及結果以下:
size = (224, 224) padding = 16 fill = (0, 0, 255) degrees = (15, 30) transform = transforms.RandomOrder([transforms.RandomAffine(degrees), transforms.CenterCrop(size), transforms.Pad(padding, fill)]) for i in range(3): random_order = transform(img)
2.13 torchvision.transforms.RandomPerspective(distortion_scale=0.5, p=0.5, interpolation=3, fill=0)
RandomPerspective
的做用是以必定的機率對圖像進行隨機的透視變換。示例代碼及結果以下:
distortion_scale = 0.5 p = 1 fill = (0, 0, 255) transform = transforms.RandomPerspective(distortion_scale=distortion_scale, p=p, fill=fill) random_perspective = transform(img) random_perspective.save('random_perspective.jpg')
2.14 torchvision.transforms.RandomResizedCrop(size, scale=(0.08, 1.0), ratio=(0.75, 1.3333333333333333), interpolation=2)
RandomResizedCrop
的做用是以隨機大小和隨機長寬比裁剪圖像並縮放到指定的大小。示例代碼及結果以下:
size = (256, 256) scale=(0.8, 1.0) ratio=(0.75, 1.0) transform = transforms.RandomResizedCrop(size=size, scale=scale, ratio=ratio) random_resized_crop = transform(img) random_resized_crop.save('random_resized_crop.jpg')
2.15 torchvision.transforms.RandomRotation(degrees, resample=False, expand=False, center=None, fill=None)
RandomRotation
的做用是對圖像進行隨機旋轉。示例代碼及結果以下:
degrees = (15, 30) fill = (0, 0, 255) transform = transforms.RandomRotation(degrees=degrees, fill=fill) random_rotation = transform(img) random_rotation.save('random_rotation.jpg')
2.16 torchvision.transforms.RandomSizedCrop(*args, **kwargs)
已廢棄,參見RandomResizedCrop
。
2.17 torchvision.transforms.RandomVerticalFlip(p=0.5)
RandomVerticalFlip
的做用是以必定的機率對圖像進行垂直翻轉。示例代碼及結果以下:
p = 1 transform = transforms.RandomVerticalFlip(p) random_vertical_filp = transform(img) random_vertical_filp.save('random_vertical_filp.jpg')
2.18 torchvision.transforms.Resize(size, interpolation=2)
Resize
的做用是對圖像進行縮放。示例代碼及結果以下:
size = (224, 224) transform = transforms.Resize(size) resize_img = transform(img) resize_img.save('resize_img.jpg')
2.19 torchvision.transforms.Scale(*args, **kwargs)
已廢棄,參加Resize
。
2.20 torchvision.transforms.TenCrop(size, vertical_flip=False)
TenCrop
與2.3相似,除了對原圖裁剪5個圖像以外,還對其翻轉圖像裁剪了5個圖像。
3. Transforms on torch.*Tensor
3.1 torchvision.transforms.LinearTransformation(transformation_matrix, mean_vector)
LinearTransformation
的做用是使用變換矩陣和離線計算的均值向量對圖像張量進行變換,能夠用在白化變換中,白化變換用來去除輸入數據的冗餘信息。經常使用在數據預處理中。
3.2 torchvision.transforms.Normalize(mean, std, inplace=False)
Normalize
的做用是用均值和標準差對Tensor
進行歸一化處理。經常使用在對輸入圖像的預處理中,例如Imagenet競賽的許多分類網絡都對輸入圖像進行了歸一化操做。
3.3 torchvision.transforms.RandomErasing(p=0.5, scale=(0.02, 0.33), ratio=(0.3, 3.3), value=0, inplace=False)
RandomErasing
的做用是隨機選擇圖像中的一塊區域,擦除其像素,主要用來進行數據加強。示例代碼及結果以下:
p = 1.0 scale = (0.2, 0.3) ratio = (0.5, 1.0) value = (0, 0, 255) transform = transforms.Compose([ transforms.ToTensor(), transforms.RandomErasing(p=p, scale=scale, ratio=ratio, value=value), transforms.ToPILImage() ]) random_erasing = transform(img) random_erasing.save('random_erasing.jpg')
4 Conversion Transforms
4.1 torchvision.transforms.ToPILImage(mode=None)
ToPILImage
的做用是將pytorch的Tensor
或numpy.ndarray
轉爲PIL的Image。示例代碼及結果以下:
img = Image.open('tina.jpg') transform = transforms.ToTensor() img = transform(img) print(img.size()) img_r = img[0, :, :] img_g = img[1, :, :] img_b = img[2, :, :] print(type(img_r)) print(img_r.size()) transform = transforms.ToPILImage() img_r = transform(img_r) img_g = transform(img_g) img_b = transform(img_b) print(type(img_r)) img_r.save('img_r.jpg') img_g.save('img_g.jpg') img_b.save('img_b.jpg') # output torch.Size([3, 256, 256]) <class 'torch.Tensor'> torch.Size([256, 256]) <class 'PIL.Image.Image'>
4.2 torchvision.transforms.ToTensor
ToTensor
的做用是將PIL Image
或numpy.ndarray
轉爲pytorch的Tensor
,並會將像素值由[0, 255]
變爲[0, 1]
之間。一般是在神經網絡訓練中讀取輸入圖像以後使用。示例代碼以下:
img = Image.open('tina.jpg') print(type(img)) print(img.size) transform = transforms.ToTensor() img = transform(img) print(type(img)) print(img.size()) # output <class 'PIL.JpegImagePlugin.JpegImageFile'> (256, 256) <class 'torch.Tensor'> torch.Size([3, 256, 256])
5. Code
代碼參見https://github.com/SnailTyan/deep-learning-tools/blob/master/transforms.py。