C++でData Augmentationをやってみる(Random CropとFlip編)

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自体には様々なやり方があり、現在進行形で多くの論文も出されています。

今後は論文も読み進めつつ、自分で様々なコードなどを実装していけると良いなと思います。

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする