[ keras ] ImageDataGenerator で画像データを加工して増やす( データ拡張 )

[ keras ] ImageDataGenerator で画像データを加工して増やす( データ拡張 )

本記事では、 keres ライブラリの ImageDaraGenerator を使用して、画像データを加工した上で画像の数を増やす方法について解説していきます。

なぜ画像を加工するのか?

まず、なぜ画像を加工して増やさなければいけないのかについて考えます。

機械学習において特に重要なのは、構築したモデルに対して学習を行わせるフェーズです。
そこではモデルに大量の画像を読み込ませ、そこから対象の特徴量を抽出する必要があります。

ここで読み込ませる画像が少ないと、対象を識別するための特徴量を適切に定義出来なくなる可能性があります。
しかし現実問題、何百、何千枚もの画像を個人レベルで用意するのは難しいことです。

そこで考え出されたのが、データ拡張という手法です。

データ拡張とは、画像データに加工を加えた上で複製することです。
このようにして生成された画像は、元のデータと本質は同じでありながらも異なる特徴量をもつデータへと変質するためモデルに訓練用データとして渡すことができ、結果的に少量のデータでもモデルに学習を行わせることを可能にします。

そのような理由が、画像の加工及び複製へのモチベーションとなっています。

keras とは?

keras は、pythonで作成された機械学習用のライブラリです。
シンプルなモジュール構成となっており、モデル構築なども簡単に行えるよう設計されています。

2つの実装が存在しますが、今回使用するのは、 TensorFlow に統合されたkerasです。

ImageDataGenerator とは?

kerasライブラリに用意された、データ拡張( Data Augmentation ) 用のクラスです。
画像データの角度を変更したり、移動させたり、回転させたりなどの処理を加えることで、少量の画像データから大量の亜種画像データを生成することができます。

実装

今回はピンポイントの技術解説なので、早速実装に入っていきます。

先に述べたように、ImageDaraGenerator では画像に対して様々の加工処理を施すことができます。

が、最初から種々の加工を施してしまっては変化がよく分からないことになってしまうので、まずは1点だけ加工する実装を行った後、多数の点を加工する実装とに分割したいと思います。

 

今回使用する画像データは、下記の1枚です。
亀万年の丸眼鏡。とっても良いですね。

実装A. 1枚の画像に対して回転処理を加え、9枚の画像を生成する

タイトルの通りです。
大きな流れは次の通りです。

  • 画像の読み込みと整形
  • ジェネレータの定義
  • ジェネレータの生成、画像の生成、生成された画像の保存
  • 生成されたデータの表示

注意するところとしては、ジェネレータは4次元の配列形式でしか画像データを受け取ってくれない、というところでしょうか。

1枚の画像データを numpy の array() で配列化すると、 (高さ、幅、チャンネル) の3次元配列を返却します。
複数の画像であればこの3次元データを束ねることで4次元になりますが、1枚しか無い場合は、 numpy の newaxis() メソッドで次元を追加してあげましょう。
これにより、(1、高さ、幅、チャンネル)  の4次元配列となり、ImageDataGenerator に渡すことの出来るデータになります。( # 2 の部分)

 

 

 

このように、1枚の画像から9枚の画像が生成されました。

似たような画像が多いですが、よく見てみると画像の角度が微妙に異なるのがわかります。
これは加工条件として “回転域を -50° ~50°” に設定したためであり、その域内でランダムに画像が加工された結果です。

ランダムに、というのが微妙にポイントです。

 

実装B. 1枚の画像に対して複数の変更処理を加え、9枚の画像を生成する

では加工条件を複数追加してみます。

先ほどのプログラムのジェネレータ定義部分を次のように書き換えた上で実行してみます。

加工ポイントはインコードで記述しています。

 

 

チャンネル加工の影響に目が奪われますが、それ以外についてもよく見てみれば、拡大率が異なったり、表示位置が異なっていたりしていることが分かります。

 

まとめ

このように、keras の ImageDataGenerator を使用することで画像に対して加工処理を加えることができます。

今回は画像を9枚に複製したので、加工を行わなかった時に比べ、モデルの学習に当たって必要なデータを9倍量で用意できたことになります。

もちろん完全に異なる画像データと比べて取得できる特徴量は少ないため最善の方法では無いものの、画像データが少ないときに取るべき手段として優れたものであることが分かります。

 

以上。

kerasカテゴリの最新記事