許容値、ゆらぎ値、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 の相関図
FAR と FRR の相関図

上の図(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度目以降はエンコード時間はかかりません

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