【GPTs】顔認証をGPTsに追加する方法の解説。
背景
GPTsのセキュリティの強化で、以前メールアドレス認証を追加するGPTsを提案してAI Tech主催のハッカソンで3位でした。さらに強固なセキュリティってなんだろうって考えたら「顔」だったので、顔認証を追加する方法を考えました。
GPTsの動作
1.顔の登録
まず登録する顔のベクトルを登録します。ベクトルとは顔を数学的に表現したものになります。画像を貼り付けてもファイルから顔の特徴点を検出して数値化できないため以下の処理を行います。
ここでの主な手順は以下の通りです:
画像の読み込み:指定したパスから画像ファイルを読み込みます。
グレースケール変換:顔検出を効率的に行うために、カラー画像をグレースケール(白黒)に変換します。
Haar Cascadeを使用した顔検出:OpenCVのHaar Cascade分類器を使用して、画像中の顔を検出します。この分類器は、顔の特徴を早く検出するために訓練されたモデルです。
Dlibの顔の特徴点検出:Dlibの顔特徴点検出器を用いて、検出された顔領域(Haar Cascadeで見つかった顔)に対して68点の顔のランドマーク(目、鼻、口などの位置)を検出します。
特徴点の抽出:各顔について、68個の特徴点の座標を取得し、リストに保存します。
2.Knowledgeへの登録
こちらの顔のベクトルをテキストにしたものを基準としてKnowledgeに登録します。
3.同一人物かどうか検証する
アップロードされた画像から顔の特徴点(ランドマーク)を検出し、それをベクトルとして抽出します。その後、基準となる顔の特徴点ベクトルと比較して、同一人物かどうかを評価します。ユークリッド距離が0.6以下であれば同一人物と見なします。
提供された基準の顔とアップロードされた画像の顔が同一人物である可能性は低いと判断。 見事に別人だと判別しました!
GPTsの設定
Knowledge
facial_landmarks.txt (基準の顔のベクトル)
shape_predictor_68_face_landmarks.dat(目や鼻の位置など顔の特徴を抽出する上で重要なキーポイント(特徴点)を抽出するのに必要な学習済みのデータ →ここからダウンロードできます。
Capabilities
Web Browsing ✅
DALL·E Image Generation
Code Interpreter✅
Instructions
# 画像をアップロードするので以下のコードで顔のみの情報をベクトル化して、画像と同一人物かを推測したい。似度計算(例えばユークリッド距離)で計算する。同一人物のペアの距離が0.6前後を閾値とする。
#基準となる顔のベクトルは{facial_landmarks.txt}にあるのでそれをと比べて同一人物かどうかを測る。
顔のみの検出は以下で行う。
import cv2
import numpy as np
# Load the image from file system
img_path = 'XXXXXX'
image = cv2.imread(img_path)
# Convert the image to grayscale (required for face detection)
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# Load the default pre-trained Haar Cascade for face detection
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
ベクトル化
import dlib
# Dlib's face detector and facial landmark predictor
# These models are used to detect and predict facial landmarks which can be used to create a vector representation of the face.
face_detector = dlib.get_frontal_face_detector()
landmark_predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')
# Detect faces in the image
dlib_faces = face_detector(gray_image)
# List to hold dictionaries of facial landmarks for each face detected
facial_landmarks_list = []
# For each face detected, find the facial landmarks
for k, d in enumerate(dlib_faces):
# Get the landmarks/parts for the face in box d.
landmarks = landmark_predictor(image, d)
# Store landmarks in a dictionary
facial_landmarks = {
'face_{}'.format(k+1): [(landmarks.part(n).x, landmarks.part(n).y) for n in range(68)]
}
facial_landmarks_list.append(facial_landmarks)
facial_landmarks_list
総評
正直、もっとChatGPTの処理速度が倍増したら使えるようになると思います。今は時間掛かり過ぎですね。ただ重要なのは「こんな事もできるのか!」って思って頂ければ幸いです。応用したら何かに使えるかもなので、試してみてください。そして、他の使い方あったら教えてください!