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

Windows10でFACE01 GRAPHICSのサンプルアプリケーションを動作させる方法は複数存在します。今回はDockerやWSL2を用いない、ある意味一番素直な動作環境の作成のやり方について解説します。

実際に行うことはCMAKEとPython3のインストール、Pythonライブラリのインストールです。

今回の解説記事では前半に動作環境の作成の仕方、後半にサンプルアプリケーションのフォルダ解説を行います。

この記事ではGPUの利用については触れません。
FACE01 GRAPHICSはGPUの利用によって本来の速度を発揮しますが、サンプルアプリケーションを使う上で最低限の環境構築に留めております。
サンプルアプリケーションはFACE01 GRAPHICS Windows10版からダウンロード出来ます。お問い合わせの上ダウンロード下さい。

動作環境を作成する

Font の確認

face01 では「BIZ-UDGOTHICR.TTC」フォントを指定しています。
October 2018 Update(1809)でインストールされているはずですが、もし顔認証するタイミングでエラーが出る場合このフォントが確実にインストールされているか確認をお願いします。
確認の仕方は「Windowsでフォントの「表示」設定を変更して全てのフォントを表示させる」をご参照ください。

CMake のインストール

環境を整えるために、まず「CMake」をインストールします。
https://cmake.org/
から下図の赤丸で囲まれた「Download Latest Release」をクリックします。

CMake ダウンロードサイト
CMake ダウンロードサイト

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

インストーラのダウンロード
インストーラのダウンロード

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

インストールオプション
インストールオプション

上図の赤丸で囲ってあるところにチェックを入れましょう。

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

インストール画面
インストール画面

Python3 のインストール

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

バージョンは3.7.7を選択してください
本番環境では最新版を使いますが、サンプルアプリケーションではPython3.7.7に対応したライブラリを使っています。3.7.7以外ではエラーを発生させる恐れがあります
もし既にPython環境をお持ちの場合はPyenvなどでPython3.7.7に合わせてください。

64 ビットのインストーラーを選択
64 ビットのインストーラーを選択
Python3 のインストール画面
Python3 のインストール画面

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

Python3 のインストール画面
Python3 のインストール画面

Python3 インストールの検証

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

py -V

pyコマンドがインストールされていない時は
> python –version
と打ち込んでください。

インストールの確認画面
インストールの確認画面
py コマンドのパス
py コマンドのパス

上図のように >py –list-paths の結果、Python2.x 系と Python3.x 系が表示された場合には >py -3 として Python3.7.7 を用いるようにしてください。(繰り返しになりますが既にPython環境が存在する場合にはサンプルアプリケーションを動作させるためにPyenvなどを用いてPython3.7.7環境を用意してください)

環境変数の確認

インストール後に「パスを通せませんでした」とのエラーメッセージが出たため、コントロールパネルから下図の環境設定ボタンを押します。

パスを通す画面
パスを通す画面

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

パスを通しておく
パスを通しておく

Python3 のテストコード

ここではインストールしたPythonが動作するか検証しています。心配ない方は読み飛ばしてください。

Python3 の動作確認をするためテストコードを書いてみます。内容は

print ('hello world')
input ()

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

test.py のプロバティ画面
test.py のプロバティ画面

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

hello world が表示された画面
hello world が表示された

Python モジュールのインストール

サンプルアプリケーションを動作させるのに必要なライブラリのインストールをします。予め必要なライブラリは pip freeze で書き出しておきました。

一括インストールする場合、「requirements.txt」の中身は以下のようにしてください。

Windowsの場合

dlib==19.19.99
face-recognition==1.3.0
face-recognition-models==0.3.0
glob2==0.5
matplotlib==3.4.2
numpy==1.16.4
opencv-python==4.2.0.32
Pillow==8.2.0
PySimpleGUI==4.43.0
pip install -r requirements.txt

requirements.txtによる一括インストールに失敗する場合は手動(pip install)で一つずつインストールしてください。

コマンドプロンプトの様子
requirements.txt から一括インストールしている画面
requirements.txt から一括インストールしている様子

インストールできました。

以上で環境構築は終了です。
お疲れ様でした

各ファイル・フォルダの働き

ではこの解説記事後半に入りたいと思います。

後半では受け取ったサンプルアプリケーションのフォルダ構成について解説していきます。

ユーザーディレクトリ直下に Face01 フォルダを展開・作成
FACE01 フォルダを展開・作成

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

newFaceRecognitionFolder
newFaceRecognitionFolder

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

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

priset_face_images フォルダ

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

noFace フォルダ

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

pictForPeople フォルダ

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

output フォルダ

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

recognated フォルダ

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

主要なフォルダの説明は以上です。次にファイルを見ていきましょう。

test.mp4

  • test.mp4
    FACE01 で用いるテスト用の動画ファイルです。テスト対象の動画ファイル名は必ず「test.mp4」のファイル名にしてください。
    なお、test.mp4 で顔認証したい顔画像の登録は「priset_face_images」に顔画像ファイルを置いておきます。
    顔画像ファイル自体については「新規に顔画像登録する方法」をご参照ください。
test.mp4
test.mp4

アプリケーションについて

FACE01 GRAPHICS

  • FACE01_GRAPHICS_120.py
    FACE01 GRAPHICSの本体です。このファイルは触りません。
  • SETTING_MANAGER.py
    こちらのファイルからFACE01を起動します。
    またこちらのウィンドウを編集することでオプションを変化させることが出来ます。
    サンプルアプリケーションを試用する場合にお使い下さい。実際の開発を行う時はFACE01_GRAPHICS_120.pyを直接編集したり外部からオプション変数を指定したりします。
SETTING MANAGERの編集画面

FACE01 GRAPHICS(サンプルアプリケーション)の起動の仕方

## Windows10の場合
>python SETTING_MANAGER.py

npKnown.txt がある場合は priset_face_images フォルダを読みに行きません。
手動でpriset_face_images フォルダの中身を変更した場合、必ず「プリセット顔画像ファイル再構築」のチェックボタンにチェックを入れて下さい。これをしない場合顔認証結果がおかしくなるか、アプリケーションをストップさせる仕様になっています。

動作中に止める場合にはキーボードの「q」を押してください

これより以下はCLIでオプション変数を編集する場合の例になります。
サンプルスクリプトについてはスクリプト内のコメントをご参照ください。
詳細な解説は「Face01_Graphics 1.1.8 の呼び出し方について解説します」をご参照ください。

# coding: utf-8

print('Start test_script')

import Face01_Graphics_119 as f

kaoninshoDir, priset_face_images Dir = f.home()

## レンズ歪みのエミュレーションをするかどうか:デフォルト値:'off'
## 機能実装中なので触らないこと
f.lens_distortion_emulate(
    switch='off'
)

## プリセット画像の読み込みとオプション指定
known_face_encodings, known_face_names = f.load_priset_image(
    kaoninshoDir,
    priset_face_images Dir, 
    jitters=3, 
    upsampling=0, 
    mode='hog', 
    model='small'
)
""" オプション変数の説明
jitters                     ゆらぎ値。ランダムにスケールアップや色の修正をして平均値を返す。デフォルト値 0
upsampling                  サンプリング指定値。0 の時 80x80 ピクセルで顔探索をする。1 では 40x40 ピクセル。デフォルト値:0
mode                        CNN, HOG 両形式を指定する。顔検出しにくい場合は'cnn'を指定する。デフォルト値:'hog'
model                       small -> 5-points method, large -> 68-points method デフォルト値:'small' """

xs = f.face_attestation(
    kaoninshoDir, 
    known_face_encodings, 
    known_face_names, 
    tolerance=0.5, 
    jitters=0,
    upsampling=0,
    mode='hog', 
    model='small',
    frame_skip=10,
    movie='test.mp4',
    rectangle='false',
    target_rectangle='true',
    show_video='true',
    frequency_crop_image=5
)
""" オプション変数の説明
jitters                     ゆらぎ値。ランダムにスケールアップや色の修正をして平均値を返す。デフォルト値 0
upsampling                  サンプリング指定値。0 の時 80x80 ピクセルで顔探索をする。1 では 40x40 ピクセル。デフォルト値:0
mode                        CNN, HOG 両形式を指定する。顔検出しにくい場合は'cnn'を指定する。デフォルト値:'hog'
model                       small -> 5-points method, large -> 68-points method デフォルト値:'small'
tolerance                   閾値。顔認証の厳格さを指定する。低いほど厳格。デフォルト値:0.5
frame_skip                  フレームドロップの割合。入力が 30fps の場合 frame_skip=2 では 15fps となる
                            マシン速度によって調節すること。デフォルト値:0
movie                       動画入力元を test.mp4 と USB カメラの 2 種類から選ぶ。デフォルト値:'test.mp4'
rectangle                   顔周囲に四角枠(直接描画)を描画するか否かを指定。デフォルト値:'false'
target_rectangle            顔周囲に四角枠(png画像)を描画するか否かを指定。デフォルト値:'true'
show_video                  openCV 由来の GUI による動画表示の有無。デフォルト値:'true'
frequency_crop_image        フレームをいくつ飛ばして output するか調節する。frame_skip値に影響される。デフォルト値:10 """

for x in xs:
    (name, pict, date, img, location, percentage) = (x['name'], x['pict'], x['date'], x['img'], x['location'], x['percentage'])
    print({(name,pict)})
    print(name, percentage, pict)

"""     ## json方式の出力
    print({
        "name": name,
        "percentage": percentage,
        "pict": pict,
        "date": date,
        "location": {
            "top": location[0],
            "right": location[1],
            "bottom": location[2],
            "left": location[3]
        }
    }) """
    

FACE01 IMAGER

  • face01_imager.py
    check_images フォルダを常に監視し、中に入った静止画から顔の解析を行います。
    対象とする顔画像は priset_face_images フォルダですが、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, priset_face_imagesDir, check_images = f.home()


known_face_encodings, known_face_names = f.load_priset_image(
	kaoninshoDir,
	priset_face_imagesDir, 
	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		閾値。
pictures_of_people_i_know フォルダから顔画像をエンコードしている様子
priset_face_images フォルダから顔画像をエンコードしている様子
検出した顔の人物名と時刻を表示している様子
検出した顔の人物名と時刻を表示している様子

FACE01 LIST

  • 現在運用していません
  • face01_list
    実用に耐えうる「通った人のユニーク数と顔画像ファイルを得るアプリケーション」です。
    対象とする顔画像は priset_face_images フォルダです。こちらは 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 でのテストスクリプト)。
色々試してみてください。

Follow me!