許容値、ゆらぎ値、upsamplingについて

今日はFACE01における認証率・誤認証率に直接関係する許容値 ( 閾値 )( tolerance )、ゆらぎ値 ( jitter ) についてご説明したいと思います。
許容値(閾値)とは
FACE01は Python プログラムから呼び出すモジュールとして提供されておりますが、そのうちの関数を呼び出す際に許容値( tolerance )を設定することができます。
# 変数設定 ==========================
## 説明(default値)
## 閾値(0.5)
tolerance=0.45
## ゆらぎ値(0)
jitters=0
## 登録顔画像のゆらぎ値(10)
priset_face_images_jitters=10
## 最小顔検出範囲(0)
upsampling=1
## 顔検出方式(cnn)
### ビデオカードがない場合はmode='hog'
mode='cnn'
# ===================================
from concurrent.futures import ProcessPoolExecutor
import FACE01IMAGER125 as fi
kaoninshoDir, priset_face_imagesDir, check_images = fi.home()
known_face_encodings, known_face_names = fi.load_priset_image.load_priset_image(
kaoninshoDir,
priset_face_imagesDir,
jitters=priset_face_images_jitters
)
# 並行処理
def multi(x):
print(
'name', name,
'date', date,
'face distance',distance,
'original photo', original_photo
)
while(1):
xs = fi.face_attestation(
check_images,
known_face_encodings,
known_face_names,
tolerance=tolerance,
jitters=jitters,
upsampling=upsampling,
mode=mode
)
pool=ProcessPoolExecutor()
for x in xs:
name, date, distance, original_photo = x['name'], x['date'], x['face_distance'], x['original_photo']
result=pool.submit(multi, x)
# 終了
print('終了します')
上記コードではtolerance=0.45 になっていますが、これが許容値です。
許容値を設定しない場合はデフォルト値が適用されます。
おおまかな指標ですが、
・積極認証では 0.6 以下
・非積極認証では 0.45 以下
になります。実際は現場で動作させてみて決めることが多いです。
このようにFACE01では使用用途に応じて許容値が設定できます。この許容値の設定で認証率・誤認証率が左右されますので、非常に重要な設定項目です。

上の図(FAR と FRR の相関図)でのピンクの丸のポイントが最適な許容値(閾値)となります。
ゆらぎ値とは
次はFACE01シリーズにおける認証率・誤認証率に直接関係する「ゆらぎ値」(jitter)についてご説明したいと思います。
FACE01はPythonプログラムから呼び出すモジュールとして提供されておりますが、そのうちの関数を呼び出す際にゆらぎ値(jitter)を設定することができます。
先述のコードではjitters=0やpriset_face_images_jitters=10になっていますが、これがゆらぎ値(jitter)です。ゆらぎ値を設定しない場合、デフォルト値が適用されます。
ゆらぎ値とは、顔画像を読み込む際に一つ一つの画像に対して、「何回ランダムにズーム、回転、変換、反転して、画像の各バージョンのエンコードの平均を返すようにするか」指示する値です。
これによりエンコード時間が遅くなるというトレードオフで、場合によってはよりよく機能するより一般的なフェイスエンコーディングが得られます。精度の向上がエンコード時間増加に見合うかどうかはケースバイケースです。
このようにFACE01シリーズでは使用用途に応じてゆらぎ値が設定出来ますが、最終的な使用用途・範囲が固定されないためです。企業様が最終的にどのような使用用途・範囲を想定するかでゆらぎ値を決定してください。
下の動画は
- jitters = 10
- jitters = 100
の処理の様子を実際に動画で比較したものです。
upsamplingとは
顔を探して画像をアップサンプリングする回数。 数値が大きいほど探索する対象の顔が小さいとみなします。
具体的には upsampling が 0 の時 80×80 ピクセル、1 の時に 40×40 ピクセルの範囲で顔を探索します。FACE01では 0 か 1 から選択します。
処理時間とトレードオフになります。
下の例では 80x80px と 40x40px の四角形を例に出しました。ウィンドウ内の顔の大きさは 80x80px よりも大きいので 80x80px で良好な結果を出します。ですので upsampling=0 にするのが良いでしょう。

まとめ
許容値(閾値)、ゆらぎ値、upsampling 値を自由に設定できるので、様々な環境下に対応できます。
一度エンコードした値は外部データ ( npKnown.npz ) として保存されますので2度目以降はエンコード時間はかかりません。
最後までお読み頂きありがとうございました