記錄一下最近使用的影像資料增強工具 - Augmentor,可用來做訓練圖像生成與雜訊添加…等
簡介
Augmentor Logo (圖片來源: Augmentor)
根據文件簡介,Augmentor 是一個 Python Package,用於幫助機器學習任務的影像增強與生成。它主要是一種資料增強工具,但也提供了些基本的影像預處理功能。
影像處理主要功能包含:透視偏斜(Perspective Skewing)、彈性變形(Elastic Distortions)、 旋轉(Rotating)、推移(Shearing)、裁剪(Cropping)與鏡像(Mirroring)。當然最基礎的亮度、對比也有支援。
由於影像增強通常是多階段的處理過程,因此 Augmentor 使用採用基於 pipeline 的處理方式,按使用者所選擇處理動作,依序添加到 pipeline 中。執行過程中,影像會被送進 pipeline 中,依序套用各個增強操作,最終形成新的影像。
另外,每個動作都可自定義套用機率,在影像經由 pipeline 時,會按機率決定是否套用該操作,以增加資料的多樣性。
↑ 以上全出自於 Augmentor文件, Google 翻譯友情贊助 XDDD
安裝
我是透過 pip 安裝,所以還挺簡單,一條指令就搞定:
1 |
|
使用方法
純圖片增強
幾本上,就只有三個步驟:
首先,初始化 pipeline 物件,並指向所需處理影像的目錄
1 |
|
接下來,添加所需的影像增強操作
1 |
|
最後,指定增強後圖片數目總量
1 |
|
含圖片與標籤的增強
但通常在在進行模型訓練時,所取得資料不只圖片本身,還會有圖片相對應的標籤,此時 Augmentor.Pipeline
就不適用,應該改用 DataPipeline
。
但需注意的是, Pipeline
所傳入的參數是圖片位置,但 DataPipeline
傳入是圖片。
1 |
|
原本以為這樣就可行了,但卻發現影像過了 pipeline 後,套用的影像增強不如預期,詳讀文件也沒找到可用的訊息,只好去細看他們所提供的範例。
果然在第五行的的程式碼中找到蛛絲馬跡,範例中是這樣的:
1 |
|
發現它讀入圖片後,外面有多一層 array,所以當這個步驟結束時,預期的維度會是 3 維,而非我的 2 維。依照這個邏輯,再將圖片放入 DataPipeline
前,先擴展維度:
1 |
|
最後再取出增強後圖片,與相對應的標籤。別忘了,記得把剛剛擴展維度的維度降回去:
1 |
|
如此出來的增強影像,看起來正常多了。
自定義增強器
說到增強,我想讓我的模型多看看不同色調下的圖片,所以翻了翻文件,好不容易找到 HSVShifting
,結果竟然…
CURRENTLY NOT IMPLEMENTED.
CURRENTLY NOT IMPLEMENTED.
CURRENTLY NOT IMPLEMENTED.
登愣!!
只好來研究如何自定義增強器
建立一個新的操作子類別
在建立一個新的操作子類別時,有四個地方需要注意的
- 子類別要繼承
Operation
。 - 初始化時,同時記得呼叫父類別
__init__()
。 - 重載(Overload)
perform_operation()
,以自定義新的增強。 perform_operation()
的回傳資料型態必須是PIL.Image
。
快速實做版簡單的 HSVShifting
進行驗證:
1 |
|
注意,perform_operation 傳入的會是圖片陣列,而非單張圖片,別被文件中的 image 這個字給騙了!實做時可以與其他功能的實做進行對照。
將操作子類別加到 pipeline 中
呼叫 add_operation
來進行添加:
1 |
|
如此一來就將自定義的增加入 pipeline。