/深層学習による顔認識2019.07.11深層学習による顔認識あらまし顔認識を実際に動かしながら試すことで顔認識がどういうものかを体験します。実装に使ったのはdlibの畳み込みニューラルネットワークベースの認識器です。顔認識の必要性については今や説明するまでもないほど身近なものになっていると思います。監視カメラにおいては顔だけではなく、他の特徴も含めて利用し複数台のカメラの画像を高速に処理できる時代が到来しています。渋谷で発生した事件ではスマートフォンの画像から犯人を突き止めたようです。今回は顔認識の精度を大幅に向上させた深層学習ベースの手法を試したいと思います。今回実装に使うのはface_recognitionというpythonのパッケージです。わかりやすい名前ですね。このライブラリは画像全体からアライメントされた顔画像領域を取り出す関数と個人識別のための関数がそれぞれ含まれています。このパッケージはdlibを利用しています。dlibの顔認識に関する詳細はこちらに記載されていました。ResNetをベースに開発されたモデルのようです。このモデルはFaceNetにインスパイアされているようなので、詳しい仕組みや理論的な背景はその論文を読むと良いかと思います。今回顔認識を行う処理は大まかに以下の流れになります。特徴ベクトルはResNetの最終層から出てくる128次元のベクトルであり、同じ個人の画像から算出される特徴ベクトルの距離が小さくなるようにResNetが学習されています。同じ個人の顔画像かどうかを調べるにはベクトル間の距離を測り、閾値より小さいかどうかを計算すればよい、ということになります。実際に動かしてみましょう。今回の実験では対象の画像は私と私の所属する技術研究所の丸山所長、私の上司である綾塚さんの合計3名としました。同じ個人の画像を識別できることを検証するために各人それぞれ二枚ずつの写真を用意しています。face_recognition.load_image_file("ayatuka_san_2.jpg")アライメントされた顔領域を取得します。model=cnnにしないとbboxがかなりずれる。結果としてencodingの値もおかしくなるっぽい。model=cnnにしないとbboxがかなりずれる。結果としてencodingの値もおかしくなるっぽい。bottom))img_maruyama_1正しく丸山所長の顔領域(白枠)を抜き出すことができました。使ったほうがよい精度がでるようです。すべての画像に対する結果を並べるとこのようになりました。顔領域が口を含んでいないことがありますね。入力し、特徴ベクトルを計算します。face_recognitionが面倒を見てくれるので楽ちんです。3名)の特徴ベクトルを取り出すことができました。次に、これらについてすべての組み合わせの距離を求めます。その組み合わせを入力することで実行できます。最後にこれをヒートマップにすることで可視化しました。fmt=".2f")少しわかりづらいと思いますが、各個人の画像の組み合せが他の方の画像に比べて距離が近いことがお分かりいただけると思います。同じ人の画像同士はおおよそ0.3付近にあり、他人の画像は0.5以上となっていました。思ったほど他人間の距離の差がでていないのが気になりますが、これは後日調査しようと思っています。上記のスクリプトと同じように顔の同一判定を行いますが、閾値のデフォルトは0.6でした。最後に撮影条件が大きく異なる画像を読み込ませても、ベクトルの距離が大体期待通りになっていることが確認できました。した顔認識用途では十分利用できるのではないでしょうか?会社の受付の自動化や勤怠登録の自動化など身近な用途にも使えると思います。応用した研究に取り組んでいます。