はじめに
顔認証をPythonライブラリdeepfaceを使い手軽にできることを最近知った。今回はこのライブラリを使った顔認証の手順を紹介する。さらに、GPT4oを用いた顔認証の結果と比較してみる。
deepfaceの使い方
きわめて簡単である。deepfaceのインストールのあと以下を実行すれば良い。
1 2 3 4 5 6 |
from deepface import DeepFace result = DeepFace.verify( img1_path = "img1.jpg", img2_path = "img2.jpg", ) |
このコードは2枚の画像に写る人物が同一人物か否かを判定する。resultの中身は次のような辞書形式になっている。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
{ "verified": false, "distance": 0.9741761842014752, "threshold": 0.68, "model": "VGG-Face", "detector_backend": "opencv", "similarity_metric": "cosine", "facial_areas": { "img1": { "x": 195, "y": 156, "w": 181, "h": 181, "left_eye": [ 315, 221 ], "right_eye": [ 246, 225 ] }, "img2": { "x": 212, "y": 131, "w": 164, "h": 164, "left_eye": null, "right_eye": null } }, "time": 0.88 } |
2行目は同一人物か否かの判定結果、10行目から13行目までが1枚目の画像内の顔の位置、15,16行目が左目の中心位置、19,20行目が右目の中心位置、23行目以降は2枚目の画像の情報である。目が検出できないときはnullが入る。DeepFaceは上に挙げた関数verify
以外の関数もサポートする。詳細はdeepfaceを見てほしい。
精度の比較
たくさんの画像を用いて、同一人物判定を行ってみる。使う画像は、著作権フリー画像素材集からダウンロードした。
この中から任意の2枚を取り出し、同一人物判定を行う。deepfaceの精度だけを示しても面白くないので、比較対象として、GPT4oにも同じことをさせてみた。このとき与えた入力プロンプトは以下の通りである。
# 課題
人物の写った画像を2枚与えます。同一人物であればTrueを、異なる人物であればFalseをラベルとして返しなさい。
同一人物だけど過去の写真かもしれないので服装だけでなく顔かたちから判断してください。
True/Falseと判断した理由も記述しなさい。
# 出力形式
以下の2つの項目だけを答えてください。
ラベル:xxx
理由:yyy
Azure OpenAIを用いてPythonプログラムで一括処理を行った。GPT4oは全問正解であったが、deepfaceは以下の組み合わせのときに失敗した。
下段右端のペアのときは同一人物であると答えた。
もう一度別の画像群で同じことを繰り返す。
deepfaceは横顔を認識できずzelenskyy_5と他の画像との同一人物判定はできなかった。それ以外の任意の2つの画像については全て正解した。一方、GPT4oではzelenskyy_5も含めてすべての同一人物判定に正解した。GPT4oの場合、理由も出力させている。例えば、zelenskyy_2とzelenskyy_5を比較した場合は以下の理由のもと同一人物であると判定している。「画像の人物は、どちらも同じ髪型、体格、姿勢をしています。背景に見える旗の色も一致しており、同じ場所で撮影された可能性が高いです。これらの要素から、同一人物であると判断できます。」。この理由から背景も見ていることが分かる。また、zelenskyy_2とzelenskyy_3の場合は以下の理由のもと同一人物であると判定している。「2枚の画像の人物は、顔の輪郭や髪型、耳の形状などの特徴が一致しているため、同一人物と判断できます。」。
まとめ
今回は、deepfaceを用いた顔認証(ここでは同一人物判定)を行う手順を示し、その精度をGPT4oと比較した。deepfaceは横顔を認識できないこと、GPT4oの精度は、今回の実験では、deepfaceを上回ることが分かった。恐るべしGPT4o。