ディープラーニング:Kerasを使ったオーグメンテーション

畳み込みニューラルネットワーク(CNN)による画像処理では、多少の平行移動については耐性があります。

よくある機械学習のサンプルで、「手書き文字」を「粗い画素数」で判定する場合は、平行移動の考慮はそれほど必要がない場合もあります。ただ、産業用の画像判定など、高精細なデータになると、CNNの平行移動の耐性はほぼ無くなります。

その場合、想定されうる量の画像の移動・回転・拡大などの処理をおこなって、それらも学習用データとすることで、必要な耐性をもつ検出器になります。

この画像処理特有の前処理を、オーグメンテーション (augmentation) といいます。「画像水増しデータ」と呼ぶ人もいます。

この画像処理はPythonで実装することも可能ではありますが、OpenCVやPillowのライブラリを使うと呼び出しだけで処理できます。ただ、それでも面倒くさいのと、オリジナルな画像を別管理していないと学習データに混ざってしまって、水増しデータと元データが判別できなくなれば、別品種の画像などを入れ替えることが不可能になってしまう問題があります。(*^▽^*)

 

(現)Kerasでは、「機械学習専用」のオーグメンテーションがすでに実装されています。

「機械学習専用」という理由ですが、学習における「ミニバッチ」の際、動的に必要なオーグメンテーション画像を生成するので、元の実データの数を増やすことなく、耐性のための画像水増しデータをランダムに作って学習してくれます。

水増し画像の種類は、おおよそ、考えうるだけの種類が揃っています。

「繊維」や「部品」の自動の画像検査の場合、カメラに対して、物体の方向性が回転したとしても限られているケースが多いのですが、オーグメンテーションで耐性を持たせるのは、カメラに撮影される物体のばらつきの範囲(例えば、±10度など)にとどめることができます。

具体的にはImageDataGeneratorクラスが担っています。詳細はこちらです。

https://keras.io/preprocessing/image/

 

耐性がつく、前処理の実装量が減る、といったことだけでなく、水増しデータと実データが「混在」しないことで、メモリやディスクの消費量が減り、AIを再学習、機械装置をアップデートする速さにつながります。

よろしかったら活用してみてください。