Data Augmentationとは、深層学習などで使う学習画像を増加させる処理のことです。
深層学習では大量の学習画像が必要であることが一般的ですが、例えば何千枚、何万枚という画像に、正解ラベルをつけて用意をすることは大変な労力を要します。
そこで、一枚の画像から複数の学習画像を生成することで、学習画像を自動的に増加させようというのがData Augmentationです。
Data Augmentationの手法自体は様々なものが考案されていますが、ここでは最も簡単かつ一般的と思われるRandom Crop(ランダム切り抜き)とFlip(反転)の処理を行い、学習画像を増加させるプログラムを書いたので、こちらを紹介します。
この簡単な処理を組み合わせるだけでも、相当数の学習画像を増加させることが可能です。
今回の環境
・OS : Windows10(64bit)
・Visual Studio 2015 Express
・OpenCV 2.4.11(環境構築済)
ソースコード自体はWindows APIを一部使っているので、Windows環境での実行が前提となります。
ソースコード
今回は特定のフォルダに入っている全ての画像に対し、同一のData Augmentation処理を行い、フォルダに出力するプログラムを書きました。
Random Cropとしては3×3で合計9枚をクリッピングする形としています。
また、左右反転、上下反転、両方反転を可能とし、これにより反転していないものも含めて4パターンあるため、最大で9×4で36枚の学習画像を1枚の学習画像から作成することができます。
特定のフォルダに入っている全ての画像に対し、処理を行う部分については、
参考記事:フォルダ内の全ての画像ファイル名を取得する方法(C++)
に記載した部分を参考とし、getImageName()という関数を入れています。
以下がソースコードです。
// 各種方向の反転を行うかどうか bool HORIZONTAL_MIRROR = false; bool VERTICAL_MIRROR = false; bool ALL_MIRROR = false;
上記の部分をtrueにすることによって、水平、垂直、両方のそれぞれの反転画像も出力されるようになります。
// 入力画像サイズと、そのクリップサイズ int IMAGE_SIZE = 256; int CLIP_SIZE = 128;
上記のコードはクリップサイズで、いずれにせよ3×3で9枚の画像が出力される形となっています。
実際にinput_imageのフォルダに2枚の画像を置き、MIRRORを全てtrueとしてAugmentationを実行した例を示します。
このように、2枚の画像から大量の画像が生成され、
それぞれがクリッピングや反転処理等が施されたもので、全てが違う画像となっています。
まとめ
Data Augmentation自体には様々なやり方があり、現在進行形で多くの論文も出されています。
今後は論文も読み進めつつ、自分で様々なコードなどを実装していけると良いなと思います。