01.06 DeepFace ~埋め込み(embeddings)~

次へ進む前にもう一つ確認しておきたいことがあります。それは、DeepFace.findメソッドで使用してたモデルについてです。DeepFaceがラップしているハイブリッド顔認識モデルは全部で9つあります。

# /// 顔認識モデル(models)
# ///   デフォルト設定では VGG-Face モデルが使用
# ////////////////////////////////////////////////////////////////////////////
models = [
  "VGG-Face",
  "Facenet",
  "Facenet512",
  "OpenFace",
  "DeepFace",
  "DeepID",
  "ArcFace",
  "Dlib",
  "SFace",
]

顔抽出用バックエンドは、既に「バックエンド」と言っているように抽出領域は「facial_area」、その信頼度は「face_confidence」となって現れます。但し、内部で扱われる顔データは「顔ベクトル」と呼ばれるベクトルとなりますが、使用モデルによって異なる方式で異なった「顔ベクトル」が出来上がっていきます。
少々モデル別方式の例を挙げてみると、


・ VGG-Faceモデル
DeepFaceのデフォルトモデルとなっているVGG-Faceモデル構成は、名前に「VGG」とあるようにCNNネットワーク構成となっており何ら変わりはありません。
【理論参考サイト】
https://sefiks.com/2018/08/06/deep-face-recognition-with-keras/




・ FaceNet
Googleが作成したFaceNetは画像より顔ベクトルを取得し、ユークリッド距離を計算し、閾値を基準として同一人物を見極めます。

【理論参考サイト】
https://sefiks.com/2018/09/03/face-recognition-with-facenet-in-keras/




・ DeepFace
FacebookのDeepFaceモデルは8層のCNNですが、前処理を3Dモデルから得た入力情報の点数が他と比べ物にならない程多くなっています。顔パーツの位置を3Dで取得することによって評価時の顔の向き等を補正することが可能になり、その分入力パラメータの点数も膨大になったということになります。

    Model            Num of Params
    VGG-Face     145,002,878
    Facenet         22,808,144
    OpenFace      3,743,280
    DeepFace      137,774,071

【理論参考サイト】
https://sefiks.com/2020/02/17/face-recognition-with-facebook-deepface-in-keras/



本章冒頭で書いたように、一部のモデルは3Dモデリングされたデータがベクトル化されます。このため前回実施した画像比較結果で、例えばモデルVGG-Faceは正面を向いた画像の精度は極めて良いのに対し、斜めを向いた場合の精度が極めて良くないといった違いが出てくるわけです。

というウンチクはDeepFace公式サイトや論文に載っている内容で、実際の認識結果である顔ベクトルを観たわけではありません。

そこで今回は、実際に代表的なモデルが作成する顔ベクトルを可視化させて確認していくことにしましょう。

★ 顔ベクトルの生成・埋め込み(embeddings)

ここでTVドラマに出てくるような空想をしてみました。
昔業務でイギリス情報部が使用していたRSA暗号を作成するというのがありました。RSA暗号は閉じる用と閉じないように数百桁の素数を2つ用意し、出来上がった暗号サイズは閉じた際使用した素数の桁数固定長になります。
これと同じように、DeepFaceメソッドが顔ベクトルを生成すると数百桁固定長データになります。例えば、これをICカードなどに保存すれば、照合時にモデルパラメータとして使用すれば良いことになります。つまり、顔=ベクトル=数値になることによってデバイスへ埋め込めることで、使い方次第で役に立つということです。

つべこべ言わず、まずは サンプルプログラムでやってみることにしましょう。

【DeepFace.representメソッド】
顔イメージを多次元ベクトル埋め込みとして表現。

【引数】
img_path(strまたはnp.ndarray) :
画像への正確なパス、BGR形式のnumpy配列、または base64 でエンコードされた画像。ソース画像に複数の顔が含まれている場合、結果は検出された各顔の情報を含めます。

model_name (str) :
顔認識のモデル。オプション:VGG-Face、Facenet、Facenet512、
OpenFace、DeepFace、DeepID、Dlib、ArcFace、SFace (デフォルトはVGG-Face)。

enforce_detection (ブール値) :
画像内で顔が検出されない場合、例外を発生させます。
既定値は True です。False に設定すると、低解像度の画像の例外が回避されます
(既定値は True です)。

detector_backend (文字列) :
顔検出バックエンド。オプション: 'opencv', 'retinaface',
'mtcnn', 'ssd', 'dlib', 'mediapipe', 'yolov8' (デフォルトは opencv)。

align (boolean) :
目の位置に基づいて位置合わせを実行します (既定値は True)。

expand_percentage (int) :
検出された顔の領域をパーセンテージで拡大します (既定値は 0)。

normalization (文字列): 入力画像をモデルに供給する前に正規化します。
既定値は base です。オプション:base、raw、Facenet、Facenet2018、VGGFace、VGGFace2、ArcFace
(デフォルトはbaseです)。

【DF_represent_test01.py】
#coding: utf-8
# ////////////////////////////////////////////////////////////////////////////
# ///【埋め込み(embeddings)】
# ////////////////////////////////////////////////////////////////////////////
if "__file__" in globals():
    import os, sys
    sys.path.append(os.path.join(os.path.dirname(__file__), ".."))
    sys.path.append(os.path.join(os.path.dirname(__file__), "..") + "//..//"+ "//..//")
os.environ['TF_ENABLE_ONEDNN_OPTS'] = '0'
from DeZero.common.nlp_util import *
tensorflow_warning_cancel()
import cv2
from deepface import DeepFace

if "__file__" in globals():
    import os, sys
    sys.path.append(os.path.join(os.path.dirname(__file__), ".."))
    sys.path.append(os.path.join(os.path.dirname(__file__), "..") + "//..//"+ "//..//")
os.environ['TF_ENABLE_ONEDNN_OPTS'] = '0'
from DeZero.common.nlp_util import *
tensorflow_warning_cancel()

import cv2
from deepface import DeepFace


if __name__ == "__main__":
    img1_path = "c:\\Photo\\aragaki.jpg"

    # /// 顔認識モデル(models)
    # ////////////////////////////////////////////////////////////////////////////
    models = [
      "VGG-Face",
      "Facenet",
      "Facenet512",
      "OpenFace",
      "DeepFace",
      "DeepID",
      "ArcFace",
      "Dlib",
      "SFace",
    ]

    # /// バックエンド(backends)
    # ////////////////////////////////////////////////////////////////////////////
    backends = [
      'opencv',
      'ssd',
      'dlib',
      'mtcnn',
      'retinaface',
      'mediapipe',
      'yolov8',
      'yunet',
      'fastmtcnn',
    ]

    # /// 類似度( metrics)
    # ////////////////////////////////////////////////////////////////////////////
    metrics = ["cosine", "euclidean", "euclidean_l2"]

    # /// 正規化(normalizations)
    # ////////////////////////////////////////////////////////////////////////////
    normalizations = ["base", "raw", "Facenet", "Facenet2018", "VGGFace", "VGGFace2", "ArcFace"]


    # /// 埋め込み(embeddings)
    # ////////////////////////////////////////////////////////////////////////////
    embedding_objs = DeepFace.represent(
        img_path = img1_path,                       # img1_path: Union[str, np.ndarray, List[float]]
        model_name = models[0],                     # model_name: str = "VGG-Face"
        enforce_detection=True,                     # enforce_detection: bool = True
        detector_backend = backends[0],             # detector_backend: str = "opencv"
        align=True,                                 # align: bool = True
        expand_percentage= 0,                       # expand_percentage: int = 0
        normalization=normalizations[0]             # normalization: str = "base"
    )
    print("\n\nembedding_objs: " , embedding_objs)

★ 動作結果

結果は辞書型リスト(List[Dict[str, Any]])で返されます。
「embedding objs」にの特徴を表す固定長多次元ベクトル、「facial area」には顔の領域情報が表示されます。 尚、前述解説のように顔ベクトルを形成するベクトル長はモデルの種類等で変わってきます。


【戻り値】
- embedding (List[float]) : 顔の特徴を表す多次元ベクトル。
次元の数は、参照モデルによって異なります
(たとえば、FaceNetは128次元を返し、VGG-Faceは4096次元を返します)。

- facial_area (dict) : 辞書形式の顔検出で顔の領域を検出しました。
左隅の点として 'x' と 'y'、および 'w' と 'h' を含む
幅と高さとして。'detector_backend' が 'skip' に設定されている場合、画像領域全体と無意味です。

- face_confidence (float) : 顔検出の信頼度スコア。
'detector_backend' が設定されている場合、'skip' の場合、信頼度は 0 になり、無意味です。

 
# [result]
# (py39) d:\VisualStudio2017\Python3.5_GPU\Sample_TEST\顔認識2024\04_DF_represent>python DF_represent_test01.py
# WARNING:tensorflow:From C:\Users\yamin\anaconda3\envs\py39\lib\site-packages\keras\src\losses.py:2976: The name tf.losses.sparse_softmax_cross_entropy is deprecated. Please use tf.compat.v1.losses.sparse_softmax_cross_entropy instead.
#
# embedding_objs:  [{'embedding': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.01606626244334833, 0.0, 0.06296022219481621, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.031107889127982957, 0.0, 0.01088567572078871, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.07255838848950266, 0.10872463446493327, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0065941766930050095, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.034742453280804365, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.05494773726438544, 0.0, 0.0, 0.011967647578160382, 0.0, 0.0, 0.037453648360252126, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.014710890253689188, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0433870113403056, 0.0, 0.011787573862525835, 0.0, 0.014476261400039284, 0.0, 0.0, 0.0, 0.003125476877908212, 0.0, 0.0, 0.0, 0.0, 0.0, 0.024742315991272017, 0.0, 0.0, 0.040178508104250214, 0.0, 0.0, 0.0, 0.0, 0.006422090932946346, 0.0, 0.01528187238864804, 0.014457867201005333, 0.0, 0.0, 0.01926903756244575, 0.0, 0.0065623424752665055, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 4.676453980085298e-05, 0.01290408836372654, 0.0, 0.0, 0.0, 0.0, 0.04192123029486771, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.010661503110142483, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.07065609591804668, 0.0, 0.0, 0.0, 0.02972325382398014, 0.0, 0.0, 0.0, 0.07174731980401362, 0.0, 0.0, 0.031070720451680817, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.012784321846509695, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.028585700781579616, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.07603590618221062, 0.0, 0.0, 0.0, 0.0, 0.0, 0.014999576362555177, 0.0, 0.0, 0.0, 0.0, 0.0703673774151089, 0.010019941334908798, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.03049877635363313, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.08323906325640243, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0038048302111073425, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.046461059460237174, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.015155862266200146, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.002945673230241869, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.03835890210529694, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.007610317458497176, 0.04499193760008959, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.03675962649838616, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.009433657930554477, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.041876151831293396, 0.03761324127609707, 0.0, 0.0, 0.0, 0.0, 0.01576563700636513, 0.006196363406853453, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.06904135002919189, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.08097679649153962, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.010734745402275946, 0.0, 0.03871451577495116, 0.0, 0.0, 0.06583593690589917, 0.0, 0.0, 0.0, 0.0027463810272897087, 0.0, 0.02273975531695035, 0.05151652337622879, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.004115457317760517, 0.0, 0.0, 0.0, 0.0, 0.0, 0.022720400563265467, 0.023866250713361934, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0004392231210938956, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.10250310227272479, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.02090612831865687, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.03728833155276292, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.007178660817936217, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.044861448645105106, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00818751080461527, 0.00248066830119497, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0977573876544623, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.002969619491495715, 0.0, 0.0, 0.023999666402312166, 0.05994313975437371, 0.0, 0.0, 0.04110071099103887, 0.0, 0.0, 0.0, 0.013493942158168997, 0.0, 0.02197923687629496, 0.008214915485143838, 0.029308581536110635, 0.0, 0.0, 0.0, 0.0, 0.01822916673091809, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.008055072571570827, 0.0, 0.0, 0.0, 0.013699895216081443, 0.0, 0.0, 0.0, 0.016110629645780833, 0.0, 0.05792502851714746, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0023483415107997266, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.04710504797398047, 0.0, 0.0020388073519605147, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.018917694276518248, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.008634341955160288, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.010702873860932969, 0.0, 0.0010245446503867504, 0.0, 0.0, 0.0, 0.04065169535330383, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.026604425829310024, 0.0, 0.11280777482286349, 0.01777527789803317, 0.0, 0.0, 0.0, 0.0, 0.1106421043632491, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.008235625156092935, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00010767331725855501, 0.0, 0.0, 0.0, 0.0, 0.0, 0.04406939668820384, 0.0, 0.0, 0.0969432654755961, 0.0, 0.0, 0.0, 0.0, 0.08640059508833972, 0.0, 0.0, 0.0, 0.05080367915020589, 0.0, 0.0, 0.04058285090852745, 0.0, 0.0, 0.0, 0.024589714561185454, 0.0, 0.0, 0.0, 0.0, 0.03325190344637635, 0.0, 0.019902575466936984, 0.06445258609726534, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0010492898480419753, 0.0, 0.0, 0.0, 0.0, 0.0, 0.006965867681340129, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.02356925763773467, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.09468478459182084, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.029596046529313344, 0.0, 0.0, 0.0, 0.0, 0.004075614369987035, 0.05607591856096882, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.04903650084381308, 0.0, 0.0, 0.037623258086474515, 0.0, 0.0, 0.0, 0.0017000278603061737, 0.0, 0.0, 0.0011014796026239415, 0.0, 0.0, 0.0, 0.0, 0.037410620582266886, 0.07117203489125624, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.029145850620614262, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.06448544213670362, 0.012415937870374556, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0322878192500568, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.029282066284118818, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.029511044484895506, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.008439807103340358, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.05528984683141045, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.04928379437110106, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.006597746378874194, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.017217429446534628, 0.0, 0.0, 0.0, 0.0, 0.006900614049001504, 0.0, 0.0, 0.03455408879544445, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.030159959714429058, 0.0, 0.0037752825923069405, 0.0, 0.022916879059393734, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.014489735925472499, 0.0, 0.0, 0.0, 0.0, 0.0, 0.02042172849544481, 0.0, 0.0, 0.0, 0.0, 0.0, 0.02225155130295799, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.042371440287945844, 0.0, 0.0, 0.0, 0.0, 0.0, 0.042201574226024816, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.02895113971405626, 0.0, 0.0814229107471912, 0.0, 0.0, 0.0, 0.005401802317825161, 0.0, 0.0, 0.0, 0.03949791147249081, 0.0, 0.05336713754408953, 0.0, 0.0, 0.0, 0.0, 0.01562802417245922, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.02658374432711902, 0.004842024658506802, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.021022163883864457, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.07972294309760546, 0.0, 0.009198116409142398, 0.011238050687481323, 0.0, 0.0018196519492399163, 0.0, 0.0, 0.04058873536209283, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.027346996545747217, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.012492679426481973, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.011188310294442809, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.08655800774230837, 0.0, 0.0, 0.0, 0.0, 0.0015895612585733398, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.010603839549671696, 0.05559181591815463, 0.008338259434638343, 0.01116685767249904, 0.0, 0.01637625962614868, 0.0, 0.007236720149458194, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0001719931552664369, 0.0, 0.032041982047562166, 0.0, 0.0, 0.0, 0.009777735085332197, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.015362329403947765, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.053516944633373385, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.09133165450109469, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.046943649440741836, 0.0, 0.0, 0.0, 0.004811215431453364, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.07975601885335686, 0.019225394297096205, 0.0, 0.0, 0.011716864645963778, 0.0, 0.0, 0.015651322552276956, 0.0, 0.0, 0.07914920746654312, 0.0, 0.028435530315316378, 0.0, 0.11401231598888213, 0.00761412939568595, 0.016142919493181473, 0.03902961150296612, 0.0, 0.0, 0.0, 0.03596882523434417, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.06445531283304863, 0.0, 0.0, 0.0, 0.0, 0.1426954468709497, 0.0, 0.0, 0.0, 0.0, 0.009413648957462913, 0.0, 0.0, 0.08903333172587437, 0.0, 0.045354810358704076, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.013844293903811668, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.053295814248601074, 0.0, 0.0, 0.017636110148680596, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.004497699970767351, 0.0, 0.0, 0.0, 0.0, 0.017801984697580014, 0.0, 0.0, 0.030936800541960744, 0.0, 0.0, 0.0, 0.0, 0.028009328554759898, 0.09152942171790565, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.013171088754175551, 0.0, 0.0, 0.0, 0.0, 0.0, 0.008765156259300739, 0.0, 0.0, 0.0, 0.0, 0.03628530404838144, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.017910559767206985, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.002398119227442713, 0.0, 0.0, 0.0033311200794816464, 0.0, 0.0, 0.0, 0.0384566138933658, 0.01823977931052918, 0.0, 0.0, 0.009979237479466135, 0.0, 0.0, 0.0, 0.0, 0.013627025455773744, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.038564469251223525, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11829332497115244, 0.0, 0.0, 0.0, 0.0018492919967778069, 0.0, 0.0, 0.09020574924016513, 0.0, 0.0, 0.0, 0.0, 0.02247097184411413, 0.0, 0.0, 0.0, 0.011715204097674266, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00035715766970712703, 0.0, 0.07657709563017367, 0.0, 0.0, 0.03265699054298061, 0.0, 0.0, 0.013897401871880058, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.027677354106896323, 0.0, 0.0, 0.0, 0.0, 0.07494345413839089, 0.0, 0.0, 0.0711780968079976, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.04260953108196523, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.13272609521713588, 0.0, 0.0, 0.0, 0.018813589588800448, 0.023397831026615357, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.13181438519273642, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.07813190403556072, 0.026497804263056722, 0.0, 0.0, 0.0, 0.0, 0.10074683654321674, 0.03397593911998914, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.037509242221222115, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0020231701701248, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.04956605096093259, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.028938883487410513, 0.0, 0.021586491149724118, 0.0, 0.0, 0.010640198374178697, 0.0, 0.0, 0.0, 0.0, 0.0672928645106688, 0.0, 0.0, 0.0037114025390347673, 0.0, 0.0, 0.0, 0.0, 0.0, 0.041158076666892834, 0.0, 0.0, 0.0, 0.0, 0.07158717478051008, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0012918355311535826, 0.0, 0.0, 0.05307637398931427, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.05679455991740703, 0.0, 0.014098878914131713, 0.019286203603626897, 0.0, 0.06271904128803416, 0.03354081349686917, 0.016560174856167995, 0.0, 0.09680060761711595, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.020811888330022826, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.004229452760663302, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.017922473743441913, 0.0, 0.0, 0.030797742650764726, 0.0, 0.0, 0.0, 0.0, 0.04044455920755153, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0013448970207711212, 0.01057324475728923, 0.0, 0.0, 0.0, 0.0, 0.012832459437212786, 0.0, 0.0, 0.03293560209551506, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.03435934126950092, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0015516087865772947, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.031174294158308587, 0.0, 0.0, 0.0, 0.0, 0.0, 0.011572377930864516, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.005916075813212536, 0.0, 0.0, 0.0, 0.01101774494310215, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.04533040494669333, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.09369210065541067, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.008346062180629773, 0.0, 0.06215739568794484, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.05793989598766832, 0.007229971619238349, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.09536991639363303, 0.0, 0.0, 0.0, 0.04716651220413679, 0.007743493008784673, 0.002295394280707198, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.006940360870887997, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0031791732209112446, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0054418350526062855, 0.020513589632458005, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.019960755219899803, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.039045538118791225, 0.0, 0.0, 0.016656069759339937, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.053631585845055424, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.011328994227199678, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.025259933822463842, 0.0, 0.0, 0.0, 0.04008763850752185, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.017248941836211933, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.02339041560104769, 0.0, 0.0, 0.014014241655131163, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.09142323113365115, 0.0, 0.0, 0.0, 0.017936463757148212, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.03702173679243043, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.035239471299203656, 0.0, 0.04513892781356427, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.024167783184355692, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.08351978746579376, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.021734172906209943, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.03866495002821281, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.05395745893991632, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.1518907661224136, 0.0, 0.0, 0.0, 0.0, 0.0040478438477127504, 0.0, 0.0, 0.0, 0.10638018253146181, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.06550043572952251, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.012426108200483602, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.057628479099460145, 0.0, 0.05933331431044416, 0.0, 0.0, 0.0, 0.0, 0.0, 0.05327757779461244, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.05106766548353907, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.013424196313133682, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.016088765055749972, 0.0, 0.0, 0.0, 0.0, 0.005116489769850142, 0.0, 0.0, 0.0, 0.0, 0.03149573349064583, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.07616059800677982, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.04482886020886869, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.016219484994550816, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.028650579065216668, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.03822203574348046, 0.004101839483770508, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.015224068688605744, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.02027528757275293, 0.0, 0.08331016683557776, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.039843077349768774, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.006900133067457086, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.005803115220060149, 0.0, 0.0, 0.0, 0.0, 0.0, 0.022305922639826798, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.062228876728478606, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0304918327547635, 0.013539883994178832, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.043934116227467936, 0.0, 0.0, 0.0, 0.0, 0.0, 0.04004833182248054, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.049187603695969154, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.029760002785786714, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.003294021120855783, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.005560883970710742, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.025165044543955777, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.01998709160027774, 0.0, 0.0, 0.0, 0.0, 0.006805283929429303, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.021060484662372553, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0026830949827037964, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.022415713191365427, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.14810705966299928, 0.0, 0.0, 0.0, 0.07125731298950339, 0.0, 0.04347293168623723, 0.0, 0.0, 0.0, 0.0, 0.013086105019450471, 0.0, 0.0, 0.0, 0.0, 0.0, 0.013486539408542471, 0.0005297990585191516, 0.0, 0.0, 0.0, 0.0, 0.047240731247957087, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0689724717819058, 0.042535066969949534, 0.0, 0.0, 0.0, 0.0, 0.0, 0.05558427795848926, 0.0, 0.0, 0.0, 0.0, 0.031798696934550646, 0.027835859708678926, 0.0, 0.0, 0.0, 0.0, 0.0, 0.08319484957370153, 0.0, 0.00838176889838695, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.04177725977226048, 0.0, 0.0, 0.0, 0.0, 0.0, 0.04376854026740429, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.040016030707576665, 0.04729541807491652, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0456748947737771, 0.0, 0.0, 0.0, 0.024693615025407088, 0.0, 0.0, 0.008277800829145896, 0.0, 0.0, 0.013516810964425831, 0.0, 0.0, 0.0, 0.0, 0.0, 0.02598963423332889, 0.0, 0.0, 0.0, 0.008687214009879658, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.018244956728266454, 0.02048103077341759, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.05696475555379773, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.04829851881806904, 0.016893101408055073, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.02941100032365664, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.034541700175635674, 0.0, 0.0, 0.0, 0.0, 0.0, 0.04355663515090704, 0.012342511777094544, 0.0, 0.049889326896297416, 0.0, 0.0, 0.0, 0.0044226453711601575, 0.0, 0.0, 0.0, 0.02425681054430485, 0.0, 0.0, 0.0, 0.007802434022434925, 0.004004474523535651, 0.0, 0.0, 0.0, 0.0, 0.0, 0.04485642897241315, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.16441174529171249, 0.0, 0.0, 0.0, 0.0, 0.008199682524986741, 0.0, 0.0, 0.0, 0.08774555751344604, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.004339469014376143, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.027479637593849922, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.03875584497682345, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.09132707426102896, 0.0, 0.02802159604890888, 0.0, 0.0, 0.0, 0.0, 0.0, 0.009430369228047259, 0.022392179602417628, 0.0, 0.05079541443658175, 0.0, 0.0, 0.0015493401452224757, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.01492477422544238, 0.0, 0.057721143046078956, 0.0, 0.0, 0.0, 0.0, 0.03154546824993272, 0.03394962668305558, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.02488301048731317, 0.0, 0.0, 0.0, 0.0, 0.024016793007231984, 0.0, 0.10167260841165564, 0.0, 0.0, 0.0, 0.0, 0.08025332137621287, 0.0, 0.0, 0.0, 0.0, 0.0, 0.012983391868382406, 0.04467678271768264, 0.0, 0.0, 0.0, 0.009493886960668475, 0.0, 0.0, 0.05792097784973386, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.020023722253300326, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.04581547659478588, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.032805076521145046, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.022554362635569116, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.029152416758125462, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.07466845382064381, 0.0, 0.0, 0.0, 0.03962362300610293, 0.0787850586631871, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.05517397182812399, 0.050963193193528177, 0.0, 0.0, 0.0, 0.0, 0.0, 0.04256286108355872, 0.0, 0.0, 0.005868045968009147, 0.015878404995634064, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0749758594776997, 0.0, 0.10490342975474716, 0.0, 0.0, 0.0, 0.0, 0.08036758512653648, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.07439465349199144, 0.0, 0.0, 0.03972302210278149, 0.03784356312663474, 0.059633272147860586, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.06320047916633287, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.011880314569010446, 0.0, 0.057780297438071754, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.018838887950442702, 0.04890668793902279, 0.0, 0.09411942634941502, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.024775434000160555, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.04892869900659573, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.023845619914935494, 0.0, 0.0, 0.0, 0.0, 0.023055376392303723, 0.0, 0.020762846522184988, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.04721467514672217, 0.07611080127622512, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0018368711589519622, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.052285344558331746, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.005632465714554691, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.06566043427548397, 0.0, 0.0, 0.0, 0.014713643749792662, 0.0, 0.0, 0.0, 0.0, 0.0, 0.049539938522181484, 0.0, 0.0, 0.0, 0.0, 0.02770470315412766, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.049827964073670225, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0155591980373756, 0.0, 0.0, 0.019100268673652394, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.03898549641091854, 0.0, 0.0, 0.0, 0.007820975403229905, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.027601720991419817, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.012503100458538037, 0.0, 0.0, 0.0, 0.0, 0.019397020906397975, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.09373954811154052, 0.0, 0.0, 0.0, 0.0, 0.011945913972854648, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0014896908633609536, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.055274810348341044, 0.0, 0.0, 0.08999363285798219, 0.0, 0.0, 0.07921434490275463, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.014162037495087262, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.007732479728589729, 0.0, 0.0, 0.0, 0.0009939966885646131, 0.0, 0.010195961566253934, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.052181796203586255, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00668202941574174, 0.008664891677529806, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.004109553850283426, 0.0, 0.0, 0.0, 0.0, 0.0, 0.013228998087060689, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0007993415033312097, 0.0, 0.0, 0.03504951246213574, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.06720867372648401, 0.004665064999079304, 0.0, 0.0, 0.0, 0.03681507388181408, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.06114638515752014, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.05050285371504023, 0.0, 0.0, 0.0, 0.0, 0.0, 0.02397867222690634, 0.0, 0.0, 0.08040083552858805, 0.0, 0.0, 0.0, 0.009975879763501592, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.008808135446178268, 0.0, 0.0, 0.0, 0.06402172240724467, 0.032793769581646995, 0.0, 0.0, 0.0, 0.0, 0.010865537875628875, 0.0, 0.02549008102670134, 0.016749997074759167, 0.0, 0.0, 0.0, 0.0, 0.0, 0.021707939341799043, 0.0, 0.0, 0.020145383119498844, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.03720869565676157, 0.0, 0.0, 0.0, 0.0, 0.06746868826492626, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00381474279707985, 0.0, 0.009781817442598652, 0.0, 0.06212091151246433, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0049483867200761835, 0.0, 0.02804074235378388, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.006920356827329099, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
# 'facial_area': {'x': 102, 'y': 75, 'w': 276, 'h': 276, 'left_eye': (86, 100), 'right_eye': (187, 101)},
# 'face_confidence': 0.95}]

★ 顔ベクトルの可視化 VGG-Face

それでは次にDeepFace.representメソッドを、指定したパラメータで顔ベクトルを抽出し可視化してみることにしましょう。

    ・ モデル    : VGG-Face
    ・ バックエンド : opencv
    ・ 正規化         : base

【DF_represent_test03.py】
#coding: utf-8
# ////////////////////////////////////////////////////////////////////////////
# ///【埋め込み(embeddings)】
# ////////////////////////////////////////////////////////////////////////////
if "__file__" in globals():
    import os, sys
    sys.path.append(os.path.join(os.path.dirname(__file__), ".."))
    sys.path.append(os.path.join(os.path.dirname(__file__), "..") + "//..//"+ "//..//")
os.environ['TF_ENABLE_ONEDNN_OPTS'] = '0'
from DeZero.common.nlp_util import *
tensorflow_warning_cancel()

import cv2
import matplotlib.pyplot as plt
import math
import numpy as np
from deepface import DeepFace


if __name__ == "__main__":
    img1_path = "c:\\Photo\\aragaki.jpg"

    # /// 顔認識モデル(models)
    # ////////////////////////////////////////////////////////////////////////////
    models = [
      "VGG-Face",
      "Facenet",
      "Facenet512",
      "OpenFace",
      "DeepFace",
      "DeepID",
      "ArcFace",
      "Dlib",
      "SFace",
    ]

    # /// バックエンド(backends)
    # ////////////////////////////////////////////////////////////////////////////
    backends = [
      'opencv',
      'ssd',
      'dlib',
      'mtcnn',
      'retinaface',
      'mediapipe',
      'yolov8',
      'yunet',
      'fastmtcnn',
    ]

    # /// 類似度( metrics)
    # ////////////////////////////////////////////////////////////////////////////
    metrics = ["cosine", "euclidean", "euclidean_l2"]

    # /// 正規化(normalizations)
    # ////////////////////////////////////////////////////////////////////////////
    normalizations = ["base", "raw", "Facenet", "Facenet2018", "VGGFace", "VGGFace2", "ArcFace"]

    # /// 埋め込み(embeddings)
    # ////////////////////////////////////////////////////////////////////////////
    model   = models[0]
    backend = backends[0]
    normalization = normalizations[0]
    embedding_objs = DeepFace.represent(
        img_path    = img1_path,                    # img1_path: Union[str, np.ndarray, List[float]]
        model_name  = model,                        # model_name: str = "VGG-Face"
        enforce_detection=True,                     # enforce_detection: bool = True
        detector_backend = backend,                 # detector_backend: str = "opencv"
        align=True,                                 # align: bool = True
        expand_percentage= 0,                       # expand_percentage: int = 0
        normalization=normalization                 # normalization: str = "base"
    )

    data_org = embedding_objs[0]['embedding']
    min_dt = min(data_org)
    max_dt = max(data_org)
    len_dt = len(data_org)
    print("models : ", model , ", backends : ",backend , ", min:" , min_dt , max_dt, ", len : ", len_dt)

    sep_cnt = int(math.sqrt(len_dt))
    dat = []
    for x in range(sep_cnt):
        dat.append(data_org[x*sep_cnt : x*sep_cnt+(sep_cnt-1)])

    fig, ax = plt.subplots()
    aximg = ax.imshow(dat)

    fig.colorbar(aximg, ax=ax)
    plt.title("【DeepFace.represent】model={},backends={}".format(model, backend), fontname="MS Gothic", fontsize=9)
    plt.show()

出力されたベクトル長は「4096項」あり、0~0.16までの値が入っております。
前述のようにベクトル長も異なりますが、内部データもプラスデータのみとは限りません。

# [result]
# (py39) d:\VisualStudio2017\Python3.5_GPU\Sample_TEST\顔認識2024\04_DF_represent>python DF_represent_test03.py
#
# models :  VGG-Face , backends :  opencv , min: 0.0 0.16441174529171249 , len :  4096

【注意事項】
今回は「ベクトルの可視化」を目的としています。
実際のデータ長は今回「4096」ですが、「512」というのもありますが、最初matplotlibを使用して横長からバーコードを作成してみましたが、アスペクトが正方形で小さく見づらいので、平方根を縦横にした二次ヒートマップ風にしてみました。そうすると「512」だと端数が出てしまいますが、内容は吟味しないため端数は切り捨てて可視化します。

実際を観てみると、明らかに分かるのは、これが画像データではないことです。



★ モデルFace512の場合

それではモデル「Facenet512」を実行してみると、ベクトル長は「512」でー2.9~3.9までの値となり、先ほどとは大きく異なります。。

(py39) d:\VisualStudio2017\Python3.5_GPU\Sample_TEST\顔認識2024\04_DF_represent>python DF_represent_test03.py
models : Facenet512 , backends : dlib , min: -2.9807353019714355 3.9893298149108887 , len : 512



★ モデルDeepFace+YOLO8の場合

確実に3Dモデリングを実施しているDeepFace*YOLO8の顔ベクトルはどうでしょう?
ベクトル長は「4096」です。

(py39) d:\VisualStudio2017\Python3.5_GPU\Sample_TEST\顔認識2024\04_DF_represent>python DF_represent_test03.py
models : DeepFace , backends : yolov8 , min: 0.0 8.972443580627441 , len : 4096



★ 画像と顔ベクトル比較

次に実画像と顔ベクトルのカラーマップ可視化画像を並べて比較してみましょう。

人の眼には実画像から同じと認識できますが、顔ベクトルの比較は人間には到底できません。

では、どうやっているか?

顔ベクトルを正規化し同じ土俵に載せてから、次に「類似度」を用意された「metric」ラップを使用して計算し、最も値が大きい画像を「一致画像」というように決定していることになります。 さらに、下記3枚の画像は背景が全く異なりますが、類似度を計算すると一致とみなされます。それは画像の中から「顔」のみが抽出されベクトル化されたためと考えられます。







★ 顔ベクトルまとめ

これらからわかったように、DeepFaceをモジュールを通すと、画像から「顔のみが抽出」され、各モデルに対する前処理を行ったことによって、モデル別で大きさが異なる「顔ベクトル」に変換されました。ここでは正確な記載はしませんでしたが、その際にかかった時間コストはモデル毎に異なり、使用するメソッドや条件によって精度が異なることもわかってきました。
このため、多分どのモデルが、どのような条件下の場合に優れているかなどは、以降実験によって明らかにされていきます。
今回はベクトル算出と可視化までとしておきましょう。

★ 【おまけ】顔暗号化2次元QRコードの生成

冒頭で書きましたように、顔ベクトルはベクトル長はモデル毎に異なりますが固定長であるため、QRコードなどにすることができます。
但し、顔ベクトルをそのままQRコードに簡単に出来ると考えていましたが、少々勉強不足で固定長バイナリデータを直接載せることができませんでした。このため一旦テキストに変換しOpencvを使用して、二次元QRコード化してみました。

現在マイナンバーカードや免許には写真が載っており、どのように照合しているかは不明ですが、このようにすれば簡単に固定長データないしはQRコードとして管理ができます。

【DF_represent_test04_qr02.py】
#coding: utf-8
# ////////////////////////////////////////////////////////////////////////////
# ///【埋め込み(embeddings)】
# ////////////////////////////////////////////////////////////////////////////
if "__file__" in globals():
    import os, sys
    sys.path.append(os.path.join(os.path.dirname(__file__), ".."))
    sys.path.append(os.path.join(os.path.dirname(__file__), "..") + "//..//"+ "//..//")
os.environ['TF_ENABLE_ONEDNN_OPTS'] = '0'
from DeZero.common.nlp_util import *
tensorflow_warning_cancel()

import cv2
import matplotlib.pyplot as plt
import math
import numpy as np
from deepface import DeepFace
from PIL import Image


if __name__ == "__main__":
    img1_path = "c:\\Photo\\aragaki.jpg"
    # img1_path = "c:\\Photo\\aragaki-2.jpg"
    # img1_path = "c:\\Photo\\aragaki-3.jpg"

    # /// 顔認識モデル(models)
    # ////////////////////////////////////////////////////////////////////////////
    models = [
      "VGG-Face",
      "Facenet",
      "Facenet512",
      "OpenFace",
      "DeepFace",
      "DeepID",
      "ArcFace",
      "Dlib",
      "SFace",
    ]

    # /// バックエンド(backends)
    # ////////////////////////////////////////////////////////////////////////////
    backends = [
      'opencv',
      'ssd',
      'dlib',
      'mtcnn',
      'retinaface',
      'mediapipe',
      'yolov8',
      'yunet',
      'fastmtcnn',
    ]

    # /// 類似度( metrics)
    # ////////////////////////////////////////////////////////////////////////////
    metrics = ["cosine", "euclidean", "euclidean_l2"]

    # /// 正規化(normalizations)
    # ////////////////////////////////////////////////////////////////////////////
    normalizations = ["base", "raw", "Facenet", "Facenet2018", "VGGFace", "VGGFace2", "ArcFace"]

    # /// 埋め込み(embeddings)
    # ////////////////////////////////////////////////////////////////////////////
    model   = models[4]
    backend = backends[6]
    normalization = normalizations[0]
    embedding_objs = DeepFace.represent(
        img_path    = img1_path,                    # img1_path: Union[str, np.ndarray, List[float]]
        model_name  = model,                        # model_name: str = "VGG-Face"
        enforce_detection=True,                     # enforce_detection: bool = True
        detector_backend = backend,                 # detector_backend: str = "opencv"
        align=True,                                 # align: bool = True
        expand_percentage= 0,                       # expand_percentage: int = 0
        normalization=normalization                 # normalization: str = "base"
    )

    data_org = embedding_objs[0]['embedding']
    min_dt = min(data_org)
    max_dt = max(data_org)
    len_dt = len(data_org)
    print("models : ", model , ", backends : ",backend , ", min:" , min_dt , max_dt, ", len : ", len_dt)

    sep_cnt = int(math.sqrt(len_dt))
    dat = []
    for x in range(sep_cnt):
        dat.append(data_org[x*sep_cnt : x*sep_cnt+(sep_cnt-1)])

    # map関数を使っても文字列に変換できる
    # QRコードにする文字列
    encoded_info = ', '.join(map(str, dat))

    # QRコード エンコーダーの設定
    qr_params = cv2.QRCodeEncoder_Params()

    # エラー訂正レベルを指定します。
    qr_params.correction_level = cv2.QRCODE_ENCODER_CORRECT_LEVEL_Q

    # 【QRコードの形式】
    qr_params.mode = cv2.QRCODE_ENCODER_MODE_AUTO

    qr_params.version = 10 # 設定可能な値 1-40
    qr_params.structure_number = 1

    # QRCodeEncoderクラスのインスタンスを作成
    QRencoder = cv2.QRCodeEncoder.create(qr_params)

    # QRコードを作成
    qrcode = QRencoder.encode(encoded_info)

    #グラフを表示する領域を,figオブジェクトとして作成。
    fig = plt.figure(figsize=(7, 2))
    plt.clf()
    fig.tight_layout()

    #グラフを描画するsubplot領域を作成。
    ax1 = fig.add_subplot(1, 3, 1)
    ax2 = fig.add_subplot(1, 3, 2)
    ax3 = fig.add_subplot(1, 3, 3)

    # 画像ファイルの読み込み
    img = cv2.imread(img1_path)
    height,width,color = img.shape

    # リサイズ(倍率でリサイズ)
    f_size = 300
    img_resize = cv2.resize(img, dsize=(f_size, f_size))
    ax1.imshow(cv2.cvtColor(img_resize,cv2.COLOR_BGR2RGB))
    ax1.axis("off")

    aximg = ax2.imshow(dat)
    fig.colorbar(aximg, ax=ax2,shrink=0.7)
    ax3.imshow(qrcode, cmap='gray')
    ax3.axis("off")
    plt.suptitle("【DeepFace.represent】model={},backends={}".format(model, backend), fontname="MS Gothic", fontsize=9)
    plt.show()








≪清須電脳倶楽部メインページへ戻る場合はここをクリックしてください≫
Copyright(c)2018 GGE Kiyosu Cyber Club Allrights Reserved
inserted by FC2 system