CNNで男女識別器を作るまで【n増し~モデル作成まで】

機械学習

概要

男女識別アプリケーションの2回目です。

前回、データのスクレイピング ~ 顔エリアの抽出 を実施したので今回はこのデータを利用してCNNを使った男女識別器を作成していきます。

データ収集などの方法については前回の記事をご参照ください。


顔データの水増し

データのインポート

まずは、顔画像が保存されている場所を設定します。

教師データ、テストデータの設定をします。



データの水増し

前回用意した画像は

  • 男性 ・・・ 252枚
  • 女性 ・・・ 253枚

と、CNNで学習するにはn数が少ないため、データの水増しを行います。

データの水増しは、教師データの画像を回転させたり、反転させたりすることで同様の画像から複数の画像を生成していきます。

自分は手動で回転させましたが、KerasのライブラリにはImageGeneratorというデータの水増し機能が備わっているみたいです。(Keras ImageGenerator

使ってみたい方は参照ください。

おそらく処理が完了しました。最後に処理された画像を確認してみましょう。


出力結果

女性の画像が30度ほど傾いてます。おそらくできてると思われます。

念のため、教師データ、テストデータのデータ数を確認します。


教師データのみ、データ数が増加してます。これで水増し完了です。


モデル作成

テスト、教師データの整理

テストデータと、教師データをnumpy方式に変換します。

モデル作成

モデル作成は以前の記事に使ったKerasを用いて行います。

まずはインポートから。

次にCNN(畳み込みニューラルネットワーク)を実装していきます。

モデルについては以前MNISTの記事で使ったものを参考に作ってます。


accuracyもlossもあんまりよくなさそうです。

学習の過程を見ていきましょう。


学習が進むごとに、テストデータのlossが増えていっていて明らかに過学習していることがわかります。

これはいかんので、過学習に対応したモデルを作成しなおします。


モデル再作成

前回の結果を活かして、過学習対策をしたモデルに変更します。

対策として今回は下記を追加することにします。

  • Dropout層の追加
  • L2正則化項を追加

結果は上記のようになりました。(グラフ描画のコードは割愛)

多少過学習はましになりましたが、20回目くらいでlossが高くなってきているので同様のモデルで20回で学習を打ち切ってみます。

少しAccuracyもlossも少し上がりました。それでも精度としてはあんまりですが、とりあえず学習の結果を保存します。




結果の考察と次したい事

考察

男女識別器の作成を行いましたが、精度は8割弱というあんまりな結果でした。

この原因についてのざっくり考察ですが、下記の二点が主な原因かなと考えられます。

  • 学習に利用した画像が、人種、年齢、背景などに統一性がなく多様であること。
  • 教師データの元画像のn数が200枚程度しか存在しないこと。



n数については回転、反転などを利用して水増しを行っているのですが、水増しされた画像に統一性がないので、精度も上がりにくかったのではないかと考察してます。(レディガガ画像も多いのも関係あるかも。)

これ以上精度を上げるためには、

  • 学習に使う画像を限定する。(20代の日本人 など)
  • 画像の限定はせず、データ数増やしてゴリ押す。



どっちかが必要だと思いました。時間とやる気があったら挑戦してみます。(やらんやつ。)

精度向上のアイデアなど詳しい方おられたら、コメントなどで教えていただけると幸いです。お待ちしてます。



なおこの考察は、同程度の画像の枚数でオバマとスモーリングの分類に成功しているnishipyさんの記事を参考にしてます。

似てる人の分類だと画像のブレがなくてやりやすいのかもですね。

機械学習でオバマとスモーリングを判別したい-後編-
Nishipyある界隈で似ていると評判のオバマとスモーリングを、機械学習を使って判別します。後編では、前編で用意した画像を用いて、CNNを学習していきます。1. はじめに1.1. 背景詳しくは、前編の記事をご覧ください。1.2. 今回やりた




次したい事


・モデルの精度上げる

・アプリケーション化


どっちかします。

コメント

タイトルとURLをコピーしました