深層学習では大量の学習画像が必要であることが一般的ですが、例えば何千枚、何万枚という画像に、正解ラベルをつけて用意をすることは大変な労力を要します。
そこで、一枚の画像から複数の学習画像を生成することで、学習画像を自動的に増加させようというのがData Augmentationです。
Data Augmentationの手法自体は様々なものが考案されていますが、今回は画像を回転させることで学習画像を増加させることを考えてみたいと思います。
以前に投稿した以下の記事の方法とも組み合わせることで、更なる学習画像の増加を狙うこともできます。
目次
今回の環境
- OS : Windows10(64bit)
- Visual Studio 2015 Express
- OpenCV 2.4.11(環境構築済)
ソースコード自体はWindows APIを一部使っているので、Windows環境での実行が前提となります。
ソースコード
今回は特定のフォルダに入っている全ての画像に対し、同一のData Augmentation処理を行い、フォルダに出力するプログラムを書きました。
回転角度については簡単に指定することができるようにしていますが、回転角度自体はランダムではなく、最小角度から最大角度までの間を均等に、出力枚数に応じて分割し、それに応じた角度で出力する形にしています。
つまり、最小回転角度が0度、最大回転角度が120度で画像枚数が4枚なら、0度、40度、80度、120度の回転画像が出力されるような形で実装しました。
特定のフォルダに入っている全ての画像に対し、処理を行う部分については以下の記事を参考にしました。
さて、以下がソースコードです。
今回、対象とする原画像は以下の二枚としました。


処理としては回転だけではなく、回転した後の画像を以下の図のようにクリッピングしています。これは、回転だけを行うとOpenCVでは、画像が存在しなくなった領域が黒で塗りつぶされてしまうことによるものです。

実行すると、以下のように元画像を回転させた画像が大量に出力されます。

最大・最小の回転角度は以下で設定できるので、用途に応じて使い分けてください。
回転による画像枚数は以下で指定することができます、この場合原画像1枚あたり12枚の画像が出力されます。
まとめ
今回は回転処理によって学習画像を増やす処理のC++のプログラムを書いてみました。
この処理で学習画像を増やしたことによる精度への寄与などについても今後調査していきたいですね。
また、ここまでは簡単な処理でのData Augmentationが多いですが、引き続き最新の論文の手法などについても調査、検討していきたいです。