ディープラーニングで美人女優の顔検出に挑戦

ディープラーニングで美人女優の顔検出に挑戦

美人女優で学習モデルを作成

こんにちは。

AI coordinatorの清水秀樹です。

以前紹介したcifar10を使った学習モデルのモノマネで、自分で準備した画像から学習モデルを作成することに挑戦したので、その内容を紹介します。

画像集めから顔を識別するところまでの内容を紹介しますので、自分で準備した画像で学習モデルを作成してみたい方はぜひ参考にしてみてください。

 

参考にした書籍

これからDeep Learningの勉強をするなら、こちらで紹介する書籍が参考になります。

 

テスト環境

macOS Sierra

Anaconda3-4.2.0-MacOSX-x86_64

python 3.5.2

opencv3 3.1.0

tensorflow-0.12.1

keras 1.2.2

 

まずは画像集めから

これが一番大変かもしれません。

今回は美人女優の顔を識別できる学習モデルの作成にチャレンジしたいので、どうやって画像を大量に集めるか考える必要があります。

 

手っ取り早い方法はネットから画像検索すれば良いのですが、いちいち一枚づつ保存するのは非常に面倒かつ非効率です。

こういう時にpythonでスクレイピングができる方は羨ましいですね。

筆者は頑張ってスクレピングに挑戦しましたが、上手くダウンロードできず諦めました。

今回は学習モデルの作成と顔検出が目的ですので、スクレイピングについてはいずれまた挑戦したいと思います。

 

画像集めについてはfirefoxのプラグイン「FlashGot Mass Downloader 」が便利です。

プラグインのインストール方法とプラグインを使った画像のダウンロード方法の説明はここでは割愛します。

ググって頂ければすぐにわかると思います。

 

今回はこのfirefoxのプラグインで画像を集めました。

集めたサイトはgoogleの画像検索からです。

今回集めた画像は、剛力彩芽さん、佐々木希さん、上戸彩さん、新垣結衣さん、渡辺麻友さんの計5名の画像です。

どうせ画像を集めるなら美人さんが良いと思いまして・・・・

ただ、こうやって画像を並べてみるとみんな似たような顔してますね。

そう思うのは筆者だけかもしれませんが。

 

画像が似ているのでマイクタイソンやボブサップの画像も混ぜ込もうと思いましたが、機械学習こそ似た画像をしっかり識別できるはず!と判断し、あえて明らかに顔の形が違う人は含めず、上記5名で学習モデルを作成することにしてみました。

 

顔部分のトリミング

画像を集めたら、顔部分のトリミングを行います。

大量画像からの顔部分のトリミングについてはこちらの記事を参考にしてみてください。

この記事ではOoenCVの顔検出でトリミングを行いますが、顔以外もトリミングされてきてしまいますので、不要な画像は後から人力で削除する必要があります。

 

これも結構大変。

頑張ってやりましょう。

 

トリミング後の顔画像は少なくとも100以上あると良いでしょう。

画像は多いに越したことはありませんから。

 

画像の増幅と数値データへの変換

画像の増幅といっても、ただ無駄に同じ画像を増幅するわけではありません。

画像の角度を変更したり、反転させたりしてデータの数を増やします。

そうすることでディープラーニングする際のインプット画像を増やし、学習モデルの精度を上げることができるようになります。

 

また、機械学習させるためには画像データを数値データへ変換しておく必要があります。

cifar10も画像データの集まりというよりは、画像データを数値データへ変換したデータセットになっています。

画像データのままでは機械学習に使えませんので、画像を数値データへ変換しましょう。

 

以下のソースコードは画像を増やしつつ、数値データへの変換もやってくれます。

ソースコードを実行する前に、保存したファイルのディレクトリ構造をソースにあった形にしておく必要があります。

人物ごとの画像ファイルを保存するディレクトリは以下の画像を参考にしてください。

photo_outフォルダの配下に人物ごとのフォルダを作り、その人物ごとのフォルダの中に大量の顔画像があるディレクトリになっています。

 

無事に正常終了すれば、画像データを数値データに変換したデータセットが出来上がります。

この場合は「idol.npy」というファイル名で保存されます。

 

学習モデルの作成

いよいよ学習モデルの作成です。

畳み込みニューラルネットワークを使った学習ですね。

学習モデルの定義や学習させる回数はお好みで変更してください。

結果は、

う〜ムゥ。

78%とは低いですね。

学習モデルをもう少し工夫する必要があるのかもしれません。

とりあえず今回はこれで良しとします。

 

画像の判定

学習モデルの作成が完了したら、早速画像の判定をやってみましょう。

適当に準備した画像から顔の識別をやってみたいと思います。

今回使った画像は以下の画像たちです。

ファイル名に女優名を付加することで、結果の確認を分かりやすくしました。

実行結果はこうなりました。

結果は、

ファイル名、確信度、学習済みモデルの結果

を表示するようにしています。

 

 

一部の女優を間違えていますね。

だいたい78%ぐらいの正答率ですね。

精度を上げるにはもう少し画像データを準備する必要があるのかもしれません。

今回は一人当たり150枚程度でしたから。

 

 

自分で集めた画像からの顔検出でした。

今後はSSDにもチャレンジしていきたいと思います。

 それではまた!

About The Author

Hideki
東京大学発AIスタートアップ企業でロボット開発室室長、画像解析室室長、動画解析室室長を務め、AIエンジニアとしても画像認識関連の特許を在籍中に3つ取得。その後、KDDIグループ内でプロダクトリーダーとして自然言語処理パッケージの自社開発を経て、現在はAGRISTのテックリードとして農業の人手不足の解決に向けた収穫ロボットの開発にチャレンジしている。ロボットは技術の総合格闘技との考え方から、AIだけでなく、ハードやエレキ、通信からクラウド、IOTまで幅広く手掛けることができる。最近では人とロボットの共存を目指すべく、性能だけを追い求める開発から「感動やワクワク体験」をデザインできるロボットの研究を進めており、人とロボットがうまく共存できる世界を作り出したいと日々行動している。

COMMENTS & TRACKBACKS

  • Comments ( 0 )
  • Trackbacks ( 2 )

コメントはまだありません。

  1. […] Keras: Exception: Received unknown keyword arguments: {‘epochs’: 100} keras sin 予測 中間層について AI coordinator […]

  2. […] まず大量の画像が必要であることはいうまでもないのですが、過去記事で紹介していたような学習データではなく、xml形式の学習データが必要となります。 […]

LEAVE A REPLY

*
*
* (公開されません)