Windows 10 における動作環境作成とファイルの説明

動作環境を作成する
Font の確認
face01 では「BIZ-UDGOTHICR.TTC」フォントを指定しています。
October 2018 Update(1809)でインストールされているはずですが、もし顔認証するタイミングでエラーが出る場合このフォントが確実にインストールされているか確認をお願いします。
確認の仕方は「Windowsでフォントの「表示」設定を変更して全てのフォントを表示させる」をご参照ください。
余談ですが、Linux 環境の構築の場合には小さなフォントでも見やすいように「mplus-1mn-regular.ttf」を指定しています。
こちらからインストールをしておいてください。
CMake のインストール
環境を整えるために、まず「CMake」をインストールします。
https://cmake.org/
から下図の赤丸で囲まれた「Download Latest Release」をクリックします。

下図のサイトから最終安定版のインストーラ(赤線)をダウンロードします。

クリックしたら「実行」を選び、インストールを行います。

インストール先はデフォルトでもいいです
ここまで終わったら後はインストールするだけです。時間がかかるかも知れませんのでこの間に Python3 をインストールする準備をします。

Python3 のインストール
Python3 の Windows 版は
https://www.python.org/downloads/windows/
を参照してください。
下の図では赤線の 64 ビット版インストーラーを選択します。


上図の Python3 のインストール画面では赤丸で示したところを選択してください。

Python3 インストールの検証
インストールが終わったら、コマンドプロンプトから以下のように確認をしましょう。
py -V


上図のように >py –list-paths の結果、python2.x 系と python3.x 系が表示された場合には >py -3 として python3.x の最新を用いるようにしてください。ただし使用するライブラリによっては最新版の python に対応していない場合もあります。動作がおかしいときにはライブラリがお使いの python のバージョンに対応しているかどうか github などで確かめてください。
環境変数の確認
インストール後に「パスを通せませんでした」とのエラーメッセージが出たため、コントロールパネルから下図の環境設定ボタンを押します。

今回は
C:\Python37\Scripts\
C:\Python37\
C:\CMake\bin
の3つのパスが通っているようにします。(下図赤丸)
インストール先は管理者が把握していればどこでも構いません。パスが通っているかどうかだけ確認してください。

Python3 のテストコード
Python3 のテストコードを書いておきましょう。内容は
print ('hello world')
input ()
コレをメモ帳で入力した後に「test.py」と名前を変更してください。
コレをダブルクリックするとマシンによっては色々な開き方をするので予め決め打ちをしておきます。右クリックからプロパティを選んで下図のウインドウを出します。「プログラム」のところが Python になっているようにしてください

プログラム:の部分に Python を指定しておきます。下図のように表示されればOKです。

Python モジュールのインストール
次にライブラリのインストールをします。予め必要なライブラリは pip freeze で書き出しておきました(下図)。ファイル名は「requirements.txt」にしてください。コマンドプロンプトから操作します。

dlib と face-recognition についてはバージョンが上がっております。
「Windows 版 Dlib のバージョンアップのやり方」をご参照の上、バージョンアップを行ってください。
このモジュールの中で最低限必要なのは以下のとおりです。バージョン番号は消してあります。それぞれをインストールするか requirements.txt を作って一括インストールしてください。ただし用いるマシンによって rezuirements.txt が不適切な場合もありますのでなるべく個別インストールをしてください。
dlib
face-recognition
face-recognition-models
numpy
opencv-python
Pillow
pyarmor
pip install -r requirements.txt


インストールできました。
私の持っている Windows 10 64bit Pro では以下のバージョン番号になりました。
dlib と face-recognition は github から最新版をインストールしています。
dlib==19.19.99
face-recognition==1.3.0
face-recognition-models==0.3.0
numpy==1.16.4
opencv-python==4.2.0.32
Pillow==6.1.0
pyarmor==5.9.3
各ファイル・フォルダの働き
次は必要なフォルダについて解説していきます。
以下のようにフォルダが作成されれば成功です。下の図だと赤丸で囲ってある部分になります。

Face01 フォルダの中には「newFaceRecognitionFolder」が入っています。これをダブルクリックで開いてみましょう

さらに newFaceRecognitionFolder をダブルクリックして中身を見てみましょう

それではひとつひとつのフォルダを見ていきましょう。
same_person フォルダ
Face01_list で用います。
顔認証処理により同じ人物と判断された場合にこのフォルダに顔画像ファイルが移動させられます。

check_images フォルダ
- check_images フォルダ
(face01_imager.py で使用します)
色々な静止画が入っています。
ファイル名にはアスキー文字のみを使用してください。(追記:日本語も取り扱えるようになりました)
この静止画はサーバがカメラからの静止画をポンポンとこのフォルダに投げ込むことを想定しています。
ですので face01_imager では起動している間はこのフォルダを常に監視しています。
処理された静止画は
・顔部分は output フォルダへ
・静止画自体は recognated フォルダへ移動
・標準出力には人物名と処理時間が表示
されていきます。
このフォルダは常に監視されているので、一度 recognated フォルダに移動された静止画をもう一度このフォルダに放り込むと、再度同じ処理をします。どのように face01_imager が動くのか何回か試してみてください。

npKnown.txt ファイル
- npKnown.txt ファイル
face01_imager.py や face01.py を動作させると出来る、顔画像を 128次元化した数字が羅列してあるテキストファイルです。対象となる顔画像は「pictures_of_people_i_know フォルダ」に入っている顔画像です。2回目の起動からはこのテキストファイルを読み込んで動作するので起動が極めて早くなります。動作確認時にはあえてゴミ箱に捨てたり、「pictures_of_people_i_know フォルダ」の顔を入れ替えたりすることで様子を確認してみてください。
pictures_of_people_i_know フォルダをいじったときには、必ず npKnown.txt をゴミ箱に捨ててください。整合性が取れなくなった場合、エラーとしてアプリケーションが落ちるようにしてあります。


pictures_of_people_i_know フォルダ
- pictures_of_people_i_know フォルダ
認識させたい顔画像を予め入れておきます。npKnown.txt がない状態でこのフォルダをいじってください。npKnown.txt が存在する場合はそちらを読みに行きますのでこのフォルダは無視されます。
それぞれのファイルは拡張子を除去してあります。
繰り返しになりますが、pictures_of_people_i_know フォルダをいじったときには、必ず npKnown.txt をゴミ箱に捨ててください。pictures_of_people_i_know フォルダと npKnown.txt の整合性が取れない場合はエラーとしてアプリケーションを落とします。
正常に起動しないな…と思ったときには npKnown.txt を捨ててください。

noFace フォルダ
- noFace フォルダ
pictures_of_people_i_know フォルダに入れた顔画像のうち、顔が認識できなかったものや小さすぎるサイズのものはこのフォルダに移動させられます。勿論その場合は顔画像の数値化が出来ません。

pictForPeople フォルダ
- pictForPeople フォルダ
色々な顔画像が入っています。テストに使ってください。拡張子は除去してあります。

output フォルダ
- output フォルダ
face01_imager.py や face01.py を動作させた時にここにクロップされた顔画像が溜まっていきます。
ファイル名には認識した人名とその時間が入ります。

recognated フォルダ
- recognated フォルダ
face01_imager.py を動作させた時に処理された静止画がこちらに格納されていきます。

主要なフォルダの説明は以上です。次にファイルを見ていきましょう。
test.mp4
- test.mp4
Face01 で用いるテスト用の動画ファイルです。テスト対象の動画ファイル名は必ず「test.mp4」のファイル名にしてください。
なお、test.mp4 で顔認証したい顔画像の登録は「pictures_of_people_i_know」に顔画像ファイルを置いておきます。
顔画像ファイル自体については「新規に顔画像登録する方法」をご参照ください。

アプリケーションについて
Face01
- Face01.py
pictures_of_people_i_know フォルダの中身を解析して test.mp4 ファイル、あるいは USB カメラからの入力を読み込み顔部分に四角形と名前を表示します。また標準出力には人物名と検出時間を出力します。クロップされた顔画像は output フォルダに格納されていきます。npKnown.txt がある場合は pictures_of_people_i_know フォルダを読みに行かないことに気をつけてください。
動作中に止める場合にはキーボードの「q」を押してください
サンプルスクリプトの内容の説明については「Face01 1.1.2 の呼び出し方について解説します」をご参照ください。
# coding: utf-8
print('Start test_script')
import face01_113 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.45,
jitters=1,
upsampling=1,
mode='hog',
model='large',
frame_skip=1,
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]
}
})
'''
変数について
jitters ゆらぎ値。ランダムにスケールアップや色の修正をして平均値を返す。デフォルト値 0
upsampling サンプリング指定値。0 の時 80x80 ピクセルで顔探索をする。1 では 40x40 ピクセル。
mode CNN, HOG 両形式を指定する。
model small -> 5-points method, large -> 68-points method
tolerance 閾値。
frame_skip フレームドロップの割合。入力が 30fps の場合 frame_skip=2 では 15fps となる
movie 動画入力元を test.mp4 と USB カメラの 2 種類から選ぶ
'''



Face01_imager
- face01_imager.py
check_images フォルダを常に監視し、中に入った静止画から顔の解析を行います。
対象とする顔画像は pictures_of_people_i_know フォルダですが、npKnown.txt ファイルがある場合には無視されます。
output フォルダにクロップした顔画像を名前と検出時間のファイル名で保存していきます。
標準出力には検出した人物名と検出時間が表示されます。
処理された静止画は recognated フォルダに移動されます。
常に監視し続けるので終了したい場合は標準出力画面で「Cnt+C」を押してください。
recognated フォルダからcheck_images フォルダへ画像をいくつか移動させると即座に処理する様子をみることが出来ます。
サンプルスクリプトの内容の説明については「Face01_imager 1.1.0 の呼び出し方について解説します」をご参照ください。
# coding: utf-8
print('Start test_script')
import face01_imager_112 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=0,
mode='cnn',
model='small'
)
while(1):
xs = f.face_attestation(
check_images,
known_face_encodings,
known_face_names,
tolerance=0.5,
jitters=0,
upsampling=0,
mode='cnn',
model='small'
)
for x in xs:
(name, date) = (x['name'], x['date'])
print(
name, date
)
'''
変数について
jitters ゆらぎ値。ランダムにスケールアップや色の修正をして平均値を返す。デフォルト値 0
upsampling サンプリング指定値。0 の時 80x80 ピクセルで顔探索をする。1 では 40x40 ピクセル。
mode CNN, HOG 両形式を指定する。
model small -> 5-points method, large -> 68-points method
tolerance 閾値。


Face01_list
- face01_list
実用に耐えうる「通った人のユニーク数と顔画像ファイルを得るアプリケーション」です。
対象とする顔画像は pictures_of_people_i_know フォルダです。こちらは npKnown.txt ファイルは作成されません。
output フォルダにクロップした顔画像を保存していきます。
常に監視し続けるので終了したい場合は標準出力画面で「Cnt+C」を押してください。
詳しくはこちらをご覧ください。 - 開発の様子はこちらに掲載しております。
サンプルスクリプトの引数などについては「Face01_list 1.1.2 の呼び出し方について解説します」をご参照ください。
# coding utf-8
print('Start test_script')
import face01_list_112 as f
from multiprocessing import Pool, Process
import threading
(kaoninshoDir, outputDIR) = f.home()
p1 = Process(target=f.faceCrop, args=(
kaoninshoDir,
30,
'test.mp4'
)) # frame_skip, input
thread = threading.Thread(
target=f.openDIR,
args=([
outputDIR,
0.55,
0,
1,
'hog',
'large'
])
) # tolerance, upsampling, jitters, mode, model
thread.start()
p3 = Process(target=f.person_count, args=(outputDIR,))
p1.start()
p3.start()
'''
各変数
frame_skip frame をスキップする回数
input 動画入力元を指定。test.mp4 か usb 。usb は Web カメラ
tolerance 閾値
upsampling アップサンプリング値。0: 80x80pixel, 1: 40x40pixel, 2: 20x20pixel
jitters ゆらぎ値
mode CNN or HOG
model small or large. small: 5-points method, large: 68-points method.
'''
まとめ
以上です。
アプリケーションは端末から起動しても良いし、サンプルスクリプトを作ってそこから import して呼び出してもらっても大丈夫です(Windows 10 でのテストスクリプト)。
色々試してみてください。