下面是一个完整的示例代码,演示如何使用 insightface 库实现人脸注册和对比。此示例包括人脸检测、特征提取、注册新的人脸以及对比已注册的人脸特征。
安装依赖
首先,确保你已经安装了 insightface 库:
pip install insightface
人脸注册与对比
以下代码演示了如何使用 insightface 进行人脸注册和对比:
import cv2
import numpy as np
from insightface.app import FaceAnalysis
from sklearn.metrics.pairwise import cosine_similarity
# 初始化 ArcFace 模型
app = FaceAnalysis(providers=['CUDAExecutionProvider']) # 使用 GPU,若无 GPU 可移除 providers 参数
app.prepare(ctx_id=0, det_size=(640, 640))
# 注册的人脸数据库 (用字典存储人脸名称和特征向量)
registered_faces = {}
# 注册新的人脸
def register_face(img_path, name):
img = cv2.imread(img_path)
faces = app.get(img)
if faces:
embedding = faces[0].embedding
registered_faces[name] = embedding
print(f"Registered {name}")
else:
print(f"No face detected in {img_path}")
# 对比人脸
def recognize_face(img_path):
img = cv2.imread(img_path)
faces = app.get(img)
if not faces:
print(f"No face detected in {img_path}")
return
embedding = faces[0].embedding
max_sim = 0
recognized_name = None
for name, reg_embedding in registered_faces.items():
sim = cosine_similarity([embedding], [reg_embedding])[0][0]
if sim > max_sim:
max_sim = sim
recognized_name = name
return recognized_name, max_sim
# 示例:注册人脸
register_face('path/to/your/image1.jpg', 'Person1')
register_face('path/to/your/image2.jpg', 'Person2')
# 示例:识别人脸
test_img_path = 'path/to/your/test_image.jpg'
recognized_name, similarity = recognize_face(test_img_path)
if recognized_name:
print(f"Recognized: {recognized_name}, Similarity: {similarity:.2f}")
else:
print("No matching face found")
代码解释
1. 初始化 ArcFace 模型:
app = FaceAnalysis(providers=['CUDAExecutionProvider'])
app.prepare(ctx_id=0, det_size=(640, 640))
这部分代码初始化了 insightface 库的 ArcFace 模型,并准备在 GPU 上运行。如果没有 GPU,可以移除 providers 参数。
2. 注册新的人脸:
def register_face(img_path, name):
img = cv2.imread(img_path)
faces = app.get(img)
if faces:
embedding = faces[0].embedding
registered_faces[name] = embedding
print(f"Registered {name}")
else:
print(f"No face detected in {img_path}")
这个函数从给定的图像路径中读取图像,检测人脸并提取特征向量,然后将特征向量存储在 registered_faces 字典中。
3.识别人脸:
def recognize_face(img_path):
img = cv2.imread(img_path)
faces = app.get(img)
if not faces:
print(f"No face detected in {img_path}")
return
embedding = faces[0].embedding
max_sim = 0
recognized_name = None
for name, reg_embedding in registered_faces.items():
sim = cosine_similarity([embedding], [reg_embedding])[0][0]
if sim > max_sim:
max_sim = sim
recognized_name = name
return recognized_name, max_sim
这个函数从给定的图像路径中读取图像,检测人脸并提取特征向量,随后与已注册的人脸特征进行比较,基于余弦相似度原理, 返回最匹配的人脸名称和相似度。
使用示例
注册人脸:
register_face('path/to/your/image1.jpg', 'Person1')
register_face('path/to/your/image2.jpg', 'Person2')
识别人脸:
test_img_path = 'path/to/your/test_image.jpg'
recognized_name, similarity = recognize_face(test_img_path)
if recognized_name:
print(f"Recognized: {recognized_name}, Similarity: {similarity:.2f}")
else:
print("No matching face found")
这个示例只是展示大概的逻辑,实际应用时还要把人脸注册数据保存到数据库中等等操作,希望对你有帮助!
4492

被折叠的 条评论
为什么被折叠?



