文章目錄
- 張量化(ToTensor)
- 灰度化(Grayscale)
- 標准化(Normalize)
- 組合轉換(Compose)
- 中心裁剪(CenterCrop)
- 邊緣拓展(Pad)
- 隨機裁剪(RandomCrop)
- 尺寸縮放(Resize)
- 隨機旋轉(RandomRotation)
- 水平翻轉(RandomHorizontalFlip)
- 垂直翻轉(RandomVerticalFlip)
- 色彩抖動(ColorJitter)
- 高斯模糊(GaussianBlur)
- 仿射變換(RandomAffine)(包含平移)
張量化
torchvision.transforms.ToTensor
描述
將PIL.Image
或numpy.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.Image
或torch.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.Image
或torch.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.Image
或torch.Tensor
類型。這個也用的比較多,訓練是按批的,必須保證每批圖像的尺寸是相同,所以一般都會在訓練前進行resize
操作。
參數
size
: 可以輸入一個元組,表示圖像的高、寬。比如(300, 500)
,返回高為300
,寬為500
的圖片;也可以只輸入一個整型的數字,短邊就是這個數字,然后長邊按照相同的長寬比進行調整。比如一張高、寬分別為400
、200
的圖片,指定size = 300
,那么返回的圖像高、寬分別是600
、300
。計算過程:∵ 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.Image
或torch.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.Image
或torch.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.Image
或torch.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°
,而不同批可能會不同。