マスクのままで顔認証

こちらの記事は古くなっており正確ではありません。最新の記事をご参照ください。

Face01シリーズは「マスクをつけたままでの顔認証に対応」しています。
昨今のコロナウィルス蔓延により、マスクを着用することが日常化しました。
そこで Face01 がマスク着用下でどのくらいの性能なのかを検証してみたいと思います。

サンプルスクリプト ( Face01 )

#!/usr/bin/python3

print('Start test_script')

# Face01 ================================================================
import face01_linux_for_testscript as f

kaoninshoDir, pictures_of_people_i_knowDir = f.home()
print('kaoninshoDir is ', kaoninshoDir, '\n', 'pictures_of_people_i_knowDir is ', pictures_of_people_i_knowDir)
known_face_encodings, known_face_names = f.load_priset_image(kaoninshoDir, pictures_of_people_i_knowDir, jitters=10)

xs = f.face_attestation(kaoninshoDir, known_face_encodings, known_face_names, tolerance=0.55)

for x in xs:
	(name, pict, date, img) = (x['name'], x['pict'], x['date'], x['img'])
	print('name is ', name)
	print('pict is ', pict)
	print('date is ', date, "\n")

今回の設定値は以下のようにしました。

  • jitter = 10
    顔画像ファイルからのランダム拡張を調節する。値が大きいとエンコード時により正確になるがエンコード時間とトレードオフになる。
    デフォルトは 1。マスクをはめたままの場合は 10 くらいにしても良い。
  • tolerance
    顔認識における閾値の調節をする。低い値ほど厳しい判定になるが他人受入率は下がる。
    デフォルトは 0.54
    今回は 0.55 にする。

検証環境

検証環境:   
Python 3.6.9,   
Ubuntu 18.04.3 LTS,    
Linux 4.15.0-66-generic,   
AMD Ryzen 5 1400,   
MemTotal: 16421236 kB,   
GeForce GTX1660

【注意】マスクをはめたままの顔認証には Face01_CNN 版と高性能なグラフィックカードが必要になります。

検証用サンプル顔画像

マスクを着用した顔画像ファイル
マスクを着用した顔画像ファイル

検証処理中の様子

小池知事のマスクをはめた状態での Face01_CNN を使った顔認証の様子

検証

概ねきちんと認証が出来ています。
このように初めからマスクをはめた状態を想定するシーンでは Face01_CNN を用い、性能の高いグラフィックカードが必須となります。
これは顔位置を ‘HOG’ 方式ではなく ‘CNN’ 方式で探索するからです。

まとめ

今回の小池知事は一種類のマスクしかはめていません。
色々なマスクをした場合はどうなるでしょうか。
次の検証実験では、実際に 3 種類のマスクを付け替えて行ってみます。

サンプルスクリプト ( Face01_usb )

Face01_usb の検証をするためにサンプルスクリプトから呼び出して結果を検証します。

今回の設定値は以下のようにしました。

  • jitter = 1
    顔画像ファイルからのランダム拡張を調節する。値が大きいとエンコード時により正確になるがエンコード時間とトレードオフになる。
    デフォルトは 1
  • tolerance
    顔認識における閾値の調節をする。低い値ほど厳しい判定になるが他人受入率は下がる。
    デフォルトは 0.54
    今回は 0.42 にしてかなり厳しい値にする。
#!/usr/bin/python3
# -*- coding:utf-8 -*-

print('Start test_script')

# Face01_usb の呼び出し ================================================
import face01_usb_linux as f

known_face_encodings, known_face_names = f.load_priset_image(1)
xs = f.face_attestation( known_face_encodings, known_face_names, tolerance=0.42 )
for x in xs:
	print(x['name'], '\n',x['pict'], '\n', x['date'], '\n')

Linux 版で処理中の様子をキャプチャしました。

検証環境

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

検証用サンプル顔画像

マスクを着用した顔画像ファイルと素顔のファイル
マスクを着用した顔画像ファイルと素顔のファイル

今回は

  • 立体型マスク
  • プリーツ型マスク
  • 柄付き布マスク

の3種類を試しました。

検証処理中の様子

Linux 版で処理中の様子をキャプチャしました。

色々なマスクをはめた時の顔認証の様子

あらかじめ登録されていた顔画像ファイルがエンコード処理(128 次元数値化)され、それを元に顔認証が行われます。

検証

同一人物が 3 種類のマスクを付け替えながら検証を行いました。
自動出力された顔画像ファイルの抜粋を下に示します。

自動出力された顔画像ファイル(抜粋)
自動出力された顔画像ファイル(抜粋)

合計 3 種類のマスクをはめていますが、どの場合でもきっちり顔認証が行われていることがわかります。

端末画面
端末画面

端末画面にはサンプルスクリプトにコードしたように、

  • エンコードされた元顔画像ファイル名
  • 出力された顔画像ファイル名
  • 出力日時

が出力されています。サンプルスクリプトでは上に示した 3 種類を出力させましたが、顔の検出された座標や NumPy 配列 (ndarray) を出力させることもできます。
これら出力はリアルタイムで端末に表示されていきます。

まとめ

今回はマスクをはめた状態での Web カメラを使った検証を行ってみました。
動画で示したように、マスクの形状・色などを問わず認証ができていることがお分かりいただけるかと思います。

現在(2020年4月25日)では非常事態宣言も出され、外出する方はほとんどマスクをつけてらっしゃいます。
そうした中できちんと顔認証が出来るかどうかは、顔認証システムの基本機能と言っても良いでしょう。

以上です。
Face01 シリーズは「マスクをはめたままでも顔認証が出来る」アプリケーションです。
是非ご活用ください。