59 lines
1.8 KiB
Python
59 lines
1.8 KiB
Python
import insightface
|
|
from insightface.app import FaceAnalysis
|
|
import cv2
|
|
import numpy as np
|
|
from numpy.linalg import norm
|
|
|
|
# 初始化模型
|
|
app = FaceAnalysis(name='buffalo_l')
|
|
app.prepare(ctx_id=0, det_size=(640, 640))
|
|
|
|
# 创建一个数据库来存储已知人脸的特征和姓名
|
|
face_database = {}
|
|
|
|
# --- 注册阶段:将已知人脸加入数据库 ---
|
|
def register_face(image_path, person_name):
|
|
img = cv2.imread(image_path)
|
|
faces = app.get(img)
|
|
if len(faces) != 1:
|
|
print(f"警告:在 {image_path} 中未检测到或检测到多张人脸,跳过。")
|
|
return
|
|
embedding = faces[0].embedding
|
|
face_database[person_name] = embedding
|
|
print(f"成功注册:{person_name}")
|
|
|
|
# 注册多个人
|
|
img1 = cv2.imread('./resources/face/01.png')
|
|
|
|
register_face('./resources/face/01.png', '01')
|
|
register_face('./resources/face/02.png', '02')
|
|
|
|
# --- 识别阶段:识别未知图片中的人 ---
|
|
def recognize_face(image_path):
|
|
img = cv2.imread(image_path)
|
|
faces = app.get(img)
|
|
if len(faces) == 0:
|
|
print("未检测到人脸。")
|
|
return
|
|
|
|
for i, face in enumerate(faces):
|
|
unknown_embedding = face.embedding
|
|
max_sim = -1
|
|
identity = "未知"
|
|
|
|
# 与数据库中的每个人脸进行比对
|
|
for name, known_embedding in face_database.items():
|
|
cos_sim = unknown_embedding @ known_embedding.T / (norm(unknown_embedding) * norm(known_embedding))
|
|
if cos_sim > max_sim:
|
|
max_sim = cos_sim
|
|
identity = name
|
|
|
|
# 根据阈值决定最终身份
|
|
threshold = 0.6
|
|
if max_sim < threshold:
|
|
identity = "未知"
|
|
|
|
print(f"人脸 {i+1}: 识别为 【{identity}】, 相似度:{max_sim:.4f}")
|
|
|
|
# 识别一张新图片
|
|
recognize_face('./resources/face/16.jpg') |