顔認証技術で人数カウントできるのか!?

こちらの記事は古くなっており非推奨となりました。
最新のドキュメントは以下から閲覧可能です
GitHub FACE01
FACE01 document

多くの企業様から「その場所を通った人のユニーク数を知るアプリケーションはありませんか?」というお問い合わせを頂いておりました。コア部分の開発が終わりましたので試行錯誤の過程を記載したいと思います。

【実際に開発出来た SDK は「顔認証技術で人数カウント!」でご紹介しております。】

用意したもの

まず、無作為に選びだした 14 人分の様々な表情・シチュエーション・異なる角度の顔画像ファイルを用意しました。
これらの顔画像に対し一つずつにエンコード処理を行い予め 128 次元顔データを作成します。

無作為に選びだした14人の顔画像
無作為に選びだした14人の顔画像

128 次元顔データの作成

各個人の出力される 128 次元データ
各個人の出力される 128 次元データ

人数分の顔画像データが算出されたら、次はそれぞれの組み合わせで照合を行います。一つの画像につき満遍なく各々と照合します。

出力結果

図・1検証用リスト
図・1検証用リスト

検証用に出力した結果の一部が図・1になります。

  • 真、偽
    同じ人物の異なる画像であるときが「真」
    異なる人物のときが「偽」
  • face_distance
    各顔画像データ同士のユークリッド距離
  • ks, key
    各顔画像ファイル名

検証

「face_distance」が数値が大きいほど「違う顔である」事を表します。ただしそれが本当に「他人である」かどうかの確証はありません。そこで各顔画像の face_distance がどのような値になるかを出して見ました。(図・2 閾値を 0.42 とした場合の各顔画像の face_distance と各々のファイル名)

図・2 閾値を 0.42 とした場合の各顔画像の face_distance と各々のファイル名
図・2 閾値を 0.42 とした場合の各顔画像の face_distance と各々のファイル名

では図・2についてここのデータを見ていきましょう。
判定の閾値は「0.42」としています。
つまり判定が「真」の場合は同じ人物の違う表情の場合、判定が「偽」の場合は違う人物を表します。

図・3 黄色の部分は同じ人物の違う表情の場合を表す
図・3 黄色の部分は同じ人物の違う表情の場合を表す

図・3では、face_distance が 0.51 でも「同じ人物の違う表情・違うシチュエーション」が存在することを表しています。図・2の黄色い部分はそれを示しています。
これらのデータから、最適な閾値を想像していきます。

最適な閾値の調整

図・4 閾値 0.42 の場合。上が元のフォルダ、下が同じ人物として移動されたフォルダ
図・4 閾値 0.42 の場合。上が元のフォルダ、下が同じ人物として移動されたフォルダ

図・4は、上が元のフォルダ、下が同じ人物として移動されたフォルダです。上のフォルダの赤で描いた四角の中は同じ人物の違う表情・違うシチュエーションが残ってしまっていることを表しています。この時の閾値は 0.42 です。

図・5 閾値 0.47 の場合。上が元のフォルダ、下が同じ人物として移動されたフォルダ

閾値を「0.47」にした場合の様子を図・5に示します。重複する同じ人物の顔画像がぐっと減りました。

「閾値を上げる」ということは、違う人物の同じような顔画像が「同じ人物」として認識されることが多くなることを表します。

図・6 閾値「0.517」の場合 ユニークな人物2人が抜けている(青枠)
図・6 閾値「0.517」の場合 ユニークな人物2人が抜けている(青枠)
  • 閾値「0.42」の時、14 人の異なる表情の人物数が 29 人でした。
  • 閾値「0.47」の時、14 人の異なる表情の人物数が 19 人でした。
  • 閾値「0.517」の時、14 人の異なる表情の人物数が 13 人でした。

閾値を「0.517」にした時、違う人物まで同じ人物として弾かれる例が発生しました。(図・6の青枠)

まとめ

閾値を調節することで人物のユニーク数を一定の割合で検出できることが分かりました。
今後は出来上がったコアを使って肉付けをしていきます。

【実際に開発出来た SDK は「顔認証技術で人数カウント!」でご紹介しております。】

以上です。最後までお読み頂きありがとうございました。