追加の関数チュートリアル

FACE01には、face01lib/内に多くの関数が含まれています。 このセクションでは、FACE01で使用可能な関数の使い方について(補足的に)説明します。


💥 このドキュメントは公式ドキュメントを補完するものです。そのため最新のドキュメントを反映していません。

正しい使い方は必ず公式ドキュメントを参照するようにしてください。

説明文

公式ドキュメント

準備

Loggerの初期化と設定

FACE01を使用するプログラムをコーディングする際には、最初にinitializeおよびloggerをコードします。 これにより、設定ファイルconfig.iniを読み込み、エラーなどをログに記録します。

from face01lib.Initialize import Initialize
from face01lib.logger import Logger

# 初期化
CONFIG: Dict =  Initialize('LIGHTWEIGHT_GUI', 'info').initialize()
# Loggerの設定
logger = Logger(CONFIG['log_level']).logger(__file__, CONFIG['RootDir'])

Dlib_apiクラス

このクラスは、ageitgeyによるface_recognitionを元に修正されており、モデルデータはdaviskingによるdlibから取得しています。68点のフェイスモデルだけでなく、5点のフェイスモデルも使用します。 例についてはCore.return_face_location_listを参照してください。

from face01lib.api import Dlib_api
Dlib_api_obj = Dlib_api()

face_locations

フレーム内の顔のバウンディングボックスの配列を返します。

face_list = Dlib_api_obj.face_locations(img, number_of_times_to_upsample, model)

for i in range(exec_times):
    next_frame = next_frame_gen_obj.__next__()
    if model == 'cnn':
        print( [Dlib_api_obj._trim_css_to_bounds(Dlib_api_obj._rect_to_css(face.rect), next_frame.shape) for face in Dlib_api_obj._raw_face_locations(next_frame, number_of_times_to_upsample, model)])
    else:
        print( [Dlib_api_obj._trim_css_to_bounds(Dlib_api_obj._rect_to_css(face), next_frame.shape) for face in Dlib_api_obj._raw_face_locations(next_frame, number_of_times_to_upsample, model)])

結果

...
[(145, 177, 259, 63), (108, 521, 272, 357)]
[(134, 177, 248, 63), (92, 521, 256, 357)]
[(125, 199, 261, 62), (108, 521, 272, 357)]
[(125, 199, 261, 62), (92, 521, 256, 357)]
[(125, 199, 261, 62), (92, 521, 256, 357)]
[(138, 185, 275, 49), (92, 521, 256, 357)]

Coreクラス

Coreクラスをインポートします。

from face01lib.Core import Core

return_face_location_list

顔の位置リストを返します。この関数は、api.face_locationsよりも高速です。

frame_datas_array = core.frame_pre_processing(logger, CONFIG,resized_frame)

for frame_datas in frame_datas_array:
    print(f"face coordinates: {frame_datas['face_location_list']}\n")

結果

[2023-01-23 09:28:02,587] [face01lib.load_preset_image] [load_preset_image.py] [INFO] Loading npKnown.npz
face coordinates: [(161, 443, 311, 294)]

face coordinates: [(162, 438, 286, 314)]

完全な例のコードはこちらにあります。

load_preset_image

この関数はpreset_face_imagesフォルダ内の顔画像を読み込み、npKnown.npzファイルを作成します。

return_anti_spoof(実験的)

このメソッドは、spoof_or_realscore、およびELEのデータを返します。

一般に、トレーニングされたモデルから推測される結果は、1と0に明確に分かれるわけではありません。このため、FACE01ではELE: Equally Likely Eventsという概念を取り入れています。scoreは元々0〜1の間の2つの数字を示します。このとき、2つの数字の差が0.4に設定され、その差が0.4以下の組み合わせは「同じくらい確度」であると見なされます(=Equally Likely Events)。FACE01ではこれをELEとして表現しています。つまり、2つの数字の差が0.4未満の場合、それがspoofnot spoofかを判断することはできません。

from face01lib.Core import Core
spoof_or_real, score, ELE = Core().return_anti_spoof(frame_datas['img'], person_data["location"])
if ELE is False:
    print(
        name, "\n",
        "\t", "Anti spoof\t\t", spoof_or_real, "\n",
        "\t", "Anti spoof score\t", round(score * 100, 2), "%\n",
        "\t", "similarity\t\t", percentage_and_symbol, "\n",
        "\t", "coordinate\t\t", location, "\n",
        "\t", "time\t\t\t", date, "\n",
        "\t", "output\t\t\t", pict, "\n",
        "-------\n"
    )

VidCapクラス

このクラスはvideo_captureに含まれています。 インポートするには、以下を参照してください。

from face01lib.video_capture import VidCap

resize_frame

リサイズされた画像のnumpy配列を返します。

resized_frame = VidCap().resize_frame(set_width, set_height, original_frame)

return_movie_property

入力された映画データのfps、高さ、幅のプロパティを返します。

set_width,fps,height,width,set_height = VidCap().return_movie_property(set_width, vcap)

結果

...
set_width:  750
 set_height: 421
 fps:  30