【pytorch】常用圖像處理與數據增強方法合集(torchvision.transforms)


文章目錄

張量化

torchvision.transforms.ToTensor

描述

PIL.Imagenumpy.ndarray類型的圖片轉為torch.Tensor類型,如果圖片的灰度級在[0, 255],會除以255.0,歸一化到[0.0, 1.0]。這個基本上每個數據集都會用到。

參數

不用給參數。

示例

>>> from torchvision import transforms
>>> import numpy as np
>>> a = np.array([[255, 199, 30]], dtype=np.uint8)
>>> a
array([[255, 199,  30]], dtype=uint8)
>>> t = transforms.ToTensor()
>>> b = t(a)
>>> b
tensor([[[1.0000, 0.7804, 0.1176]]])

灰度化

torchvision.transforms.Grayscale(num_output_channels=1)

描述

將彩色圖片轉為灰度圖片。圖片必須是PIL.Imagetorch.Tensor類型。

參數

如果num_output_channels=1,返回單通道灰度圖片;如果num_output_channels=3,返回三通道的灰度圖片,其中r == g == b。一般我們不用設置,默認為1就行了。

示例

from PIL import Image
from torchvision import transforms
img = Image.open('test.jpg')
transform = transforms.Grayscale()
img = transform(img)

繪圖

標准化

torchvision.transforms.Normalize(mean, std, inplace=False)

描述

用均值和標准差標准化數據,將數據映射到區間[-1, 1],能加快模型的收斂速度,一般加到ToTensor后面。僅限torch.Tensor類型。

參數

mean (sequence):各通道的均值。
std (sequence):各通道的標准差。
inplace:是否直接在原數據上操作。

組合轉換

torchvision.transforms.Compose(transforms)

描述

將若干個轉換方法組合起來。

參數

transforms:帶組合的轉換方法

示例

# 以mnist數據集為例, 單通道, 其均值和標准差分別為0.1307和0.3081
train_file = datasets.MNIST(
    root='./dataset/',
    train=True,
    transform=transforms.Compose([
        transforms.ToTensor(),
        transforms.Normalize((0.1307,), (0.3081,))
    ])
)

中心裁剪

torchvision.transforms.CenterCrop(size)

描述

對圖片進行中心裁剪。中心就是圖片高和寬二分之一的交點。圖片必須是PIL.Imagetorch.Tensor類型。

參數

size是輸出圖片的高、寬。你可以給一個整型的數字,比如3,表示輸出3x3的圖片;你也可以給一個元組,比如(3, 5),表示輸出高為3,寬為5的圖片。

示例

from PIL import Image
from torchvision import transforms
img = Image.open('test.jpg')
# 300x300
transform_1 = transforms.CenterCrop(300)
img_1 = transform_1(img)
# 500x500
transform_2 = transforms.CenterCrop(500)
img_2 = transform_2(img)
# 500x300
transform_3 = transforms.CenterCrop((500,300))
img_3 = transform_3(img)

繪圖

邊緣拓展

torchvision.transforms.Pad(padding, fill=0, padding_mode=‘constant’)

描述

對圖像邊緣進行拓展填充。

參數

padding:拓展寬度。如果是整型,則所有邊都拓展;如果是二元組,則指定左右和上下的拓展寬度。如果是四元組,則指定左、上、右、下的拓展寬度。
fill:像素填充的值,默認是0,代表黑色。可以指定整型,也可以用三元組表示分別填充RGB通道。
padding_mode:拓展模式,默認為constant,表示所有填的所有值都一樣。edge表示用邊緣值填充;reflecty以邊緣為對稱軸進行軸對稱填充(邊緣不重復),如在[1, 2, 3, 4]的兩邊填充2個元素就是[3, 2, 1, 2, 3, 4, 3, 2]symmetricy以邊緣為對稱軸進行軸對稱填充(邊緣重復),如在[1, 2, 3, 4]的兩邊填充2個元素就是[2, 1, 1, 2, 3, 4, 4, 3]

示例

from PIL import Image
from torchvision import transforms
img = Image.open('test.jpg')
transform = transforms.Pad(100, (255, 0, 0))
img = transform(img)

繪圖

隨機裁剪

torchvision.transforms.RandomCrop(size, padding=None, pad_if_needed=False, fill=0, padding_mode=‘constant’)

描述

在隨機位置對圖像進行裁剪

參數

size:輸出圖片的高、寬。與中心裁剪的參數定義一致。
padding:拓展寬度。與邊緣拓展的參數定義一致。
pad_if_needed:如果設置為True,當圖像小於目標尺寸時會先填充再隨機裁剪。
fill:像素填充值。與邊緣拓展的參數定義一致。
padding_mode:拓展模式。與邊緣拓展的參數定義一致。

示例

from PIL import Image
from torchvision import transforms
img = Image.open('test.jpg')
transform = transforms.RandomCrop(300)
img_1 = transform(img)
img_2 = transform(img)
img_3 = transform(img)

繪圖

尺寸縮放

torchvision.transforms.Resize(size, interpolation=2)

描述

調整圖像的大小到指定尺寸。圖像必須是PIL.Imagetorch.Tensor類型。這個也用的比較多,訓練是按批的,必須保證每批圖像的尺寸是相同,所以一般都會在訓練前進行resize操作。

參數

size: 可以輸入一個元組,表示圖像的高、寬。比如(300, 500),返回高為300,寬為500的圖片;也可以只輸入一個整型的數字,短邊就是這個數字,然后長邊按照相同的長寬比進行調整。比如一張高、寬分別為400200的圖片,指定size = 300,那么返回的圖像高、寬分別是600300。計算過程:∵ with < height ∴ width = size = 300, height = size*height/width = 300*400*200 = 600
interpolation:插值法,默認即可。

注意

尺寸縮放size參數如果只給定一個整數值,返回的圖像不一定是方形的。要注意和中心裁剪size參數區分開來。

示例

from PIL import Image
from torchvision import transforms
img = Image.open('test.jpg')
transform = transforms.Resize((720, 720))
img = transform(img)
img.save('img.jpg')

繪圖

隨機旋轉

torchvision.transforms.RandomRotation(degrees, resample=False, expand=False, center=None, fill=None)

描述

按角度隨機旋轉圖像。圖像必須是PIL.Imagetorch.Tensor類型。

參數

degrees: 旋轉的角度范圍。如果只填一個整型或浮點型的數字,比如90,表示在-90°90°之間隨機旋轉。也可以給一個序列類型的值,比如(45, 90),表示逆時針旋轉,旋轉角度從45°90°之間隨機取一個值。
resample:重采樣方法,默認即可。
expand:是否擴展。默認為False表示輸出圖和輸入圖大小一樣,旋轉超出區域就丟掉不要了;設置為True表示擴展邊界以保證顯示整個原圖。
center:旋轉中心的坐標,可接受的輸入是元組或列表類型。默認是圖片的中心,比如1280x720的圖片中心就是(640, 360)
fill:圖像外部區域的填充顏色。默認是0也就是黑色,也支持RGB格式的顏色,比如(255, 0, 0)就表示用紅色填充。

拓展

官方只給了按角度隨機旋轉的方法,並沒有給指定角度旋轉的方法,但指定角度旋轉也可以通過通過設置隨機旋轉的參數實現。比如圖像順時針旋轉90°,只需要設置degrees=(-90, -90)。官方確實很聰明,只用一個函數就把隨機旋轉和定向旋轉都實現了。

示例

from PIL import Image
from torchvision import transforms
img = Image.open('test.jpg')
# 逆時針旋轉45°
transform_1 = transforms.RandomRotation(degrees=(45, 45))
img_1 = transform_1(img)
# 逆時針旋轉45°,啟動拓展
transform_2 = transforms.RandomRotation(degrees=(45, 45), expand=True)
img_2 = transform_2(img)
# 逆時針旋轉45°,綠色填充
transform_3 = transforms.RandomRotation(degrees=(45, 45), fill=(255, 0, 0))
img_3 = transform_3(img)

繪圖

水平翻轉

torchvision.transforms.RandomHorizontalFlip(p=0.5)

描述

字面意思,就是水平翻轉圖像。不過是否翻轉是隨機的。

參數

p:水平翻轉的概率,如果是1就一定翻轉,如果給0就一定不翻轉,如果其它值則按概率隨機選擇是否翻轉。比如0.5,那么就有一半的可能翻轉,一般的可能不翻轉。圖像必須是PIL.Imagetorch.Tensor類型。

示例

from PIL import Image
from torchvision import transforms
img = Image.open('test.jpg')
transform = transforms.RandomHorizontalFlip(p=1)
img = transform(img)
img.save('img.jpg')

繪圖

垂直翻轉

torchvision.transforms.RandomVerticalFlip(p=0.5)

描述

字面意思,就是垂直翻轉圖像。不過是否翻轉是隨機的。

參數

p:垂直翻轉的概率,如果是1就一定翻轉,如果給0就一定不翻轉,如果其它值則按概率隨機選擇是否翻轉。比如0.5,那么就有一半的可能翻轉,一般的可能不翻轉。圖像必須是PIL.Imagetorch.Tensor類型。

示例

from PIL import Image
from torchvision import transforms
img = Image.open('test.jpg')
transform = transforms.RandomVerticalFlip(p=1)
img = transform(img)
img.save('img.jpg')

繪圖

色彩抖動

torchvision.transforms.ColorJitter(brightness=0, contrast=0, saturation=0, hue=0)

描述

隨機改變圖片的亮度,對比度和飽和度。

參數

brightness:亮度;允許輸入浮點型或二元組(min, max)。如果是浮點型,那么亮度在[max(0, 1 ## brightness), 1 + brightness]區間隨機變換;如果是元組,亮度在給定的元組間隨機變換。不允許輸入負值。
contrast:對比度。允許輸入規則和亮度一致。
saturation:飽和度。允許輸入規則和亮度一致。
hue:色調。允許輸入浮點型或二元組(min, max)。如果是浮點型,那么亮度在[-hue, hue]區間隨機變換;如果是元組,亮度在給定的元組間隨機變換。不允許輸入負值。必須滿足0<= hue <= 0.5 or -0.5 <= min <= max <= 0.5

示例

from PIL import Image
from torchvision import transforms
img = Image.open('test.jpg')
# 亮度設置為2
transform_1 = transforms.ColorJitter(brightness=(2, 2))
img_1 = transform_1(img)
# 對比度設置為2
transform_2 = transforms.ColorJitter(contrast=(2, 2))
img_2 = transform_2(img)
# 飽和度設置為2
transform_3 = transforms.ColorJitter(saturation=(2, 2))
img_3 = transform_3(img)

繪圖

高斯模糊

torchvision.transforms.GaussianBlur(kernel_size, sigma=(0.1, 2.0))

描述

對圖像應用高斯模糊

參數

kernel_size:模糊半徑。必須是奇數。
sigma:正態分布的標准差。如果是浮點型,則固定;如果是二元組(min, max)sigma在區間中隨機選取一個值。

示例

from PIL import Image
from torchvision import transforms
img = Image.open('test.jpg')
# 模糊半徑越大, 正態分布標准差越大, 圖像就越模糊
transform_1 = transforms.GaussianBlur(21, 10)
img_1 = transform_1(img)
transform_2 = transforms.GaussianBlur(101, 10)
img_2 = transform_2(img)
transform_3 = transforms.GaussianBlur(101, 100)
img_3 = transform_3(img)

繪圖

在這里插入圖片描述

仿射變換

torchvision.transforms.RandomAffine(degrees, translate=None, scale=None, shear=None, resample=0, fillcolor=0)

  • 描述

匯總了旋轉、平移、縮放、扭曲等圖像變換方法,並且支持疊加。比如旋轉的同時又進行平移或縮放等。

  • 參數

degrees (sequence or float or int):隨機旋轉的角度范圍。和隨機旋轉的參數定義一致。設置為0表示不旋轉。
translate (tuple, optional) :水平和垂直平移的因子。如(a, b),表示在img_width * a < dx < img_width * a范圍內隨機水平平移,在-img_height * b < dy < img_height * b范圍內隨機垂直平移。
scale (tuple, optional):縮放因子。如(a, b),表示在a <= scale <= b隨機縮放。
shear (sequence or float or int, optional):隨機扭曲的角度范圍。如(45, 90),表示在45~90范圍內隨機選取一個角度進行與橫軸平行的扭曲。
resample (int, optional) :重采樣。
fillcolor (tuple or int) :填充色。默認為0,也就是黑色。支持三元組的RGB顏色。

  • 示例
from PIL import Image
from torchvision import transforms
img = Image.open('test.jpg')
# 隨機旋轉
transform_1 = transforms.RandomAffine(90)
img_1 = transform_1(img)
# 隨機平移
transform_2 = transforms.RandomAffine(0, (0.1, 0))
img_2 = transform_2(img)
# 隨機縮放
transform_3 = transforms.RandomAffine(0, None, (0.5, 2))
img_3 = transform_3(img)
# 隨機扭曲
transform_4 = transforms.RandomAffine(0, None, None, (45, 90))
img_4 = transform_4(img)
  • 繪圖

在這里插入圖片描述

測試樣例

名稱 尺寸
test.jpg 1280x720

注意事項

數據增強的transform操作會增加樣本量嗎?需不需要單獨的把數據集拿出來增強一下再訓練?

如果tranform里面有隨機的方法,那么每個epoch訓練的數據集將會不同,就相當於增加了樣本數量,所以直接訓練即可,不用單獨拿出來做增強。

溫馨提示

如果是對批數據進行變換,那么該批的所有變換都是相同的。為什么要這樣說?之前不是提到隨機旋轉這些隨機的操作嘛,pytorch在訓練前需要把數據做成批數據,然后用數據加載器喂到模型中訓練,也就是說這些隨機的方法對於同一批數據的隨機是相同,比如要旋轉45°的話就都旋轉45°,而不同批可能會不同。

引用參考

https://pytorch.org/docs/stable/torchvision/transforms.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM