処理速度0.014秒 FACE01 GRAPHICS ver.1.2.5
2021年8月8日、FACE01 GRAPHICSはバージョン1.2.5になりました。ここでは改めて処理速度の計測をしてみたいと思います。
FACE01 GRAPHICSを現実的な速度で動作させるにはミドルクラスかそれ以上のGPUカード(GeForce® GTX 1660 Tiなど)が必要です。
下記は検証に用いたマシンプロファイルです
-Computer-
Processor : AMD Ryzen 5 1400 Quad-Core Processor
Memory : 16389MB
Machine Type : Desktop
Operating System : Ubuntu 18.04.5 LTS
OpenGL Renderer : NVIDIA GeForce GTX 1660 Ti/PCIe/SSE2
コード
FACE01 GRAPHICSを外部から呼び出すCALL_FACE01GRAPHICS125を作成し、その中にタイマー機能を付与します。CALL_FACE01GRAPHICS125の全コードは以下のとおりです。
# 変数設定 ==========================
tolerance=0.45
jitters=0
upsampling=0
mode='cnn'
frame_skip=-1
movie='test_distortion.mp4'
rectangle=False
target_rectangle=True
show_video=False
frequency_crop_image=10
set_area='NONE'
face_learning_bool=False
how_many_face_learning_images=1
output_frame_data_bool=False
print_property=False
calculate_time=True
SET_WIDTH=500
# ===================================
import time
from concurrent.futures import ProcessPoolExecutor
import cv2
import PySimpleGUI as sg
import FACE01GRAPHICS125 as fg
kaoninshoDir, priset_face_imagesDir = fg.home()
known_face_encodings, known_face_names = fg.load_priset_image.load_priset_image(
kaoninshoDir,
priset_face_imagesDir,
jitters = 10,
upsampling=0,
)
xs = fg.face_attestation(
kaoninshoDir,
known_face_encodings,
known_face_names,
tolerance=tolerance,
jitters=jitters,
upsampling=upsampling,
mode=mode,
model='small',
frame_skip=frame_skip,
movie=movie,
rectangle=rectangle,
target_rectangle=target_rectangle,
show_video=show_video,
frequency_crop_image=frequency_crop_image,
set_area=set_area,
face_learning_bool=face_learning_bool,
how_many_face_learning_images=how_many_face_learning_images,
output_frame_data=output_frame_data_bool,
print_property=print_property,
calculate_time=calculate_time,
SET_WIDTH=SET_WIDTH
)
# window実装
layout = [
[sg.Text('GUI実装例')],
[sg.Image(filename='', pad=(25,25), key='cam1')]
]
window = sg.Window('window1', layout, alpha_channel=1)
# 並行処理
def multi(x):
return x['img']
pool = ProcessPoolExecutor()
for x in xs:
# <DEBUG>
if x=={}:
continue
befor_time = time.perf_counter()
result = pool.submit(multi, x)
event, _ = window.read(timeout=1)
if event == sg.WIN_CLOSED:
break
imgbytes=cv2.imencode(".png", result.result())[1].tobytes()
window["cam1"].update(data=imgbytes)
after_time=time.perf_counter()
print(f'{round((after_time - befor_time) * 1000, 2)}')
# window close
window.close()
print('終了します')
登録人数は約650人で検証しました。
勘所
外部プログラムがFACE01 GRAPHICSにリクエストを投げて処理結果が返ってくるまでを計測しました。下記が該当部分になります。
def multi(x):
return x['img']
for x in xs:
...
befor_time = time.perf_counter()
...
result = pool.submit(multi, x)
...
after_time=time.perf_counter()
print(f'{round((after_time - befor_time) * 1000, 2)}')
それでは計測を始めましょう
検証
対象が1人の場合
処理結果を検証します。
経過時間を500サンプルとり、これらの平均・標準偏差を計算しました。
- 平均値:13.78ミリ秒
- 中央値:13.36ミリ秒
- 標準偏差:1.49
となりました。約0.014秒となります。
対象が2人の場合
顔認証の対象が2人に増えた場合の処理にかかる時間を計測してみます。
- 平均値:14.45ミリ秒
- 中央値:14.18ミリ秒
- 標準偏差:1.05
こちらも約14ミリ秒でした。(0.014秒)
まとめ
FACE01 GRAPHICSの古いバージョンでは約0.03秒でした。現在(2021年8月)の最新バージョンでは0.01秒ですからタイムが縮んでよかったです。