ディープラーニング: フレームワークDeZeroで画像認識をする方法③
画像認識の続きです。前回、過学習していると思われる結果が出てしまい、過学習を抑制するために訓練データを水増しするという方法を行なってみましたが、結果は芳しくなく、今回はその後、色々やってみた結果を書いていきます。
データの修正で過学習が抑えられるか
訓練データの縦横比を修正した場合の結果
まず、考えてみたのが、訓練データの縦横比です。モデルとしてVGG16を使用しているのですが、 DeZeroでは、VGG16モデルの中にpreprocess()と言う関数がありimageサイズを変換したりデータの形状を変更したりしてくれています。
ここでイメージサイズが224*224の正方形に変換されます。今まで訓練データに使用してきた画像は拾い画像であるため縦横サイズも決められたものではなくバラバラです。
このpreprocess()と言う関数で正方形にしてくれるのですが、ここで問題が出てきます。縦横サイズがバラバラな画像を単純に正方形にリサイズすると、例えば顔幅が広がったり、縦長になってしまったりしてしまいます。
結果として、ちゃんとした特徴量が取れてないんじゃないかなと考えました。
なので、まずは、元々の訓練データを縦横のアスペクトを変えずに拡大縮小し、足りない部分は灰色背景で補うように変換してみました。
このように訓練データを全部編集した後、モデルに渡してみた結果が下記になります。
※水増し話で各メンバー50枚ずつで6人分、300枚のデータで行いました。
※最後にテスト結果で50%を超えてくれました。損失率等は下記になります。
と言っても50%を超えた程度なのか。。。
ただ、画像のチェックに関しては
この画像に対して、判定した解答が
成功でした。悪くないのかな。。
訓練データを水増しした場合の結果
少し上がってきたのでさらにこの状態で水増しを各メンバー50枚ずつ行い(角度変更20枚、ミラー20枚、白黒20枚)再度実行した結果が下記になります。
下がったし。。。。
テストデータのサイズを修正した場合の結果
現在のコードではテストデータに対してもpreprocessが掛かるようになっています。つまりテストデータの画像も224*224のサイズに変更されてしまいます。つまりつまりテストデータの各メンバーの顔が拡大したり縮小したりすると言うこと。。これが悪いのかと思い、ひとまずテストデータもあらかじめ224*224に縦横比を考慮してサイズを変更し、足りない部分を補完して実行してみました。
テストデータで一瞬これまでの最大値52%を記録しましたが最終は50%。
こちらがレイだという判定は正解!
こちらもガウルと判定で正解!
しかし、こちらが。。
ガウルと言う判定で不正解!
リズは以前、金髪だったのですが、現在は黒髪。ガウルは今回のAfter likeで金髪になっているので訓練データ内の画像が金髪だったり黒髪だったりするのでそれで迷うのだろうか。全部白黒で出した方が良いのか!
訓練データを白黒画像のみにした場合の結果
下記は訓練データを全て白黒にした場合の結果です。
こちらの画像はやはりガウルと判定。。
こちらはリズと判定し正解!
その他107枚の画像で判定したところ正解が74枚でした。
結論としては正解率は70%くらいなのかなと言う感じです。
データ画像の修正等はここまでにして、現在VGG16を使用していますが、このモデルをそろそろいじっていこうと思います。