かわみのメモ帳

趣味に関するメモを書いていきます。

宮崎あおいと二階堂ふみ/藤田茜と久保田未夢をニューラルネットワークで自動分類する

おはようございます。かわみです。
昨今は自身の老害化が進み、たとえばアイドルなどの顔の区別がつかなくなってきました。
そんな私が特に顔の区別がつかない人がいました。
ということで、今回はそのような似た顔を自動で分類してみます。

なおこの記事に対して「〇〇さんと××さんは全然似ていない!!」と文句をつけるのはお門違いですので、この記事を目に焼き付くほどお読みいただくのをお勧めいたします。

概要

記事タイトルにもありますが、(数年前の)宮崎あおいさんと二階堂ふみさんはテレビで一瞬どちらか区別がつかない場面に遭遇することがありました。 ただし最近の様子であれば、互いに雰囲気も少し変わりつつあり、普通に区別できるようになりました。そのはずです。
また声優の藤田茜さんと久保田未夢さんもその顔の類似性が一部界隈(要出典)で話題になっていますが、顔の角度によっては一瞬判断に迷うことがあります。 ということで、それぞれについてどちらの方なのかニューラルネットワークで分類してみます。

ソースコード

今回の実装のソースコードと謎の.npzファイルを公開します。

github.com

これであなたも、顔の区別のつかない人を自動分類させられます。

手法

手法ですが、よくある(?)ニューラルネットワークを用いた分類問題の手法を用います。画像を分類するのでCNNです。
構築するCNNのモデル構成ですが、

  • 畳み込み×2
  • 全結合層×2

といったシンプルな構成です。ディープとは言えないかもしれません。

入力する画像ですが、顔だけを入力に用います。
具体的には以下の通りです。

  • OpenCVで顔を抽出する
  • 一定のサイズに拡大または縮小する(今回は64x64)

詳しくはソースコードをご覧ください。

さて、モデルの訓練に用いる画像が必要ですが、どのように収集しようかということになるわけです。
この手のタスクはデータの収集や前処理のほうが大変だったりする場合があります。

データ収集

とりあえずいろんなところから集めることにしました。
といっても人手ですべて収集していたらキリがないので、できるだけ自動化しました。
まず画像検索サービスより収集することにしました。具体的には以下のようなサービスですね。

Google画像検索にはAPIがあるものの、上限もあったので、見送ることに。1つ目のサービスから収集することを考えます。
この手のサービスは動的にページが生成されるため、ただスクレイピングするだけでは数十枚しか取得できません。
「人間の振る舞いをそのまま真似して疑似的にブラウザを操作することはできないのだろうか...」
そう思って調べた結果、Seleniumにたどり着きました。これを使いました。

なんとなく危険な気がするのでコードは公開しませんが、これらを参考にした気がします。(いろいろ調べたのでよく分からなくなっている)

www.inet-solutions.jp

qiita.com

これでビッグなデータで画像分類のモデルを学習できるぞ!!と意気込んでいましたが、取得されたのはせいぜい300枚ほど。
さすがにもう少し枚数を拡充するため、藤田茜さんの画像に関しては公式Facebookからも取得することにしました。それでもせいぜい+100枚ほどなんですが。

というわけで、宮崎さん/二階堂さん、藤田さん/久保田さんのそれぞれで各人300~400枚ほどのデータセットができました。足りないような気がしますが、やってみることに。

結果

宮崎あおいさん/二階堂ふみさんの分類

f:id:kawamix:20180524173950p:plain

f:id:kawamix:20180524174025p:plain

こんな感じです。
そしてこれらをツイッターに掲載したところ、FF外からミスを指摘する心優しいリプライが飛んできました。

f:id:kawamix:20180524174133p:plain f:id:kawamix:20180524174138p:plain

よくよくデータセットを見返してみると、なんと宮崎さんの画像フォルダに二階堂さんの画像が交じっていました。また逆も然り。
あくまでも画像検索の結果から取得したものであるので、「似てる」系の記事に添付された画像までも収集されてしまいました。
つまり宮崎さんの画像検索結果に二階堂さんの画像が交じっているのです。なんということでしょう。
交じっている画像は学習前にできるだけ人間ディープラーニングで削除したつもりだったのですが、見落としがあったようです。

f:id:kawamix:20180524174851p:plain こんなん分かるか。

改めてより注意深く画像を見極め、仕分けしていきました。
とはいえ、1度ですべて見極められる訳もなく、これを数回繰り返し、FF外のファンの方からクソリプ指摘を受けながらようやく正しいデータセットでモデルを構築しました。

f:id:kawamix:20180524174521p:plain

f:id:kawamix:20180524174527p:plain

藤田茜さん/久保田未夢さんの分類

あれ?

f:id:kawamix:20180524175314p:plain

f:id:kawamix:20180524175427p:plain 正直この目と鼻だけで区別するの人間でも難しそう(顔認識と分類の両方の誤り)

こちらの方々に関しても、互いのデータセットに互いの画像が交じりこむという現象が観測されたので、人間ディープラーニングによる識別を強化してモデルを構築し直しました。

f:id:kawamix:20180524175243p:plain

f:id:kawamix:20180524175255p:plain

たとえ藤田さんがマスクをしていても判別してくれます。

f:id:kawamix:20180524181218p:plain

ただしこれは、学習データとテストデータとを4:1の割合で分割していますが、おそらくその顔画像が学習データに含まれていたからでしょう。
とはいえ、30 epoch後のテストデータのaccuracyは0.957となっています。もしかすると同じ画像データが複数取得されていた可能性もあるかもしれません。
テストデータの精度は非常に高かったですが、今後はたとえば転移学習でどのように精度が変わるのか試してみたいものです。

おわりに

これで宮崎あおいさんや二階堂ふみさん、また藤田茜さんや久保田未夢さんを機械の力で判別できるようになりました。
しかし私自身、データセットの作成時に人手で見分ける必要があったので、もはやこのシステムは必要なくなりました。という、古典落語みたいなオチでした。
お後がよろしいようで。