torchvision 是 torch 中計算機視覺庫,提供了3種類型的接口,包括 datasets、transforms、model,其中 transforms 封裝了各種圖像增強的方法
裁剪
transforms.CenterCrop(size):從圖像中心裁剪圖片
- size:裁剪尺寸
transforms. RandomCrop:從圖像中隨機裁剪出指定尺寸的圖片
- size:裁減尺寸
- padding:設置填充大小,默認為 None;可取整型和tuple,
// 當為整型 a 時,表示上下左右填充 a 個像素;
// 當為 (a,b) 時,代表上下填充 b,左右填充 a 個像素;
// 當為 (a,b,c,d) 時,代表 左上右下 填充 abcd 個像素 【順時針】
- pad_if_need:若圖像尺寸小於 裁剪 size,則需要填充,默認 False
- padding_mode:填充模式,共4種模式,默認取 constant
1. constant:像素值由 fill 參數指定
2. edge:像素值由圖像邊緣像素決定
3. reflect:鏡像填充,最后一個像素不鏡像,如 圖像像素為 [1,2,3,4],則鏡像填充為 [3,2,1,2,3,4,3,2], 邊緣像素 1 4 不鏡像
4. symmetric:鏡像填充,最后一個像素也鏡像,上例鏡像填充為 [3,2,1,1,2,3,4,4,3,2]
- fill:填充值,當 padding_mode 為 constant 時有效,默認為 0
transforms.RandomSizeCrop:隨機大小 長寬比 裁剪圖片
- size:最后生成的圖像尺寸
- scale:隨機裁剪面積比例,默認 (0.08,1)
- ratio:隨機長寬比,默認 (3/4,4/3)
- interpolation:插值方法,PIL.Image.NEAREST、PIL.Image.BILINEAR、PIL.Image.BICUBIC
transforms.FiveCrop:在圖像的四角和中心裁剪出指定尺寸的 5 張圖片
- size:裁剪尺寸
transforms.TenCrop:在 FiveCrop 的基礎上,並對這 5 張圖片進行水平或者垂直翻轉,共10張
- size:裁剪尺寸
- vertical_flip:是否進行垂直翻轉,若為 False,進行水平翻轉
翻轉 Flip 和 旋轉 Rotation
transforms.RandomRotation:隨機旋轉圖片
- degrees:旋轉角度,當為 a 時,在 (-a,a) 之間選擇旋轉角度,當為 (a,b) 時,在 (a,b) 之間選擇旋轉角度
- resample:重采樣方法,默認 False
- expand:是否擴大圖片,默認 False;旋轉后圖片size不變時,部門圖片會丟失,此時可選擇 擴大圖片,以包含丟失圖片
- center:以該點為中心進行旋轉
transforms.RandomRotation(30, center=(0, 0), expand=True)
圖像變換
transforms.Pad:對圖像邊緣進行填充
- padding:設置填充大小
// 當為整型 a 時,表示上下左右填充 a 個像素;
// 當為 (a,b) 時,代表上下填充 b,左右填充 a 個像素;
// 當為 (a,b,c,d) 時,代表 左上右下 填充 abcd 個像素 【順時針】
- padding_mode:填充模式,共4種模式,包括 constant、edge、reflect、symmetric,默認取 constant 【具體含義見上文-裁剪部分】
- fill:當 constant 時,設置填充像素值 (R,G,G) or (Gray)
transforms.ColorJitter:調整亮度、對比度、飽和度、色相
- brightness:亮度調整因子;當為 a 時,從 [max(0,1-a),1+a] 中隨機選擇,當為 (a,b) 時,從 [a,b] 中隨機選擇
- contrast:對比度參數,方法同 brightness
- saturation:飽和度參數,方法同 brightness
- hue:色相參數,色相取值 在 -0.5 到 0.5
// 當為 a 時,從 [-a,a] 中選擇,注意 -0.5<a<0.5,當為 (a,b) 時,在[a,b] 中選擇
transforms.Grayscale:轉成灰度圖
- num_output_channels:輸出通道數,只能取 1 或者 3
transforms.RandomGrayscale:以一定概率轉成灰度圖
- num_output_channels:輸出通道數,只能取 1 或者 3
- p:概率值,被灰度的概率,默認 0.1
transforms.RandomAffine:對圖像進行仿射變換,仿射變換是二維的線性變換,由5種基本原子變換構成,包括旋轉、平移、縮放、錯切、翻轉
- degrees:旋轉角度,必選參數
- translate:平移,默認為 None
- scale:縮放,默認為 None
- shear:錯切角度設置,有水平錯切和垂直錯切,默認為 None
// 若為 a,僅在 x 軸錯切,錯切角度在 (-a,a) 之間;
// 若為 (a,b),則 a 代表 x 軸錯切角度,b代表 y 軸錯切角度;
// 若為 (a,b,c,d),則 ab 設置 x 軸角度,cd 設置 y 軸角度;
- resample:重采樣,有 nearest、bilinear、bicubic,默認 False
- fillcolor:填充像素,默認為 0
transforms.RandomErasing:對圖像進行隨機遮擋
- p:概率,執行遮擋操作的概率;
- scale:遮擋區域的面積;
- ratio:遮擋區域的長寬比;
- value:遮擋區域的像素值,(R,G,B) or (Gray)
- inplace:默認 False
transforms.RandomErasing(p=0.5, scale=(0.02, 0.33), ratio=(0.3, 3.3))
當 value 取字符串時,采用隨機像素進行遮擋
匿名函數
transforms.Lambda:用戶自定義圖像處理的方法,如 CenterCrop
組合操作
transforms.RandomChoice:從多個 transforms 方法中隨機選一個
transforms.RandomChoice([transforms1, transforms2, transform3])
transforms.RandomApply:依據概率執行一組 transforms 操作
transforms.RandomApply([transforms1, transforms2, transform3], p=0.5)
transforms.RandomOrder:對一組 transforms 操作進行亂序,亂序處理圖片
transforms.RandomOrder([transforms1, transforms2, transform3])
transforms.Compose:順序執行一系列 transforms 操作
transforms.Compose([transforms1, transforms2, transforms3])
自定義 transforms
transforms.Lambda 是自定義圖像處理的方法,如 Resize;
自定義 transforms 是自定義 transforms 系列操作,如 RandomCompose;當然也可以是一個操作;
先看下 pytorch 的 Compose 方法的實現
class Compose(object): def __call__(self, img): for t in self.transforms: img = t(img) return img
類比實現自定義:處理椒鹽噪聲
椒鹽噪聲:又稱脈沖噪聲,是一種隨機出現的白點或者黑點,白點稱為鹽噪聲,黑點稱為椒噪聲
信噪比:Signal-Noise Rate,SNR,衡量噪聲的比例,圖像的信噪比是圖像像素的占比
使用注意事項
1. 上述所有方法是一個類,參數都是初始化參數,然后都以對象的形式存在,使用時調用 __call__ 方法處理圖片
2. 上述所有方法輸入都是圖像,輸出也是圖像
3. 輸入網絡前要轉換成 Tensor
transforms.ToTensor():將 PIL Image 轉換成 Tensor 對象,會自動將 [0, 255] 歸一化到 [0, 1]
transforms.Normalize:標准化,注意 只有 Tensor 才能標准化,img 不可以,故 Normalize 之前一般都有 ToTensor
方法總覽
圖像增強的原則
使得訓練集盡可能接近測試集
例如,我們要區分第四套人民幣的 1 元 和 100 元,很容易得到准確率很高的網絡;
那么該網絡是否能識別第五套人民幣的 100 元,測試結果是基本上都是別成了 1 元,因為顏色很像;
假如我們把訓練數據進行灰度處理,去掉顏色的影響,重新訓練的模型也能准確預測 第五套人民幣的 100 元