FACE01 GRAPHICS 1.2.5を外部から呼び出す

FACE01 GRAPHICS 1.2.5を外部から呼び出します。この時ウィンドウに映像が出力されるようにします。またメニーコアの恩恵を享受するため並行処理を行いたいと思います。実際のウィンドウのスクリーンショットが下図です。

コード

実際のコードは下記となります。コード先頭の変数設定ブロックに必要な設定を入力します。

# 変数設定 ==========================
tolerance=0.45
jitters=0
upsampling=0
mode='cnn'
model='small'
frame_skip=-1
movie='test_distortion.mp4'
rectangle=False
target_rectangle=True
show_video=False
frequency_crop_image=5
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=600
# ===================================


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=model, 
    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):
    name, date, img, location, percentage_and_symbol = x['name'], x['date'], x['img'], x['location'], x['percentage_and_symbol']
    print(name, percentage_and_symbol, location, date)
    return img

pool = ProcessPoolExecutor()
for x in xs:
    # <DEBUG>
    if x=={}:
        continue
    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)

# window close
window.close()
print('終了します')

動作の様子

システムモニターを確認するとCPUが満遍なく使用されていることが確認できます。

まとめ

FACE01 GRAPHICSを呼び出す際、今回は処理を並行処理しました。Pythonは深く考えなくても簡単に並列・並行化出来るので便利だと思いました。実際のアプリケーションを構築する際は力を発揮するのではないでしょうか。

以上です。

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

ドキュメント

前の記事

GPU導入