圖像預(yù)處理Transforms與normalize
@[toc]
1. transforms運(yùn)行機(jī)制
torchvision工具包中包含三個(gè)主要模塊,今天主要學(xué)習(xí)transforms
- torchvision.transforms:常用的數(shù)據(jù)預(yù)處理方法,提升泛化能力
- 包括:數(shù)據(jù)中心化、數(shù)據(jù)標(biāo)準(zhǔn)化、縮放、裁剪、旋轉(zhuǎn)、翻轉(zhuǎn)、填充、噪聲添加、灰度變換、線性變換、仿射變換、亮度、飽和度及對(duì)比度變換等
2. 數(shù)據(jù)標(biāo)準(zhǔn)化——transforms.normalize
- transforms.Normalize()
- 功能:逐channel的對(duì)圖像進(jìn)行標(biāo)準(zhǔn)化(均值變?yōu)?,標(biāo)準(zhǔn)差變?yōu)?),可以加快模型的收斂
- output = (input - mean) / std
- mean:各通道的均值
- std:各通道的標(biāo)準(zhǔn)差
- inplace:是否原地操作
3. transforms數(shù)據(jù)增強(qiáng)
3.1 數(shù)據(jù)增強(qiáng)
-
數(shù)據(jù)增強(qiáng)又稱為數(shù)據(jù)增廣,數(shù)據(jù)擴(kuò)增,它是對(duì)訓(xùn)練集進(jìn)行變換,使訓(xùn)練集更豐富,從而讓模型更具泛化能力。
在這里插入圖片描述
3.2 transforms——裁剪
-
transforms.CenterCrop
- 功能:從圖像中心裁剪圖片
- size:所需裁剪圖片尺寸
-
transforms.RandomCrop
- 功能:從圖片中隨機(jī)裁剪出尺寸為size的圖片
- size:所需裁剪圖片尺寸
- padding:設(shè)置填充大小。當(dāng)為a時(shí),上下左右均填充a個(gè)像素,當(dāng)為(a,b)時(shí),上下填充b個(gè)像素,左右填充a個(gè)像素。當(dāng)為(a,b,c,d)時(shí),左上右下分別填充abcd
- pad_if_need:若圖像小于設(shè)定size,則填充
- padding_mode:填充模式:(1)constant像素值由fill設(shè)定(默認(rèn)模式);(2)edge像素值由圖像邊緣像素決定(3)reflect鏡像填充,最后一個(gè)像素不鏡像,eg,[1,2,3,4]->[3,2,1,2,3,4,3,2];(4)symmetric鏡像填充,最后一個(gè)像素鏡像,eg,[1,2,3,4]->[2,1,1,2,3,4,4,3]
- fill:constant時(shí),設(shè)置填充的像素值
-
RandomResizedCrop
- 功能:隨機(jī)大小、長(zhǎng)寬比裁剪圖片
- size:所需裁剪圖片尺寸
- scale:隨機(jī)裁剪面積比例,默認(rèn)(0.08,1)
- ratio:隨機(jī)長(zhǎng)寬比,默認(rèn)(3/4,4/3)
- interpolation:插值方法,PIL.Image.NEAREST最近鄰,PIL.Image.BILINEAR雙線性,PIL.Image.BICUBIC
-
FiveCrop
- 在圖片的左上角、左下角、右上角、右下角和中心裁剪出尺寸為size的5張圖片
- size:所需裁剪圖片尺寸
- 注意:返回的數(shù)據(jù)為tuple格式,需要轉(zhuǎn)換為張量形式或者PIL.Image形式
-
TenCrop
- 在圖像的上下左右以及中心裁剪出尺寸為size的5張圖片,TenCrop對(duì)著5張圖片進(jìn)行水平或者垂直鏡像獲得10張圖片
- size:所需裁剪圖片尺寸
- vertical_flip:是否垂直翻轉(zhuǎn)
3.3 transforms——翻轉(zhuǎn)和旋轉(zhuǎn)
-
RandomHorizontalFlip水平翻轉(zhuǎn)
- p:翻轉(zhuǎn)概率
-
RandomVerticalFlip垂直翻轉(zhuǎn)
- p:翻轉(zhuǎn)概率
-
RandomRotation
- 功能:隨機(jī)旋轉(zhuǎn)圖片
- degrees:旋轉(zhuǎn)角度。當(dāng)為a時(shí),在(-a, a)之間選擇旋轉(zhuǎn)角度;當(dāng)為(a, b)時(shí),在(a, b)之間選擇旋轉(zhuǎn)角度
- resample:重采樣方法,一般不需要設(shè)置,使用默認(rèn)值
- expand:是否擴(kuò)大圖片,以保持原圖信息
-
center:旋轉(zhuǎn)點(diǎn)設(shè)置,默認(rèn)中心旋轉(zhuǎn)。如果設(shè)置為(0,0),則為左上角旋轉(zhuǎn)
在這里插入圖片描述
4. transforms方法擴(kuò)展
4.1 圖像變換
-
Pad
- 功能:對(duì)圖片邊緣進(jìn)行填充
- padding:設(shè)置填充大小。當(dāng)為a時(shí),上下左右均填充a個(gè)像素,當(dāng)為(a,b)時(shí),上下填充b個(gè)像素,左右填充a個(gè)像素。當(dāng)為(a,b,c,d)時(shí),左上右下分別填充abcd
- padding_mode:填充模式。(1)constant像素值由fill設(shè)定(默認(rèn)模式);(2)edge像素值由圖像邊緣像素決定(3)reflect鏡像填充,最后一個(gè)像素不鏡像,eg,[1,2,3,4]->[3,2,1,2,3,4,3,2];(4)symmetric鏡像填充,最后一個(gè)像素鏡像,eg,[1,2,3,4]->[2,1,1,2,3,4,4,3]
- fill:constant時(shí),設(shè)置填充的像素值,(R, G, B)或者(Gray)
-
ColorJitter
- 功能:調(diào)整亮度、對(duì)比度、飽和度和色相
- brightness:亮度調(diào)整因子。當(dāng)為a時(shí),從[max(0, 1-1), 1+a]中隨機(jī)選擇;當(dāng)為(a, b)時(shí),從[a, b]中隨機(jī)選擇。
- contrast:對(duì)比度參數(shù),同brightness
- saturation:飽和度參數(shù),同brightness
- hue:色相參數(shù),當(dāng)為a時(shí),從[-a, a]中選擇參數(shù),注:0<= a <=0.5;當(dāng)為(a, b)時(shí),從[a, b]中選擇參數(shù)-0.5 <= a <= b <= 0.5
-
Grayscale
- 是RandomGrayscale的特例,概率為1。
-
RandomGrayscale
- 功能:依概率將圖片轉(zhuǎn)換為灰度圖
- num_output_channels:輸出通道數(shù),只能設(shè)1或3
-
p:概率值,圖像被轉(zhuǎn)換為灰度圖的概率
在這里插入圖片描述
-
RandomAffine
- 功能:對(duì)圖像進(jìn)行仿射變換,仿射變換是二維的線性變換,由五種基本原子變換構(gòu)成,分別是旋轉(zhuǎn)、平移、縮放、錯(cuò)切和翻轉(zhuǎn)。
- degrees:旋轉(zhuǎn)角度設(shè)置
- translate:平移區(qū)間設(shè)置,如(a, b),a設(shè)置寬(width),b設(shè)置高(height),圖像在寬維度平移的區(qū)間為-img_width * a < dx < img_width * a
- scale:縮放比例(以面積為單位),0到1之間
- fill_color:填充顏色設(shè)置,默認(rèn)為黑色(0)
- shear:錯(cuò)切角度設(shè)置,有水平錯(cuò)切和垂直錯(cuò)切。若為a,則僅在x軸錯(cuò)切,錯(cuò)切角度在(-a,a)之間;若為(a,b),則a設(shè)置x軸角度,b設(shè)置y的角度;若為(a,b,c,d),則a,b設(shè)置x軸角度,c,d設(shè)置y軸角度
-
resample:重采樣方式,有NEARSET,BILINEAR,BICUBIC
在這里插入圖片描述
-
RandomErasing
- 功能:對(duì)圖像進(jìn)行隨機(jī)遮擋
- p:概率值,執(zhí)行該操作的概率
- scale:遮擋區(qū)域的面積
- ratio:遮擋區(qū)域長(zhǎng)寬比
-
value:設(shè)置遮擋區(qū)域的像素值,(R,G,B)或(Gray)。如果value值設(shè)置為字符串,則填充隨機(jī)的像素
在這里插入圖片描述
在這里插入圖片描述
-
transforms.Lambda
- 功能:用戶自定義lambda方法
-
lambd:lambd:lambda匿名函數(shù) lambda [arg1 [, arg2, ..., argn]] : expression
在這里插入圖片描述
4.2 transforms方法操作
- transforms.RandomChoice
- 功能:從一系列transforms方法中隨機(jī)挑選一個(gè)
transforms.RandomChoice([transforms1, transforms2, transforms3])
- transforms.RandomApply
- 功能:依據(jù)概率執(zhí)行一組transforms操作
transforms.RandomApply([transforms1, transforms2, transforms3], p=0.5)
- transforms.RandomOrder
- 功能:對(duì)一組transforms操作打亂順序
transforms.RandomOrder([transforms1, transforms2, transforms3])
4.3 自定義transforms方法

transforms方法是在Compose類的call方法中被調(diào)用的,對(duì)一組transforms方法進(jìn)行for循環(huán),每次循序的挑選并執(zhí)行transforms方法
- 自定義transforms要素:
- 僅接收一個(gè)參數(shù),返回一個(gè)參數(shù)
- 注意上下游的輸出和輸入,數(shù)據(jù)類型必須匹配
通過類實(shí)現(xiàn)多參數(shù)傳入,下圖為自定義transforms的基本參數(shù),一個(gè)init,一個(gè)call

-
椒鹽噪聲
- 椒鹽噪聲又稱為又稱為脈沖噪聲,是一種隨機(jī)出現(xiàn)的白點(diǎn)或者黑點(diǎn),白點(diǎn)稱為鹽噪聲,黑點(diǎn)稱為椒噪聲。
-
信噪比(SNR):衡量噪聲的比例,圖像中為圖像像素的占比
下圖為不同信噪比的椒鹽噪聲效果圖:
在這里插入圖片描述
class AddPepperNoise(object):
def __init__(self, snr, p):
self.snr = snr
self.p = p
def __call__(self, img):
'''
添加椒鹽噪聲具體實(shí)現(xiàn)過程
'''
return img
5. 數(shù)據(jù)增強(qiáng)策略
- 原則:讓訓(xùn)練集與測(cè)試集更接近
- 空間位置:平移
- 色彩:灰度圖,色彩抖動(dòng)
- 形狀:仿射變換
- 上下文場(chǎng)景:遮擋,填充
- ......






