誤認識した顔画像の検証(2)

綾瀬はるかさんの動画を使い、しきい値を変化させた時どれくらい誤認識が抑えられていくかを検証しました。

【追記】記事内容が古くなっております。
・Python2 系
・顔認証画面の表示が変更前
・CUDA 未対応のため低速
・顔認証精度が低い(変更前)
最新の記事をご参照ください。

しきい値(閾値)とは

known_face_encodings, known_face_names = f.load_priset_image(1)
xs = f.face_attestation( known_face_encodings, known_face_names, 0.34)

上のソースコードの 2 行目、0.34 がしきい値です。
それぞれの顔データはエンコードされて 128 個の数値として保存してあります(1)。動画内に顔が検出されると同じように 128 個の数値データとしてエンコード処理がなされます(2)。
(1)と(2)の距離の差(交差)をここでは「しきい値」と呼んでいます。
ですので、しきい値 0.4 よりもしきい値 0.35 の方が顔同士の距離が近く、よりに似ている顔であるということが出来ます。

通常、しきい値は現場の環境・目的に合わせて変化させるものです。
例えばウォークスルー環境でブラックリストに載っている人物を検出する場合、しきい値は 0.5 前後を指定すると良いと思います。あるいは、施錠解除のために積極認証を行う場合、厳しいしきい値、すなわち 0.35 あたりを指定するのが良い結果を生み出します。

色々なしきい値による検出結果を検証する

ここでは、同じ動画に対してしきい値を変えた実験を行い、それによる顔の誤認識の様子を検証します。
しきい値の値はそれぞれ 0.4 → 0.38 → 0.34 と変化させました。
使った動画は非積極認証タイプのものなので、通常はもっと高いしきい値を用いるのが適しています。非積極認証においてはかなり厳しいしきい値ですので、顔の認証自体が困難な実験ですが、早速やってみましょう。
検証に用いるのは下の動画です。

検証環境:  
test_script.py,   
Python 2.7.15+,  
Ubuntu 18.04.3 LTS,   
Linux 4.15.0-66-generic,   
AMD Ryzen 5 1400,  
MemTotal: 16421236 kB,  
GeForce GT 710

しきい値 0.38 を指定した場合の顔認証結果は以下のようになりました。

しきい値 0.34 を指定した場合の顔認証結果は以下のようになりました。

しきい値を 0.4 → 0.38 → 0.34 と変化させた時に誤認識された様子を図にまとめました。

しきい値を変化させた結果図
しきい値を変化させた結果図

 このように、しきい値を厳しくしていくと誤認識の数も減っていきます。
非積極認証で 0.34 ですと、顔の認証自体がかなり難しくなり、「 Unknown 」もかなり増えてしまっているのが見て取れると思います。
 先述の通り、現場の環境に合わせたしきい値の運用が非常に大切なことだと思います。

Follow me!