PyTorch【9】-圖像增強


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 元 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM