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

今日は Face01 における認証率・誤認証率に直接関係する許容値 ( 閾値 )( tolerance )、ゆらぎ値 ( jitter ) についてご説明したいと思います。

許容値(閾値)とは

Face01 は Python プログラムから呼び出すモジュールとして提供されておりますが、そのうちの関数を呼び出す際に許容値( tolerance )を設定することができます。

import face01 as f

kaoninshoDir, pictures_of_people_i_knowDir = f.home()
	
	
known_face_encodings, known_face_names = f.load_priset_image(
	kaoninshoDir,
	pictures_of_people_i_knowDir, 
	jitters = 1, 
	upsampling=0, 
	mode='hog', 
	model='large'
)
	

xs = f.face_attestation(
	kaoninshoDir, 
	known_face_encodings, 
	known_face_names, 
	tolerance=0.5, 
	jitters=1,
	upsampling=0,
	mode='hog', 
	model='large',
	frame_skip=3,
	movie='test.mp4',
	rectangle='true',
	show_video='false'
)

face_attestation 関数の 4 つめの引数が 0.5 になっていますが、これが許容値( tolerance )です。

許容値を設定しない場合はデフォルト値が適用されます。

おおまかな指標ですが、
・積極認証では 0.6 以下
・非積極認証では 0.45 以下

になります。実際は現場で動作させてみて決めることが多いです。

このように Face01 では使用用途に応じて許容値が設定できます。この許容値の設定で認証率・誤認証率が左右されますので、非常に重要な設定項目です。

FAR と FRR の相関図
FAR と FRR の相関図

上の図(FAR と FRR の相関図)でのピンクの丸のポイントが最適な許容値(閾値)となります。

他社顔認証ソフトウェアでは予め許容値は固定されていることが多く、それによって使用場面が固定されることに繋がっています。使用用途の範囲を予め決め打ちしてしまうのも良いことだと思います。それだけソフトウェアを単純にでき、誤認識も下がることに繋がります。Face01 は顔認証ソフトウェアの SDK をコンセプトにしていますので使用用途の範囲が広く、許容値の設定が重要となってくるわけです。

ゆらぎ値とは

次は Face01 シリーズにおける認証率・誤認証率に直接関係する「ゆらぎ値」( jitter )についてご説明したいと思います。
Face01 は Python プログラムから呼び出すモジュールとして提供されておりますが、そのうちの関数を呼び出す際にゆらぎ値( jitter )を設定することができます。

load_priset_image() 関数の引数が jitters=1 になっていますが、これがゆらぎ値( jitter )です。ゆらぎ値を設定しない場合、デフォルト値(1)が適用されます。
ゆらぎ値とは、顔画像を読み込む際に一つ一つの画像に対して、「何回ランダムにズーム、回転、変換、反転して、画像の各バージョンのエンコードの平均を返すようにするか」指示する値です。

これにより、エンコード時間が遅くなるというトレードオフで、場合によってはよりよく機能するより一般的なフェイスエンコーディングが得られます。精度の向上がエンコード時間増加に見合うかどうかは、ユースケースによって異なります。
このように Face01 シリーズでは使用用途に応じてゆらぎ値が設定出来ますが、最終的な使用用途・範囲が固定されないためです。企業様が最終的にどのような使用用途・範囲を想定するかでゆらぎ値を決定してください。

下の動画は

  • jitters = 10
  • jitters = 100

の処理の様子を実際に動画で比較したものです。

upsampling とは

顔を探して画像をアップサンプリングする回数。 数値が大きいほど探索する対象の顔が小さいとみなします。
具体的には upsampling が 0 の時 80×80 ピクセル、1 の時に 40×40 ピクセル、2 の時に 20×20 ピクセルの範囲で顔を探索します。処理時間とトレードオフになります。
下の例では 80x80px と 40x40px、20x20px の四角形を例に出しました。ウィンドウ内の顔の大きさは 80x80px よりも大きいので 80x80px で良好な結果を出します。ですので upsampling=0 にするのが良いでしょう。

まとめ

許容値(閾値)、ゆらぎ値、upsampling 値を自由に設定できるので、様々な環境下に対応できます。

一度エンコードした値は外部データ ( npKnown.txt ) として保存されますので2度目以降はエンコード時間はかかりません
ここら辺は「新規に顔画像登録する方法」で詳しく解説しています。ぜひご参照ください。

Follow me!