顔認証で人数カウント! その 2

Face01_list は「通った人のユニーク数と顔画像ファイルを得るアプリケーション」です。
どの程度の性能か測るために今回は多人数が登場する検証用動画を用意してその動作をキャプチャし、検証してみたいと思います。
今回は前回と同じく crop_speed 値を下げ、よりアプリケーションに負荷がかかる形で検証します。

こちらの記事は古くなっており非推奨となりました。
最新のドキュメントは以下から閲覧可能です
GitHub FACE01
FACE01 document

サンプルスクリプト

前回と同じように、Face01_list の検証をするためにサンプルスクリプトから呼び出して結果を検証します。

#!/usr/bin/python3
# -*- coding:utf-8 -*-

print('Start test_script')

# Face01_list の呼び出し ================================================
import face01_list as l
from multiprocessing import Pool, Process
import threading

kaoninshoDir, outputDIR = l.home()
print('kaoninshoDir is ', kaoninshoDir, '\n', 'outputDIR is ', outputDIR)

p1 = Process(target=l.faceCrop, args=(kaoninshoDir, 0))
thread = threading.Thread(target=l.openDIR, args=([outputDIR, 0.55]))
thread.start()
p3 = Process(target=l.person_count, args=(outputDIR,))
p1.start()
p3.start()

処理全体をスムーズに行うため、マルチプロセスを採用しています。

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

  • crop_speed
    顔検出の頻度を調節する。値が小さいほど多くの顔を検出するがその分処理は遅くなるので調節する。デフォルトは 50
    前回と同様 30 にしてより多くの顔画像を読み込むようにし、あえて負荷をかける。
  • 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 GT 710

検証用サンプル

検証用の動画ファイル
検証用の動画ファイル

今回は多人数を検証したいので「ニュース女子」の映像を検証用動画として使いました。この中に出てくる人物数は 12 人です。
この動画サンプルを「test.mp4」として処理します。

検証用動画に出てくる、手動で切り取った 12 人の人物顔画像ファイル
検証用動画に出てくる、手動で切り取った 12 人の人物顔画像ファイル

検証処理中の様子

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

Face01_list が動作している様子

顔画像が順次検出され、それを元にエンコード処理を行い各顔画像ファイルがユニークな人物かを判定していきます。

マルチプロセスで動作しているので

  • 顔画像の検出と保存処理
  • 顔画像の 128 次元エンコード化と各々のエンコード値の比較処理
  • その時その瞬間の総人数表示

を平行に処理しています。

この検証用動画では「12 人」出演していますが、様々な表情・様々な顔の角度や仕草で多くの顔画像ファイルが発生していきます。
それらを 128 次元エンコード処理し、ユニークな人物かどうかを比較処理しています。
最終的に「13 人分」の顔画像ファイルだけが残り、標準出力されています。

最終的に残った顔画像ファイル
端末画面

検証

検証用動画の人物数は 12 人、Face01_list から出力された人数は 13 人でした。
検証用動画から手動で切り取った顔画像ファイルと、Face01_list から出力された顔画像ファイルとを「順番を揃えて」調べてみます。
青枠が検証用動画から手動で切り取った顔画像ファイル、
赤枠が Face01_list から出力された顔画像ファイルです。

青枠がオリジナルの人物、赤枠が出力された人物
青枠がオリジナルの人物、赤枠が出力された人物

一番右の人物、須田慎一郎さんの顔画像ファイルだけ重複して残っています。
今回設定した「閾値」は 0.51 でしたが、同じ人物が認識される場合は閾値を調節(この場合は上げる)と重複しなくなります。

まとめ

今回は多人数が登場する動画での検証を行ってみました。
今回1人だけ余分に重複して認識されてしまっていますが、閾値の調節で重複しないように厳し目に設定すると重複は防げます。
また今回から映し出される検証用動画に、実際にクロップされる顔画像の様子が分かるように緑の枠をつけるようにしました。どの顔がクロップされているのかリアルタイムで分かるので便利です。

以上です。
Face01_list は「その場所に現れた人のうち、そのユニークな人数と個別の顔画像ファイルを得る」にはもってこいのアプリケーションです。
是非ご活用ください。