関数のチュートリアル

このセクションでは、main_process関数について説明します。 他の関数の情報はこちらで説明されています。 FACE01を使用するためには、このチュートリアルを読むだけで十分です。


FACE01を本格的に使うには多くのクラスとメソッドを知らなくてはいけません⭐️''

でもこのページに書いてあることを知れば最低限動かせます💗

疑問点があればエグザンプルコードを参考にしましょう。

説明文

まず、FACE01をインポートする必要があります。

import FACE01 as fg

main_process

FACE01.pyファイル内で以下のように定義されています。

Core_obj= Core()
def main_process():
    frame_datas_array = Core_obj.frame_pre_processing(logger, args_dict, frame_generator_obj.__next__())
    face_encodings, frame_datas_array = Core_obj.face_encoding_process(logger, args_dict, frame_datas_array)
    frame_datas_array = Core_obj.frame_post_processing(logger, args_dict, face_encodings, frame_datas_array, GLOBAL_MEMORY)
    yield frame_datas_array

この関数は3つの部分に分かれています。

  1. Core_obj.frame_pre_processing(logger, args_dict, frame_generator_obj.__next__())

  2. Core_obj.face_encoding_process(logger, args_dict, frame_datas_array)

  3. Core_obj.frame_post_processing(logger, args_dict, face_encodings, frame_datas_array, GLOBAL_MEMORY)

Coreface01lib.Core内で宣言されたクラスです。 Coreクラスをインポートするには、frame_pre_processingセクションを参照してください。

main_processメソッドはジェネレータであり、配列を返します。

frame_datas_array = fg.main_process().__next__()

説明文

ジェネレーターをぶん回すと映像フレームごとの様々な情報が取得できます。

どんなデータをどのように利用するか、アナタ次第です⭐️''


while True:
    try:
        frame_datas_array = main_process().__next__()
    except Exception as e:
        print(e)
        print(traceback.format_exc())
        exit(0)
    exec_times = exec_times - 1
    if  exec_times <= 0:
        break
    else:
        print(f'exec_times: {exec_times}')
        if args_dict["headless"] == False:
            event, _ = window.read(timeout = 1)
            if event == sg.WIN_CLOSED:
                print("The window was closed manually")
                break
        for frame_datas in frame_datas_array:
            if "face_location_list" in frame_datas:
                img = frame_datas['img']
                person_data_list = frame_datas['person_data_list']

                for person_data in person_data_list:
                    if person_data == {}:
                        continue

                    name = person_data['name']
                    pict = person_data['pict']
                    date = person_data['date']
                    location = person_data['location']
                    percentage_and_symbol = person_data['percentage_and_symbol']

frame_pre_processing

fg.Core().frame_pre_processing(fg.logger, fg.args_dict,next_frame)

は、imgface_location_listoverlayperson_data_listの変数を含むDictを返します。

  • img

    • numpy.ndarray

  • face_location_list

    • List[tuple]

  • overlay

    • numpy.ndarray

  • person_data_list

    • List[Dict{name:'', pict: '', date: '', location: tuple, percentage_and_symbol: ''}]

face_location_listには顔の座標が含まれています。顔の座標のみが必要な場合、この関数は便利です。

face_encoding_process

映像のフレーム内にいる人物の名前を取得したい場合、frame_pre_processingface_encoding_process、およびframe_post_processingメソッドを呼び出す必要があります。 これら3つのメソッドはmain_process内にグループ化されています。 face_encoding_processframe_post_processingは、単独で使用される機会は少ないです。

fg.Core().face_encoding_process(fg.logger, fg.args_dict, fg.frame_datas_array)

は、face_encodingsframe_datas_arrayを返します。

  • face_encodings

    • numpy.ndarray[list, ...]

  • frame_datas_array

    • [{'img': 'no-data_img', 'face_location_list': [...], 'overlay': array([], dtype=float64), 'person_data_list': [...]}]

frame_post_processing

 fg.Core().frame_post_processing(fg.logger,fg.args_dict, face_encodings, frame_datas_array, fg.GLOBAL_MEMORY)

は、frame_datas_arrayを返します。

  • [{'img': 'no-data_img', 'face_location_list': [...], 'overlay': array([], dtype=float64), 'person_data_list': [...]}]

person_data_list

上記の例では、返された値person_data_listが非常に重要です。 person_data_listには、以下の値が含まれています。

  • name

  • pict

    • 保存された顔画像ファイルのパス

  • date

  • location

    • Tuple: フレーム内の顔の座標

    • (top, right, bottom, left)

  • percentage_and_symbol

    • フレーム内の顔の類似度を'%'で表したもの

for person_data in person_data_list:
    name, pict, date,  location, percentage_and_symbol = \
        person_data['name'], person_data['pict'], person_data['date'],  person_data['location'], person_data['percentage_and_symbol']
    if not name == 'Unknown':
        print(
            name, "\n",
            "\t", "similarity\t", percentage_and_symbol, "\n",
            "\t", "coordinate\t", location, "\n",
            "\t", "time\t", date, "\n",
            "\t", "output\t", pict, "\n",
            "-------\n"
        )

結果は以下のようになります。

菅義偉
         similarity      99.3%
         coordinate      (127, 182, 276, 33)
         time    2022,07,22,11,05,01,426742
         output  output/菅義偉_2022,07,22,11,05,01,459014_0.34.png
 -------

麻生太郎
         similarity      99.4%
         coordinate      (122, 535, 281, 376)
         time    2022,07,22,11,05,01,426742
         output  output/菅義偉_2022,07,22,11,05,01,459014_0.34.png
 -------