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

アイキャッチ画像 ubuntu18.0.4

Ubuntu 18.04 環境下での説明をしておりますが、 Ubuntu 20.04 も内容は同じです。

※(注)
記載しているスクリーンショットは Windows XP のウィンドウに見えますが Ubuntu 環境下の XFCE にて視認性を良くするため個人的にテーマを改変したものです。

動作環境を作成する

Font の確認

face01_linux では「mplus-1mn-regular.ttf」フォントを指定しています。
こちらからダウンロードしてください。Synaptic ( パッケージ管理ソフトウェア ) からインストールする場合は「fonts-mplus」で検索してください。
インストールできたかの確認は

$ fc-list | grep mplus-1mn-regular.ttf

で確認できます。

Synaptic では以下のようになります。

CMake のインストール

環境を整えるために、まず「CMake」をインストールします。
Ubuntu の場合は Windows と違いパッケージマネージャからインストール可能です。

Synaptic パッケージマネージャから CMake をインストールする
Synaptic パッケージマネージャから CMake をインストールする

Python3 の確認

Ubuntu では、Python3 が予めインストールされています。
しかしながらコマンドラインで $python -V と入力するとデフォルトの 2.7 系が表示されてしまいます。

$ python3 -V

と打ち込んでください。(-V は大文字)

ここでは
Python 3.6.9
と表示されました。

Python3 のテストコード

Python3 のテストコードを書いておきましょう。内容は

print ('hello world')
Python3 を起動した仮想端末
Python3 を起動した仮想端末

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

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

dlib と face-recognition のバージョンアップをしてください。やり方は「Windows 版 Dlib のバージョンアップのやり方」を参考にしてください。

$ pip3 list でバージョンの確認した様子
$ pip3 list でバージョンの確認した様子

requirements.txt の中身は以下のとおりです。下の内容をコピーしてエディタにペースト、その後ファイル名を「requirements.txt」にして使ってもらっても大丈夫です。

 dlib
 opencv-python
 face-recognition
 face-recognition-models
 numpy
 PIL
pip install -r requirements.txt

上の例ではバージョン番号を削除しています。インストールの際にはバージョンは最新にしてください。
requirements.txt で一気にインストールできたように見えても実際はインストール出来ていないこともあります。そういう時はひとつづつインストールするようにしてください。

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

次は必要なフォルダについて解説していきます。

以下のようにフォルダが作成されれば成功です。下の図だと赤丸で囲ってある部分になります。

Face01 フォルダ
Face01 フォルダ

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

newFaceRecognitionFolder
newFaceRecognitionFolder

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

newFaceRecognitionFolder の中身
newFaceRecognitionFolder の中身

それではひとつひとつのフォルダを見ていきましょう。

same_person フォルダ

Face01_list で用います。
顔認証処理により同じ人物と判断された場合にこのフォルダに顔画像ファイルが移動させられます。

same_person フォルダ
same_person フォルダ

check_images フォルダ

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

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 をゴミ箱に捨ててください。整合性が取れなくなった場合、エラーとしてアプリケーションが落ちるようにしてあります。
npKnown.txt ファイル
npKnown.txt ファイル
npKnown.txt ファイルのなかみ
npKnown.txt ファイルのなかみ

pictures_of_people_i_know フォルダ

  • pictures_of_people_i_know フォルダ
    認識させたい顔画像を予め入れておきます。顔画像ファイルは 200 x 200 ピクセルを推奨します。
    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 フォルダに入れた顔画像のうち、顔が認識できなかったものや小さすぎるサイズのものはこのフォルダに移動させられます。勿論その場合は顔画像の数値化がなされません。
noFace フォルダ
noFace フォルダ

pictForPeople フォルダ

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

output フォルダ

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

recognated フォルダ

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

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

test.mp4

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

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

Face01_Graphics

  • Face01_Graphics_<version>.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 種類から選ぶ
'''
顔を検出している様子
USB カメラからの顔画像解析の様子
USB カメラからの顔画像解析の様子

Face01_Imager

  • face01_imager_<version>.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', name,
			'date', 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 フォルダから顔画像をエンコードしている様子
pictures_of_people_i_know フォルダから顔画像をエンコードしている様子
検出した顔の人物名と時刻を表示している様子
検出した顔の人物名と時刻を表示している様子

Face01_List

  • face01_list_<version>.py
    実用に耐えうる「通った人のユニーク数と顔画像ファイルを得るアプリケーション」です。
    対象とする顔画像は 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 して呼び出してもらっても大丈夫です(Linux でのテストスクリプト)。
色々試してみてください。

Follow me!