1、基本概念
數據增強,又稱數據增廣、數據擴增,是對訓練集進行變換,使訓練集更豐富,從而讓模型更具泛化能力
2、裁剪 — — Crop
2.1 transforms.CenterCrop
功能:從圖像中心裁剪圖片
size
:所需裁剪圖片尺寸
2.2 transforms.RandomCrop
# transforms.RandomCrop(
# size,
# padding=None,
# pad_if_needed=False,
# fill=0,
# padding_mode='constant',
# )
功能:從圖片中隨機裁剪出尺寸為 size 的圖片
-
size
:所需裁剪圖片尺寸 -
padding
:設置填充大小- 為 a 時,上下左右均填充 a 個像素
- 為 (a, b) 時,上下填充 b 個像素,左右填充 a 個像素
- 為 (a, b, c, d) 時,左、上、右、下分別填充 a,b,c,d 個像素
-
pad_if_need
:若圖像小于設定的 size,則填充 -
padding_mode
:填充模式,有4種模式constant
:像素值由 fill 設定edge
:像素值由圖像邊緣像素決定reflect
:鏡像填充,最后一個像素不鏡像symmetric
:鏡像填充,最后一個像素要鏡像
-
fill
:為constant
時,設置填充的像素值
2.3 RandomResizedCrop
# transforms.RandomResizedCrop(
# size,
# scale=(0.08, 1.0),
# ratio=(3/4, 3/4),
# interpolation
# )
功能:隨機大小、長寬比裁剪圖片
-
size
:所需裁剪圖片尺寸 -
scale
:隨機裁剪面積比例,默認為(0.08, 1.0) -
ratio
:隨機長寬比,默認為(3/4, 4/3) -
interpolation
:插值方式,默認為PIL.Image.BILINEAR
- PIL.Image.NEAREST:最近鄰近插值
- PIL.Image,BILINEAR:雙線性插值
- PIL.Image.BICUBIC:三次樣條插值
- PIL.Image.LANCZOS:蘭索斯插值
- PIL.Image.HAMMING:漢明碼插值
- PIL.Image.BOX:盒插值
2.4 FiveCrop
# transforms.FiveCrop(
# size
# )
2.5 TenCrop
# transforms.TenCrop(
# size,
# vertical_flip=False,
# )
功能:在圖像的上下左右以及中心裁剪出尺寸為 size 的圖片,TenCrop 對5張圖片進行水平或垂直鏡像獲得10張圖片
size
:所需裁剪圖片的尺寸vertical_flip
:是否進行垂直鏡像
3、翻轉 — — Flip
3.1 RandomHorizontalFlip
# transforms.RandomHorizontalFlip(
# p=0.5
# )
3.2 RandomVerticalFlip
# transforms.RandomVerticalFlip(
# p=0.5
# )
功能:依概率水平(左右)或垂直(上下)翻轉圖片
p
:翻轉概率,默認為0.5
3.3 RandomRotation
# transforms.RandomRotation(
# degrees,
# resample=False,
# expand=False,
# center=None
# )
功能:隨機翻轉圖片
-
degree
:旋轉角度- 為 a 時,在 (-a, a) 之間選擇旋轉角度
- 為 (a, b) 時,在 (a, b) 之間選擇旋轉角度
-
resample
:重采樣方法 -
expand
:是否擴大圖片,以保持原圖信息 -
center
:旋轉點設置,默認為圖像中心
4、圖像變換
4.1 Pad
# transforms.Pad(
# padding,
# fill=0,
# padding_mode='constant'
# )
功能:對圖片邊緣進行填充
-
padding
:設置填充大小- 為 a 時,上下左右均填充 a 個像素
- 為 (a, b) 時,上下填充 a 個像素,左右填充 b 個像素
- 為 (a, b, c, d) 時,分別填充上、下、左、右的 a,b,c,d 個像素
-
padding_mode
:填充模式constant
:常數填充edge
:邊緣填充,即邊緣像素會被重復reflect
:鏡像填充,即邊緣像素會被鏡像到對稱位置symmetric
:對稱填充,即邊緣像素會被鏡像到對稱位置,最后一個鏡像也會鏡像
-
fill
:為constant
時,設置填充像素值,(R, G, B) 或 (Gray)
4.2 ColorJitter
# transforms.ColorJitter(
# brightness=0,
# contrast=0,
# saturation=0,
# hue=0
# )
功能:調整亮度、對比度、飽和度和色相
-
brightness
:亮度調整因子- 為 a 時,從 [max(0, 1-a), 1+a] 中隨機選擇
- 為 (a, b) 時,從 [a, b] 中隨機選擇
-
constrast
:對比度參數,同brightness
-
saturation
:飽和度參數,同brightness
-
hue
:色相參數- 為 a 時,從 [-a, a] 中隨機選擇,且 a 的取值范圍為 [0, 0.5]
- 為 (a, b) 時,從 [a, b] 中隨機選擇,且 a、b 的取值范圍為 [0, 0.5]
4.3 GrayScale
# transforms.Grayscale(
# num_output_channels=1
# )
4.4 RandomGradeCrop
# transforms.RandomGrayscale(
# num_output_channels=1,
# p=0.1
# )
功能:依概率將圖片轉換為灰度圖
num_outpuut_channels
:輸出通道數,1表示灰度圖,3表示 RGB 彩色圖p
:概率,0.5表示將圖片轉換為灰度圖的概率為 50%
4.5 RandomAffine
# transforms.RandomAffine(
# degrees,
# translate=None,
# scale=None,
# shear=None,
# resample=False,
# fillcolor=0
# )
功能:對圖像進行仿射變換,仿射變換是二維的線性變換,由五種基本原子變換構成,分別是旋轉、平移、縮放、錯切、剪切
-
degrees
:旋轉角度設置 -
translate
:平移區間設置- 為 (a, b) 時,表示 x 軸和 y 軸的平移范圍均為 [-a, b]
- 為 (a, b, c, d) 時,表示 x 軸平移范圍為 [-a, b],y 軸平移范圍為 [-c, d]
-
scale
:縮放比例(以面積為單位) -
fillcolor
:填充色設置
4.6 RandomErasing
# transforms.RandomErasing(
# p=0.5,
# scale=(0.02, 0.33),
# ratio=(0.3, 3.3),
# value=0,
# inplace=False
# )
功能:對圖像進行隨機遮擋
p
:概率值,執行該操作的概率scale
:遮擋區域的面積ratio
:遮擋區域長寬比value
:設置遮擋區域的像素值,(R, G, B) 或 (Gray),默認為0
4.7 Lamdba
# transforms.Lambda(
# lambda
# )
功能:用戶自定義 lamdba 方法
lambda
:匿名函數,可以把函數作為參數傳遞給另一個函數
5、方法選擇
5.1 transforms.RandomChoice
# transforms.RandomChoice(
# [transforms1, transforms2, transforms3]
# )
功能:從一系列 transforms 方法中隨機挑選一個
5.2 transforms.RandomApply
# transforms.RandomApply(
# [transforms1, transforms2, transforms3],
# p=0.5
# )
功能:依概率執行一組 transforms 操作
5.3 transforms.RandomOrder
# transforms.RandomOrder(
# [transforms1, transforms2, transforms3]
# )
功能:對一組 transforms 操作打亂順序
6、自定義
# class Compose(object):
# def __call__(self, img):
# for t in self.transforms:
# img = t(img)
# return img
二要素:
- 僅接受一個參數,返回一個參數
- 注意上下游的輸出和輸入
# 通過繼承類,實現多參數傳入
# class YourTransform(object):
# def __init__(self, ...):
# ...# def __call__(self, img):
# ...
# return img
示例 — — 椒鹽噪聲:
- 概念:椒鹽噪聲,又稱脈沖噪聲,是一種隨機出現的白點或者黑點,白點稱為鹽噪聲,黑點稱為椒噪聲。
- 產生原因:椒鹽噪聲的產生是由于光照不均勻導致的。光線經過物體時,某些部分會被吸收,而另一些部分會被反射,產生了椒噪聲和鹽噪聲。椒噪聲的大小與光照強度成正比,鹽噪聲的大小與物體表面粗糙度成正比。椒鹽噪聲的產生是隨機的,并不是均勻分布的。
- 解決方法:椒鹽噪聲的解決方法有兩種:一是采用白盒處理,即對圖像進行預處理,去除椒鹽噪聲;二是采用白盒處理,采用數據增強的方法,對圖像進行數據增強,增加椒鹽噪聲。
- 信噪比:信噪比(SNR)是指信號與噪聲的比值,即信噪比越高,則噪聲的影響越小,信號的影響越大。信噪比越高,圖像的質量越好。
class AddPepperNoise(object):"""增加椒鹽噪聲Args:snr (float): Signal Noise Ratep (float): 概率值,依概率執行該操作"""def __init__(self, snr, p=0.9):assert isinstance(snr, float) or (isinstance(p, float))self.snr = snrself.p = pdef __call__(self, img):"""Args:img (PIL Image): PIL ImageReturns:PIL Image: PIL image."""if random.uniform(0, 1) < self.p:img_ = np.array(img).copy()h, w, c = img_.shapesignal_pct = self.snrnoise_pct = (1 - self.snr)mask = np.random.choice((0, 1, 2), size=(h, w, 1), p=[signal_pct, noise_pct/2., noise_pct/2.])mask = np.repeat(mask, c, axis=2)img_[mask == 1] = 255 # 鹽噪聲img_[mask == 2] = 0 # 椒噪聲return Image.fromarray(img_.astype('uint8')).convert('RGB')else:return img
微語錄:自己有了光芒才配得上自己追逐的星星。