Face01_imager 1.1.0 の呼び出し方について解説します

Face01_imager は 1.1.0 から呼び出し方が変わりました。

# coding utf-8

print('Start test_script')


import face01_imager_110 as f


kaoninshoDir, pictures_of_people_i_knowDir, check_images = f.home()


known_face_encodings, known_face_names = f.load_priset_image(
	kaoninshoDir,
	pictures_of_people_i_knowDir, 
	jitters=0, 
	upsampling=1, 
	mode='cnn', 
	model='small'
)


while(1):
	xs = f.face_attestation( 
		check_images, 
		known_face_encodings, 
		known_face_names, 
		tolerance=0.45, 
		jitters=0,
		upsampling=0,
		mode='cnn', 
		model='small'
	)

	for x in xs:
		print(x)
		

'''
変数について
jitters			ゆらぎ値。ランダムにスケールアップや色の修正をして平均値を返す。デフォルト値 0
upsampling		サンプリング指定値。0 の時 80x80 ピクセルで顔探索をする。1 では 40x40 ピクセル。
mode				CNN, HOG 両形式を指定する。
model				small -> 5-points method, large -> 68-points method
tolerance		閾値。
'''

コメントにもあるように、それぞれの関数に与える引数を自由に変えられるようになりました。これによって呼び出す側に自由度を与えますが、反対に顔認証のアルゴリズムや各々の変数の働きが分かっていないと期待しない動作になってしまいます。
ですので内部があまりよく理解できていない場合は「変数を指定しない」というのも一つの手です。デフォルトの動作として変数を与えなくても内部でよろしくやってくれるようになっています。ただしマスクをしたまま顔認証する場合はきちんと働きを知っておく必要があります。
参考文献として「顔認証、マスクをつけたらどうなるの?」を最初にお読みになってください。
では一つづつ変数を確認していきましょう。

各変数の働き

jitters

dlib を git clone した場所、私の場合なら $HOME/dlib/python_examples/ ディレクトリの face_jitter.py ファイルを参照してください。そこには以下のように記述してあります。
It takes an input image and disturbs the colors as well as applies random translations, rotations, and scaling.
「入力画像を受け取り、色を乱し、ランダムな移動、回転、スケーリングを適用します。」
jitters の値を大きくするほどランダムな変換の平均値をとるようになります。
しかしながら大きな値をとることによって入力画像が不確かなものになっていくこと、処理時間が長くなることが懸念されます。
通常は 0 ~ 2 あたりが良いように感じます。

upsampling

How many times to upsample the image looking for faces. Higher numbers find smaller faces.
「顔を探して画像をアップサンプリングする回数。 数値が大きいほど顔が小さくなります。」
具体的には upsampling が 0 の時 80×80 ピクセル、1 の時に 40×40 ピクセル、2 の時に 20×20 ピクセルの範囲で顔を探索します。処理時間とトレードオフになります。
下図の例では 80x80px で良好な結果を出します。

mode

CNN 形式または HOG 形式のどちらかを選びます。
CNN: Convolutional Neural Network
HOG: Histogram of Oriented Gradients
速度は HOG が速く CNN で同等の速度を出そうとすれば NVIDIA Titan X GPU が必要になります。
( $HOME/dlib/python_examples/dnn_mmod_face_detection_ex.cpp 参照)
ただし Face01_imager であれば元々の処理時間が少ないため、あえて CNN を選んでも良いと思います。マスクをした顔の場合は CNN 形式が良好な結果を出力します。

model

small: 5-points method
large: 68-points method
となります。
マスクをはめたまま顔認証するときには small を選んでください。顔の半分が布で覆われているからです。

tolerance

0.6 を基準としてトレーニングしてあります。これより大きければ他人と判断されます。
アジア人の場合、0.45〜0.55 くらいに設定しましょう。
実際の現場ではカメラを動作させてみて閾値を決めることがほとんどです。

mode と model の使い分け

まず各関数がどのような働きをしているか簡単に説明します。

load_priset_image() 関数

pictures_of_people_i_know ディレクトリに登録されている顔画像ファイルを 128D 顔識別子にエンコードする際に用いられます。
マスクをしている顔画像ファイルがある場合、
mode: cnn
model: small

とすると良いでしょう。
マスクを考慮に入れなければ
mode: hog
model: large
とすることで精度と速度が上がります。
無いとは思いたいですが pictures_of_people_i_know フォルダにぼやっとした顔を登録すると cnn 形式でないと読み込めない場合があります。

face_attestation() 関数

load_priset_image() 関数で 128D 顔識別子でエンコードされたデータと比較するためにここでも 128D エンコードを行います。
先と同じようにマスクの有り無しで考慮する場合には
mode: cnn
model: small

マスクを考慮に入れなければ
mode: hog
model: large
を指定してください。ただし mode の項で触れたとおり cnn を選択する場合は速度とトレードオフになることに注意してください。
またチェックされる画像の照明の当たり具合や焦点ボケが発生している場合、cnn 形式でないと顔を認識できない場合があります。

デフォルト値

load_priset_image() 関数の場合

kaoninshoDir,
pictures_of_people_i_knowDir,
upsampling=0, 
jitters=1, 
mode='hog', 
model='large'

80×80 ピクセルでの顔探索、jitters ( ゆらぎ値 ) は 1 、HOG 形式、68-points method となっています。
pictures_of_people_i_know フォルダに登録する顔画像ファイルは
マスク無し、200×200 ピクセル、CPU のみでの処理
を前提とした内容です。

face_attestation() 関数の場合

check_images, 
known_face_encodings, 
known_face_names, 
jitters=1, 
tolerance=0.5, 
mode='hog', 
model='large', 
upsampling=0

80×80 ピクセル以上の顔、jitters ( ゆらぎ値 ) は 1 、tolerance ( 許容値(閾値)) は 0.5 、HOG 形式、68-points method となっています。こちらもマスクを考慮しない・速度を重視した CPU のみで十分処理速度がある設定となっています。

マスクを考慮した場合には

load_priset_image() 関数の場合

kaoninshoDir,
pictures_of_people_i_knowDir,
upsampling=1, 
jitters=1, 
mode='cnn', 
model='small'

mode を cnn 、 model を small にします。

face_attestation() 関数の場合

check_images, 
known_face_encodings, 
known_face_names, 
jitters=1, 
tolerance=0.5, 
mode='cnn', 
model='small', 
upsampling=1

こちらも、mode を cnn 、 model を small にします。

まとめ

上記リンク先も参照してください。

今回の変更により、現場でマスクあり・なしの状況変化に柔軟に対応できるようにいたしました。
反面では変更できる変数や関数の働きを理解しないといけないものになっています。
今までは model や mode などごとに違うアプリケーションとしてご用意させていただいておりましたが、現場で柔軟に変えられたほうが良いだろう…という考えがありました。
もし疑問点・不明な点があればお問い合わせからご連絡いただけると幸いです。

Follow me!