機械学習で日向坂46のメンバーを顔認識・分類してみた【Aidemy成果】

やっほう!機械学習を学習中のテツヤマモト(@okapo192)です。

ここ2ヶ月ほど、プログラミングスクールのAIdemy Premiumにて機械学習を勉強していました。

【Aidemy Premium Planの評判】AI未経験からの体験談を本音で書く

2019年4月5日

 

今回はその成果物第一弾として、「日向坂46のメンバーを機械学習で画像認識&分類するプログラム」を共有します。

これから機械学習を学ぼうと考えている人や、似たようなプログラムを組もうと考えている人に参考になれば嬉しいです。

テツヤマモト
超余談ですが、漫才師のオードリー好きから派生して、日向坂46にどハマりしてます(冠バラエティのMCがオードリー)。

アイドルにハマるの初めてなんですけど、みんな頑張り屋で元気もらえるんで、疲れた男性陣にはオススメ。松田好香ちゃんが好き。

スポンサーリンク

1. Google画像検索を用いてスクレイピング

まず、各メンバーの画像データの収集は、Google画像検索を用いて行うことにします。

Bing APIも試してみたのですが、こちらはメンバーによっては画像が十分ではなく、十分なデータ量を確保できませんでした。

21人分の顔認識となると難易度が高い上に、猛烈に学習時間がかかるので、今回はメンバーのうち5人を顔認識して分類していきます。
 

▼アウトプットの様子です。100件の画像をダウンロードするのですが、10件ほどエラーが出てしまうようです。ひとまず、スルーします。

僕の場合、ローカル環境・jupyter notebookにて、Pythonを動かしていました。

大量の画像を保存することになるので、容量が気になる方は、外付けのハードディスク等を用意しておくと良さそうです。

 

▼上手く処理が終了すると、下の画像のように、メンバーごとの画像フォルダに90枚ほどの写真が保存されるはずです。

2. 顔認識してトリミング

次に取得した画像をopenCVで顔認識させて、輪郭でトリミングしていきます。

画像によっては顔認識ができなかったり、複数人が写っていたりするので、顔認識&トリミングが成功・失敗ディレクトリに分けて保存します。

▼アウトプットの様子です。残念ながら全体の30%ほどで顔認識にミスが出てしまうようです。

特にアイドルの画像特性なのか、加工アプリを使った写真なんかは顔認識しづらいようでした汗

5行目のカスケードファイルについては、macの場合、openCVをインストールした際に「/usr/local/Cellar/opencv/(バージョン)/share/OpenCV」にあります。

ここからコピーして、プロジェクトディレクトリに別途配置すると良いです。

参照:opencvで顔認識しようとしたらカスケードファイルが見つからなかった

 

▼処理が終了すると、faceディレクトリに、顔部分でトリミングが行われた画像が保存されるはずです。

▼同様に、mistakeディレクトリに顔認識に失敗した画像が保存されていきます。

ここからとても面倒なのですが、目視で画像データの確認作業を行いました。

  • ①faceディレクトリに、違うメンバーの写真が混ざっていないか確認
  • ②faceディレクトリに、顔認識が上手くできていない画像はないか確認
  • ③mistakeディレクトリの画像を、手動でトリミングして、faceディレクトリに追加

Google画像検索でのデータ収集なので、どうしても関係のない写真は多くなってしまいますね…。

手動トリミング作業は省いても良いですが、今回は対応できない量でもなかったので、手動(Macのプレビューアプリ)でトリミングしていきました。

スポンサーリンク

3. 画像の水増し

前項で画像にふるいをかけると、メンバー1人あたり80枚弱の画像が集まりました。

少しデータ量が足りないので、水増し処理をして、画像の実質枚数を増やします。

画像認識プログラムを作る際には、非常に重要なワンポイント処理です。

▼処理の様子です。

こちらで元々の画像を反転させるなり、見た目を変えるなりして、5倍ほど増やせました。

画像の名前にズレが出ているはずなので、連番を揃える処理も最後に入れています。

 

▼ここまでの処理が全て終わると、メンバー1人あたり700枚近くの画像が集まったはずです。

4. 学習・テストデータの準備

ここまででデータを集められましたので、ここから学習・テストができるよう前処理を加えます。

まずは各メンバーごとに画像ファイルを読み込み、70*70のサイズにリサイズします。

▼実行結果。リサイズの際に少しエラーが発生してしまうのですが、大した枚数ではないのでここはスルーします。

何か対処法が見つかれば、後日対応してみようと思います。

 

次に、前のコードで配列boxに格納した全画像データを、学習用・テスト用に分けます。

こちらは最終的な画像の枚数に応じて、データ量を適当に調節すると良いです。

なんだかんだで最終的には、一人当たりの500枚弱のデータで学習を進めることになりました。

スポンサーリンク

5. モデル学習

さて、ようやく機械学習に入ることができますね…。

学習にはtensorflow, VGG16を用いた転移学習をkerasで実装していきます。

▼実行結果はこんな感じです。何かと試してみたのですが、過学習の傾向がどうしても出てしまいます。ひとまずギブアップですが、改善の余地はありそう。

最終的に、テストデータの精度が90%くらいまで行きました。

パラメータは僕が見つけた限りでは、上記モデルが最善でした。

6. 新しい画像を読み込ませる

せっかくなので学習・テストにも使っていないデータで予測をしてみます。

今回は、日向坂46の5人のメンバーの分類を行ったので、それぞれ5枚ずつ、計25枚の未使用データを当てはめてみます。

▼結果、出力はこんな形になりました。

正答率は44%ですね…。ん?どうしてしまった?

どうやら各メンバーによって正答率の差が大きいらしく、「影山」と「加藤」と「井口」に関しては、ほぼほぼ認識できていない結果に。

うーん、テストデータでは90%の精度が出ているのにおかしいですね…。

今回の課題・改善策について

おそらく今回の問題点は、水増し処理により似たような画像データが増えすぎたことにあるようです。

モデル自体の精度は高くなったものの、未知のデータに対して弱い、汎化できていないモデルと言えそうです。

 

ここからモデルの精度を上げる改善策としては、

  • 単純にデータ量を増やす
  • openCVで、顔のパーツだけを認識して分類してみる

この辺りは対応できそうなので、時間を作って試してみようと思います。

 

機械学習はまだまだ手探りで学んでいるところです。

Aidemy Premiumのチューターの方と話してみても、ここからは経験による直感や、根気が大事になってくるみたいですね汗

何か改善できれば、別途アウトプットしていきます。

 

▼参考にしたアウトプット

 

▼AI・機械学習を学んだ過程は、こちらでまとめています。

【Aidemy Premium Planの評判】AI未経験からの体験談を本音で書く

2019年4月5日

AI・Python特化のプログラミングスクール4選【未経験から就職可】

2019年3月14日

ABOUT

旅好きWEBマーケター🌏 北大経済▶︎旅行誌編集▶︎フリーライター▶︎世界一周36ヶ国▶︎海外ノマド2年半(ブログとサイト制作) ▶︎旅行系IT企業でWEBマーケ担当 ■副業でブログ(最高月22万PV)とYouTubeとかやってる ■英語とスペイン語が少しできる ■オードリーのオールナイトニッポンのヘビーリスナー ■詳しいプロフィールはこちら