文章目錄
- 張量化(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°,而不同批可能會不同。
