Edited at

機械学習で似た顔を見つける(顔識別したい)試行錯誤


顔識別したい

特定のモデルが学習していない顔写真を入れて、大量の画像からその人をみつけたい。

基本的にやることは同じで、画像を読ませてベクトルをだして類似性を計算するだけ。

で・・・ベクトル抽出が一番大事なんです。

結果的に普通に学習しても失敗します。

https://qiita.com/mokoenator/items/6807132ce59913186a9b#%E7%89%B9%E5%BE%B4%E9%87%8F%E3%81%AE%E7%AE%97%E5%87%BA

に書いたtriplet lossを使ってmarginを大きくとるようにします。


vgg16

なにもしらべないでVGG16をファインチューンしてみる。

俳優の動画を学習させるがいい結果がでない。

全結合層の値で類似性をみてもいまいち。

男女の区別もあやしい。(男女は人間が重要としているだけで機械的には関係ないのかも)

男性顔に対して男性よりも女性のほうが高類似とでてくる

いろんな画像をいれて類似度を計算するが、本人画像より他人のほうが似ている数値になる。

学習済みの俳優判定はすごいんだけど、特徴量で計算させるとダメ。

顔を認識してるように見えない。

学習に4時間~8時間かかる。暇すぎる

ちなみにファインチューンしないVGG16も同じくらいの精度。


やったことは

・俳優さん数人の画像を集める

・opencvで顔認識+切り出し(ゴミあり)

・ゴミ除去

・学習する>このモデルをモデルAとする

・動画>1フレーム切り出し>opencvで顔だけ切り出し(ゴミあり)

・モデルAで俳優に該当すれば画像を該当俳優フォルダに保存

・モデルAで俳優に該当しない場合はかおじゃないフォルダに保存

・60%くらい振り分けに成功しているので手動で検査(ゴミ除去)

・顔かどうかあいまいなものは削除する

・本学習を行う

画像をフォルダに分ける作業がすごく大変。

服+顔で判断してたのが、顔だけだと誰これ??て状態になる。

確実に動画内の人間が一人なら楽なんですけど女優が数人移った動画だと振り分け作業に吐き気がしてくる

同じ女優でも表情が変わってると人間は認識できないみたい。

洋服や髪型の雰囲気+変化する表情だからXXXさんって認識できてるんだなぁと思った。

動画の場合は同じような画像がおおくなるのでそれはだめじゃないか?と思う。

VGG16のモデルで同一と判断できる画像は消してもいいかなと思った。


open face

https://cmusatyalab.github.io/openface/

CNNなの?コレでやってみる。

環境構築にやたら時間がかかる。

ベクトルがでるので、これを使って類似性を出す。

結果としてはNG。VGG16を自分でファインチューンしたほうがいいくらいかも。

判定してほしい画像が正面を向いてないとだめなのかな?

使い方がまちがってる??

時間がかかったわりに成果なし


vggface2

vggface2というのを発見!

学習済みデータを発見できないのでじぶんでやる。

https://www.robots.ox.ac.uk/~vgg/data/vgg_face2/

登録して8631人のデータを取得する。全部で40GByteくらいある。

(データ量との戦いになるのと思ってなかったのでSSDの空き容量がない。新しく購入)

さぁ!学習だ!!!

GTX1060で1epoch二日かかる計算。100epochで200日も。。。

ほかのGPUは実験中なのであきらめる。

(SSDのお金が無駄になった)

学習済みモデルがほしぃい


keras-vggface

vgg faceを学習したモデルがあったのでそれを使う。

(vgg face2とは違う)

https://github.com/rcmalli/keras-vggface

この通りにインストールすればいい。

2622人を学習しているので期待できそうだ。

全結合層のfc8 (Dense)、fc7 (Dense)、fc6 (Dense)で類似度をとるが・・・

やっぱりだめだ。どの層で計算しても似てねぇ。

OUTPUTであるfc8/softmax (Activation)の値をみてみると、なんかイケてる数字だなぁ~~とおもったので

ここで類似度をだしてみる。

そこそこの感じがある。

男女もそこそこ分かれる。

2622人もあるとある程度バラケテくれるので、計算に使えるみたい。

なんか洋服とか髪型を見ている気がしてならない。


keras-vggfaceをGrad Camでどこを見てるか?

ぱくたそを使わせてもらいます。

結果



ヒートマップの赤いところがどこを見ているか示している。

アスペクト比がおかしいのでわかりにくいかと思いますが、あんまり顔みてないよ。

なんで手をみてるんだ。。。

顔をアップに切り取ってみる





あんまり顔みてないよ。

もしかしたら・・赤い部分を白トビさせて、青い~黄色くらいをのこして学習させればいいのかなぁ・・・


Grad Camの注意?

Grad Camは判定したclassを逆に計算してるような感じなので

一度モデルに判定させて、classを特定する

特定したclassを逆に流し込んでヒートマップを作ってるようです。

なので

犬猫判定モデルに犬猫が混ざった写真で犬classを逆流させると犬が赤くなり、猫classを逆流させると猫が赤くなるみたい。

なんにしても、vggfaceは顔が赤くならないとだめだとおもう。

もしかして、スナップ写真じゃなくて

顔に髪かからなようにしていろんな表情を集めればOK?

坊主の人???

モジモジ君?

vgg face2に期待。


感想

人間クラスから、さらに分かれた個人の類似性を判断するのはかなり難しい。

猫の個体識別が人間にとって難しいのと一緒なんだと思う。

今後は、坊主、モジモジ君の画像をあつめるか、Grad Camの情報を使って白トビさせてみようかな。