顔検出、顔識別(顔認識)に挑戦してみる
AI(人工知能)を使用して画像から顔を検出して、その顔を認識する。
結論から言うと、
をアウトプットしました。
今回は、顔でしたが「自動車を検出して、車種を特定」など他のケースにも置き変えることが可能です。
以降は私の奮闘記です。どなたかのご参考になると幸いです。
1. データ収集
318人の芸能人、有名人の写真を3181枚、Googleの画像検索から収集。
日数 | 2日 |
データ構成 | 約10枚 / 人 |
収集する際にはWindowsアプリを作成して、コピペとボタン1つでファイルが作成されるようにした。(日数にはラベリング作業も含まれる)
日本の著作権法では、「情報解析を行うために著作物を複製すること」が、営利・非営利問わず認められているのだ。世界にもまれな規定だ。
※引用元:「日本は機械学習パラダイス」その理由は著作権法にあり
2. Object Detection API
このデータでカップラーメンと同様にObject Detection APIを試してみる。
顔検出の精度は抜群。でも顔認識は使い物にならない。
3. MNISTで試す
MNIST Converterを作成して、データセットを28x28にする。精度は0.01で全くダメ。そもそも318種類というクラス数が多すぎる。
MNIST Converter付属のgrowth.exeで1枚の画像を10倍、30倍、50倍に「水増し」しても効果なし。
この時点で気づいた。1人10枚の写真じゃ、データ数が少なすぎる。
4. 新規にデータ収集
手動で収集は疲れたので「Bing画像検索API」で自動で画像を収集する。
15人で4319枚を収集した。
日数 | 1時間以内 |
データ構成 | 約287枚 / 人 |
で、収集した画像から顔を切り取るのは2で作成したモデルを使用した。
その後、それらの顔画像をMNIST Converterで28x28のデータセットにしました。CNNで試すと精度は0.63。クラス数を減らすと0.75ぐらいある。
なるほろ、なんとか実用レベルになりました。
5. 最終的に
「画像から顔を検出するAI」(SSD)で顔を切り出して、その顔を「顔を判別するAI」(CNN)で判定する事としました。AIは2種類です。
スマホで学習済みモデルを動作させるにはTensorFlow Mobileのデモアプリのインストール、TensorFlow MobileのHello Worldをご覧ください。