手法
全体像
- facenetで顔をベクトルに変換する
- ベクトルのデータベースを構築して
- あるベクトルをクエリとして、類似ベクトルを探す
第一ステップ : facenetで顔をベクトルに変換する
facenetをembedderとして顔写真から顔ベクトルを得ます
facenetの事前学習済みモデルは公開されているので、そのまま使わせてもらいましょう。
ちなみに学習データはgithubのreadmeによると
- Casia-WebFace
- VGGFace2
の二つだそうです。
Casia-WebFace は公式のリンクが生きていないので自分でデータを確認するには、クローンを公開しているものを探すしかありません。
僕も偶然見つけて手元にダウンロードしたのですが、どこでダウンロードしたかは忘れてしまいました。
第二ステップ:ベクトルのデータベースを構築
本格的にアプリにするのであればpostgresやmysqlなどで値を持つのがいいかもしれませんが、今回はデモ用の一発限りだったのでコード内の変数に残したままで使いました。
pythonであればpickleやpandasなどでやるのもいいかもしれませんね。
第三ステップ:あるベクトルをクエリとして、類似ベクトルを探す
ベクトルの類似度を計算する方法はいくつかありますが、今回はコサイン類似度で比較をしました。
ネット上で記事をいろいろ見ているとユークリッド距離で比較しているものもありました。
コサイン類似度についてはこちらとかが参考になるかと
類似度がいくつ以上ならTrueとするかの閾値は適宜調整が必要かもしれませんね
precisionを優先するかrecallを優先するかでも変わってくると思うので、この辺りはケースバイケースですね。
終わりに
一般的な画像処理だと、写っている人物判定は容易ではありませんが、機械学習の発展のおかげでより高精度な顔認識などを行うことができるようになりました。
それこそ、監視カメラの映像を自動で解析することや、大量の写真から同じ人だけを抽出してくるなど様々な応用方法が考えられます。
写真や映像を大量に抱えているが、活用方法が見つからないというお悩みなどがありましたら
ぜひお気軽に弊社にご相談いただければと思います
Ryu Ishibashi
機械学習/Vue/React/Laravelとかやってます