トラブルシューティング

Windows 10 における動作環境作成とファイルの説明」あるいは「Ubuntu 18.04.4 における動作環境作成とファイルの説明」に沿って環境設定をしたのに FACE01が起動しない、一度目は起動したけれど二度目からは起動しなくなった」。そんな時はこのページを読んでみて下さい。

「環境設定をしたはずなのに後から調べたら出来ていなかった」や「パスが通っていなかった」等の起こりうる症例と対策をご説明します。

また併せて「よくあるご質問」もご参照ください。

FACE01が起動しない

インストールされているモジュールを確認する

Windows10における動作環境作成とファイルの説明」に沿って環境設定をしたのにFACE01が起動しない場合、インストールされているモジュールを確認します。下図は対話型でモジュールがインポートできるかひとつづつ確認しています。

対話型でモジュールがインポートできるかひとつづつ確認する
対話型でモジュールがインポートできるかひとつづつ確認する

python.exeのバージョンを確認する

コマンドプロンプトでPython のバージョンを確認します。Windows版とUbuntu版ではPythonのバージョンが異なります。

  • Windows
    • Python3.7.7
  • Ubuntu
    • Python3.6.9
## Windows
>python --version

## Ubuntu
$ python3 --version
Windows
Ubuntu

パスの確認をする

CMake や Python のパスが通っているか確認してください。

Windowsの場合

システムのプロパティ→詳細設定→環境変数を選択します。

システム環境変数→Path を選択して下図のようになっていることを確認します。

Ubuntuの場合

環境変数の表示にはprintenvコマンドをお使いください。

$ printenv
CLUTTER_IM_MODULE=xim
LD_LIBRARY_PATH=/usr/local/cuda-10.2/lib64
PATH=/usr/local/cuda-10.2/bin:/home/user/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
(略)

Python 自体のディレクトリは以下のようにして確かめます。

$ which python3
/usr/bin/python3

任意のディレクトリにPythonをインストールしたなどの場合は以下のように export した後、再読込してください。

$ export PATH="/任意のディレクトリ/:$PATH"
$ source /home/ユーザ名/.bashrc

Python が正しく起動するか確認する

Windows

>python
Python 3.7.7
>>>

Ubuntu

$ python3
Python 3.6.9 (default, Jul 17 2020, 12:50:27) 
[GCC 8.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 

ライブラリの確認を行う

ひとつずつimportして確認する

必要なライブラリが import 出来るか確認します。 import できない場合は pip3 等でインストールしてください。(仮想環境をお使いの方はそれに準じて下さい)

## Ubuntu
$ python3
Python 3.6.9 (default, Jul 17 2020, 12:50:27) 
[GCC 8.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> import PIL
>>> import dlib
>>> import face_recognition
>>> 

openCVのインストール

openCV はパッケージ管理システムからインストールできます。

$ sudo apt install python3-opencv

あるいはpip3からインストールします。

$ pip3 install opencv-python
$ pip3 install opencv-python
Collecting opencv-python
  Downloading https://files.pythonhosted.org/packages/bb/08/9dbc183a3ac6baa95fabf749ddb531bd26256edfff5b6c2195eca26258e9/opencv-python-4.5.1.48.tar.gz (88.3MB)
    100% |████████████████████████████████| 88.3MB 17kB/s 
Collecting numpy>=1.13.3 (from opencv-python)
  Downloading https://files.pythonhosted.org/packages/45/b2/6c7545bb7a38754d63048c7696804a0d947328125d81bf12beaa692c3ae3/numpy-1.19.5-cp36-cp36m-manylinux1_x86_64.whl (13.4MB)
    100% |████████████████████████████████| 13.4MB 113kB/s 
Building wheels for collected packages: opencv-python
  Running setup.py bdist_wheel for opencv-python ...
Building wheels for collected packages: opencv-python
   Running setup.py bdist_wheel for opencv-python … done
   Stored in directory: /home/terms/.cache/pip/wheels/08/40/b7/fb2e8392888c91eb048b26ea0baa9aae808d056e3786204d0b
 Successfully built opencv-python
 Installing collected packages: numpy, opencv-python
 Successfully installed numpy-1.19.5 opencv-python-4.5.1.48

パッケージマネージャからのインストールとpipからのインストールはどちらかを排他的に選択して下さい。競合します。

openCV をGPU対応にするには

openCVのGPU対応はソースからマニュアルで行います。公式ページを参照して下さい。

dlibのインストール

Dlibをソースからインストールする場合は以下のようにします。

$ python3 setup.py install

pip3でインストールする場合は以下のようにします。

$ pip3 install dlib
Collecting dlib
  Downloading https://files.pythonhosted.org/packages/11/93/ec41d6ef7e769977aa08e49441c52276da27859f12dcbf1c6deb96ce5e9f/dlib-19.22.0.tar.gz (7.4MB)
    100% |████████████████████████████████| 7.4MB 196kB/s 
Building wheels for collected packages: dlib
  Running setup.py bdist_wheel for dlib ... done
  Stored in directory: /home/terms/.cache/pip/wheels/bd/46/7c/deeb33803394006488f2378a9adeae08c65c9560f27a85fbce
Successfully built dlib
Installing collected packages: dlib
Successfully installed dlib-19.22.0
$ python3
Python 3.6.9 (default, Jan 26 2021, 15:33:00) 
[GCC 8.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import dlib
>>> dlib.DLIB_USE_CUDA
True
>>> 

import の際は openCV なら cv2 、pillow なら PIL と打ち込んでください。例えば
>>> import pillow
と打ち込んでもエラーになりますので気をつけてください。

Dlib が CUDA 対応か確認する
$ python3
Python 3.6.9 (default, Jul 17 2020, 12:50:27) 
[GCC 8.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import dlib
>>> dlib.DLIB_USE_CUDA
True
>>> 

True と返ってくれば CUDA を使用できます。

npKnown.txt があれば破棄する

前は起動したのに今度は起動しない…という場合があります。
「priset_face_images」フォルダの中を改変した時は npKnown.txt を作り直すために一旦破棄しなければなりませんがこれを忘れている可能性があります。ですので既に npKnown.txt が有る場合は破棄してからFACE01を起動してください。

npKnown.txt

SETTING MANAGERでは下図の赤い四角で囲ったチェックボタンにチェックを入れることで自動的にnpKnown.txtが破棄・再構築されます。

FACE01が起動してからのトラブルシューティング

「priset_face_images」フォルダの中の顔画像を認識しない

priset_face_imagesフォルダ

load_priset_image() 関数(登録顔画像の登録処理)においては上図のようにマスクをはめている場合には、FACE01を呼び出す引数として「マスク用」を考慮しなければならない場合があります。通常、マスクの有りなしに関わらず mode は ‘hog’ですが、これで顔探索が難しい場合、 mode を ‘cnn’ にします。
( ただしFACE01 IMAGER 1.1.3 以降では煩雑な引数処理を内部で自動的に切り替える仕様変更がなされました。これによって速度・正確性の向上を達成すると同時に引数を試行錯誤する手間がなくなりました。)

FACE01 GRAPHICS使用での mode に関しては「各検出器の精度はどのくらい?」をご覧頂きそれぞれの精度の違いを確認してください。

FACE01 IMAGERでは以下のような引数指定のスクリプトになります。

サンプルスクリプトの内容の説明については「マスクを考慮した場合には」をご参照ください。

print('Start test_script')

import face01_imager_115 as f
import time
kaoninshoDir, priset_face_imagesDir, check_images = f.home()
known_face_encodings, known_face_names = f.load_priset_image(
	kaoninshoDir,
	priset_face_imagesDir, 
	jitters=5,     # 処理速度優先
	upsampling=0,  # 200x200 ピクセルの顔画像ファイルであることが前提
	mode='hog',    # hog で固定
)
while(1):
	xs = f.face_attestation( 
		check_images, 
		known_face_encodings, 
		known_face_names, 
		tolerance= 1.0,                 # 最初は tolerance を開放する ( 1.0 )
		jitters=0,
		upsampling=0,
		mode='hog',                     # hog で固定
		display_face_distance = 'true'  # 閾値を求めるために true にする
	)


	for x in xs:
		(name, date, distance) = (x['name'], x['date'], x['face_distance'])
		print(
			'name', name,
			'date', date,
			'face_distance',distance
		)

「priset_face_images」フォルダを読み込む速度が遅い

登録顔画像を「priset_face_images」フォルダから読み込む時には

  • 200×200 ピクセルの顔画像を
  • 解像度の良い状態で

読み込ませることが大事です。
例えば下の図は NG な例です。

登録顔画像として NG な例

傾いている顔を修正し、顔だけの 200×200 ピクセルにしたものが下の写真です。

登録顔画像として正しい例
登録顔画像として正しい例

顔に対して背景が大きいと人間には顔に見えなくても機械からは顔に見える場合があります。この場合複数顔が検出されてしまい顔登録が出来ません。
また大きな写真から小さな顔を探索するのには時間がかかります。何十人も登録する場合、顔の登録に大変な時間がかかります。
そして顔が傾いている場合は修正してください。傾いたままだと精度が落ちる可能性があります。

多くの写真から顔だけをクロップする場合、 FaceCrop を使用すると簡単です。

処理速度について

CPU だけに処理を行わせたい場合、処理速度が相対的に遅くなります。FACE01 IMAGER 1.1.3 以降では通常正確性と速度に優れた HOG にて処理を行い、HOG 形式で顔探索できない場合にのみ、内部で自動的に CNN 方式へと切り替えます。このように NVIDIA 製のグラフィックボードが調達できず CUDA 処理が出来ないシーンでも速度に与える影響を最小化する工夫が施してあります。

FACE01 IMAGERの場合

load_priset_image() 関数 ( 登録顔画像の処理 ) では上述のようにmode=’hog’ です。これはface_attestation() 関数の場合も同様です。

上のサンプルスクリプトをご参照いただきたいのですが、顔認証部分の処理「face_attestation() 関数」を抜粋したのが下になります。

	xs = f.face_attestation( 
		check_images, 
		known_face_encodings, 
		known_face_names, 
		tolerance=0.5, 
		jitters=0,
		upsampling=0,
		mode='hog',      # CPU のみの処理の場合は hog を指定する
	)

速度に直結する引数は

  • jitters=0
    顔画像ファイルからランダムな顔を作り出し精度を向上させるもの
  • upsampling=0
    顔探索の領域指定。0 は 80×80 ピクセル以上の顔を探索する
  • mode=‘hog’
    CPU 処理に向いている顔認識モード
GPU ありで処理する場合

GPU カードをつけても良い場合は下のような最安値(税込3026円)のものだとしても CPU のみの処理速度と雲泥の差が出ます。

このカードを実際挿して処理速度を検証します。
先の Windows 10 で検証したのと同じコードを使い、どれくらいの時間がかかるか測定します。

動作環境
Ubuntu 18.04.4 64bit
CPU    AMD Ryzen5 1400
memory  16GB
GPU NVIDIA GT 710

標準出力に出力された顔認証速度の処理結果
標準出力に出力された顔認証速度の処理結果
137件の処理の場合の平均値など
265件の処理の場合の平均値など

265 件処理させてその平均値などを測定した結果が上のスプレッドシート図になります。
一枚の画像処理が平均 0.08 秒だと分かりました。3000 円ちょっとで買える GPU カードを取り付けられるのならば検討してみてください。勿論GPUの性能が上がればそれだけ処理速度は速くなります。

GTX1660Tiの場合、hogよりもcnn指定の処理速度が速くなります

GPU カードがもしさせるとしたら dlib と face-recognition は CUDA に対応するよう CUDA オプションをつけて再インストールしてください。

FACE01 GRAPHICSの場合

FACE01 GRAPHICSはFACE01よりも多くの計算資源を使います。IMAGERが計算資源の乏しいサーバで使うことを前提としているのに対してGRAPHICSはより計算資源を使うことの出来るスタンドアロンで使用する前提だからです。

このようなことからFACE01 GRAPHICSで「処理速度が遅い」と感じる場合にはFACE01 IMAGERで行った引数の指定と同時にハードウェアも考慮しなくてはいけません。

SETTING MANAGERを用いない場合

マスクをつけた方々を顔登録・顔認証する現場の場合、基本的には

  • load_priset_image() 関数の引数(抜粋)は
    jitters=10,
    upsampling=0,
    mode=’cnn’
  • face_attestation() 関数の引数(抜粋)は
    jitters=0,
    upsampling=0,
    mode=’cnn’, # 速度が出る場合は ‘cnn’ と指定する
    frame_skip=10, # 手動ドロップフレーム。大きいほどカクカクする。
    movie=’usb’, # Web カメラを使う場合は ‘usb’ 、テスト用は ‘test.mp4’
    rectangle=’true’,
    show_video=’true’

サンプルスクリプト全体のコードは以下になります。

print('Start test_script')
import face01_113 as f
kaoninshoDir, priset_face_imagesDir = f.home()
known_face_encodings, known_face_names = f.load_priset_image(
	kaoninshoDir,
	priset_face_imagesDir, 
	jitters=10, 
	upsampling=0, 
	mode='cnn'
)
xs = f.face_attestation( 
	kaoninshoDir, 
	known_face_encodings, 
	known_face_names, 
	tolerance=0.5, 
	jitters=0,
	upsampling=0,
	mode='cnn', 
	frame_skip=10,
	movie='test.mp4',
	rectangle='true',
	show_video='true'
)
for x in xs:
	(name, pict, date, img, location) = (x['name'], x['pict'], x['date'], x['img'], x['location'])
	# ~ print({(name,pict)})
	# json 方式の出力
	print({
		"name": name,
		"pict": pict,
		"date": date,
		"location": {
			"top": location[0],
			"right": location[1],
			"bottom": location[2],
			"left": location[3]
		}
	})

サンプルスクリプトを動作させる前に npKnown.txt が存在する場合は一度破棄してからにしてください。

SETTING MANAGERを用いる場合

チェックするポイントは赤丸してあるところです。

mode=’hog’ と mode=’cnn’ の「速度」「追従性」比較

サンプルスクリプトの face_attestation() 関数の引数「mode」にて、

  • mode=’hog’
  • mode=’cnn’

の実行速度と追従性の比較を検証した動画を紹介します。

mode=’hog’ と mode=’cnn’ の「速度」「追従性」比較

実行環境は以下になります。

検証環境:  
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

mode=’hog’ では処理速度が速すぎて早送りのような状態になっています。これは face_attestation() 関数の引数 frame_skip=10 としているからであり、この様な場合は frame_skip=1 として良いと思います。

CPUのみで動作させる場合、

  • mode=’hog’ は処理速度が速くマスクの方への追従性が低い
  • mode=’cnn’ は処理速度は遅いがマスクの方への追従性が高い

となります。

必要となるビデオカード

通常はミドルクラス以上に差し替えたほうが良い結果を得られます。

FACE01 GRAPHICSが入力動画を認識しない

openCVのインストールについてpipでインストールした場合 Video I/O が有効になっていない場合があります。
これを確認するためには以下の様にします。

$ python3 -c 'import cv2; print(cv2.getBuildInformation())'

下のようになっていたら動画入力できない状態です。

 Video I/O:
    DC1394:                      NO
    FFMPEG:                      NO
      avcodec:                   NO
      avformat:                  NO
      avutil:                    NO
      swscale:                   NO
      avresample:                NO
    GStreamer:                   NO
    v4l/v4l2:                    YES (linux/videodev2.h)

この場合ソースからビルドするかパッケージ管理システムでインストールする必要があります。パッケージ管理システムの場合、openCV は python3-opencv です。競合を避けるため先にpipからインストールしたopencvをアンインストールして下さい。

$ pip3 uninstall opencv-python
$ sudo apt install python3-opencv

同一人物なのに face distance 値が大きい

予め同一人物と分かっているのに face distance 値が大きい場合、入力画像に使ったカメラと認証画像に使ったカメラが異なる事が多いです。

カメラが違うとついているレンズが違います。レンズには様々な収差と焦点距離があります。異なるカメラで撮影した人物が人間の目には同一人物に見えていても、プログラム側では異なる人物と判定されることがあります。下の GIF は焦点距離が異なる場合の顔の形状変化を端的に表現しています。

焦点距離の違いと顔の形状変化の様子

詳しくはレンズの歪曲収差と対応方法にまとめてありますのでご覧ください。

まとめ

今回はFACE01が起動しないところから速度に直接関係する引数指定をカバーしました。

FACE01 IMAGERでは特に引数の指定が重要であったため、1.1.3 以降では処理内部で自動的に速度と正確性を向上させる仕様変更がなされました
他方、FACE01 GRAPHICSそのものでは GUI ウィンドウに直接描画することから引数の指定だけではなく推奨するグラフィックカードもご紹介いたしました。

ハードウェア資源が限られている場合はきちんとした引数指定をする事が要となります。
ぜひ当ページを参考にして頂き、快適にFACE01シリーズをお使いください。

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

Follow me!