Python+InsightFace 实战人脸识别:从零搭建落地识别系统
介绍基于 Python 和 InsightFace 框架的人脸识别实战。内容涵盖环境搭建、核心原理(检测、对齐、特征提取、相似度匹配)、以及 1:1 比对和 1:N 识别的实现。通过代码示例演示了人脸考勤系统的搭建,包含常见问题解决与性能优化技巧,适合希望快速落地人脸识别应用的开发者参考。

介绍基于 Python 和 InsightFace 框架的人脸识别实战。内容涵盖环境搭建、核心原理(检测、对齐、特征提取、相似度匹配)、以及 1:1 比对和 1:N 识别的实现。通过代码示例演示了人脸考勤系统的搭建,包含常见问题解决与性能优化技巧,适合希望快速落地人脸识别应用的开发者参考。

InsightFace 是目前工业界和学术界最主流的开源人脸识别框架,由商汤科技 & 香港中文大学团队维护,集成了人脸检测、对齐、特征提取、识别全流程,兼具高精度与易用性。本文将从实战角度,手把手教你用 Python+InsightFace 实现人脸检测、1:1 比对、1:N 识别,并搭建一个简易的人脸考勤系统,零基础也能上手。
InsightFace 基于 Python,推荐使用 Python 3.8+,安装命令如下:
# 安装 InsightFace 核心库
pip install insightface
# 安装 OpenCV(图像读取/处理)
pip install opencv-python
# 安装 numpy(数值计算)、matplotlib(可视化)
pip install numpy matplotlib
# 可选:安装 onnxruntime(若需手动加载 ONNX 模型)
pip install onnxruntime
InsightFace 首次运行时会自动下载预训练模型(如 buffalo_l),默认保存到 ~/.insightface/models/ 目录,无需手动下载,网络不佳时可手动从 InsightFace 官方仓库 下载模型文件。
人脸识别的核心是「特征向量化 + 相似度匹配」:
首先加载 InsightFace 的核心模型,并定义可视化、相似度计算的工具函数:
import cv2
import numpy as np
import insightface
from insightface.app import FaceAnalysis
import matplotlib.pyplot as plt
# 1. 初始化 FaceAnalysis(InsightFace 高层 API,集成检测 + 对齐 + 特征提取)
# model_name='buffalo_l':平衡精度与速度,适合服务端;buffalo_s 更轻量,适合移动端
app = FaceAnalysis(model_name='buffalo_l', providers=['CPUExecutionProvider'])
# 初始化模型(自动下载预训练权重)
app.prepare(ctx_id=0, det_size=(640, 640))
# ctx_id=0:CPU;GPU 用 ctx_id=0(需装 CUDA)
# 工具函数 1:可视化人脸框和关键点
def visualize_face(img, faces):
img_copy = img.copy()
for face in faces:
# 绘制人脸框(红色)
bbox = face.bbox.astype(int)
cv2.rectangle(img_copy, (bbox[0], bbox[1]), (bbox[2], bbox[3]), (0, 0, 255), 2)
# 绘制 68 个关键点(蓝色)
kps = face.kps.astype(int)
for (x, y) in kps:
cv2.circle(img_copy, (x, y), 2, (255, 0, 0), -1)
# 转换颜色空间(OpenCV BGR → matplotlib RGB)
img_rgb = cv2.cvtColor(img_copy, cv2.COLOR_BGR2RGB)
plt.imshow(img_rgb), plt.axis('off'), plt.title('人脸检测 + 关键点对齐结果'), plt.show()
# 工具函数 2:计算两个特征向量的余弦相似度
def cosine_similarity(feat1, feat2):
# 归一化特征向量(关键:提升相似度计算准确性)
feat1 = feat1 / np.linalg.norm(feat1)
feat2 = feat2 / np.linalg.norm(feat2)
# 余弦相似度 = 点积 / (模长 1 * 模长 2)(归一化后模长为 1,直接点积)
return np.dot(feat1, feat2)
这是所有后续操作的基础,InsightFace 能自动检测图像中的所有人脸,并输出 68 个关键点(用于对齐):
# 读取图像(替换为你的人脸图像路径)
img_path = "test_face.jpg"
img = cv2.imread(img_path)
if img is None:
raise ValueError("图像读取失败,请检查路径!")
# 检测人脸(返回 Face 对象列表,包含 bbox、kps、embedding 等信息)
faces = app.get(img)
# 可视化结果
print(f"检测到 {len(faces)} 个人脸")
visualize_face(img, faces)
每个检测到的人脸会被转化为 128 维的特征向量(embedding),这是人脸识别的核心数据:
# 提取第一个人脸的特征向量(若有多个人脸,遍历 faces 即可)
if len(faces) > 0:
face_embedding = faces[0].embedding
# shape: (128,)
print(f"人脸特征向量维度:{face_embedding.shape}")
print(f"特征向量前 10 位:{face_embedding[:10]}")
else:
print("未检测到人脸!")
场景:验证两张照片是否为同一个人(如实名认证、门禁验证),通过余弦相似度判断:
# 定义 1:1 比对函数
def face_verify(img_path1, img_path2, threshold=0.6):
# 读取两张图像
img1 = cv2.imread(img_path1)
img2 = cv2.imread(img_path2)
if img1 is None or img2 is None:
return False, 0.0, "图像读取失败"
# 检测并提取特征
faces1 = app.get(img1)
faces2 = app.get(img2)
if len(faces1) == 0 or len(faces2) == 0:
return False, 0.0, "未检测到人脸"
# 取第一张人脸的特征
feat1 = faces1[0].embedding
feat2 = faces2[0].embedding
# 计算相似度
sim = cosine_similarity(feat1, feat2)
# 判断是否为同一人
is_same = sim >= threshold
return is_same, sim, "比对成功"
# 测试:替换为你的两张人脸图像路径
img1_path = "person_A_1.jpg" # 同一个人的照片 1
img2_path = "person_A_2.jpg" # 同一个人的照片 2
# img2_path = "person_B.jpg" # 不同人的照片(测试用)
# 执行比对
is_same, similarity, msg = face_verify(img1_path, img2_path)
print(f"比对结果:{msg}")
print(f"余弦相似度:{similarity:.4f}")
print()
场景:从已有的人脸库中匹配输入人脸(如人脸考勤、嫌疑人识别),核心是构建人脸库→计算相似度→匹配最高者。
# 构建人脸库(实际场景可存储到数据库/文件)
face_database = {
"张三": app.get(cv2.imread("zhangsan.jpg"))[0].embedding,
"李四": app.get(cv2.imread("lisi.jpg"))[0].embedding,
"王五": app.get(cv2.imread("wangwu.jpg"))[0].embedding
}
def face_recognize(img_path, face_db, threshold=0.6):
# 读取输入图像
img = cv2.imread(img_path)
if img is None:
return "未知", 0.0, "图像读取失败"
# 检测并提取特征
faces = app.get(img)
if len(faces) == 0:
return "未知", 0.0, "未检测到人脸"
input_feat = faces[0].embedding
max_sim = 0.0
matched_name = "未知"
# 遍历人脸库,计算相似度
for name, feat in face_db.items():
sim = cosine_similarity(input_feat, feat)
if sim > max_sim:
max_sim = sim
matched_name = name
# 判断是否匹配成功(相似度≥阈值)
if max_sim < threshold:
matched_name = "未知"
return matched_name, max_sim, "识别成功"
# 测试:识别输入图像中的人
test_img_path = "test_zhangsan.jpg" # 张三的测试照片
name, sim, msg = face_recognize(test_img_path, face_database)
print(f"识别结果:{msg}")
print(f"匹配到:{name}(相似度:{sim:.4f})")
结合以上知识点,搭建一个可运行的人脸考勤系统,核心功能:
import time
from datetime import datetime
# 1. 初始化员工人脸库(实际场景可从文件夹/数据库加载)
employee_db = {
"张三": app.get(cv2.imread("zhangsan.jpg"))[0].embedding,
"李四": app.get(cv2.imread("lisi.jpg"))[0].embedding,
"王五": app.get(cv2.imread("wangwu.jpg"))[0].embedding
}
# 2. 考勤记录存储
attendance_records = {}
# 3. 考勤函数(支持摄像头实时识别/照片识别)
def face_attendance(input_source, is_camera=False, threshold=0.6):
"""
input_source: 摄像头索引(0 为默认摄像头)或图像路径
is_camera: True=摄像头实时识别,False=照片识别
"""
if is_camera:
# 打开摄像头
cap = cv2.VideoCapture(input_source)
if not cap.isOpened():
print("摄像头打开失败!")
return
print("请面对摄像头,按 q 退出...")
while True:
ret, frame = cap.read()
if not ret:
break
# 识别人脸
name, sim, msg = face_recognize(frame, employee_db, threshold)
# 绘制识别结果
cv2.putText(frame, f"识别结果:{name} (sim:{sim:.2f})", (20, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, , ), )
cv2.imshow(, frame)
name != name attendance_records:
attendance_records[name] = datetime.now().strftime()
()
cv2.waitKey() & == ():
cap.release()
cv2.destroyAllWindows()
:
name, sim, msg = face_recognize(input_source, employee_db, threshold)
name != :
attendance_records[name] = datetime.now().strftime()
()
:
()
face_attendance(, is_camera=)
()
name, time_str attendance_records.items():
()
pip uninstall insightface -y && pip install insightface;~/.insightface/models/ 目录。app.prepare 的 det_size(如 (1024, 1024)),增大检测尺寸;buffalo_l 替换 buffalo_s)。buffalo_s 模型,检测速度提升 50%+;onnxruntime-gpu,app.prepare(ctx_id=0) 自动调用 GPU;本文通过 InsightFace 实现了人脸识别的核心流程:检测→对齐→特征提取→比对→识别,并落地了简易考勤系统。InsightFace 的优势在于无需从零构建模型,几行代码就能实现工业级效果,适合快速落地。
face.gender/face.age;掌握 InsightFace 后,可快速落地人脸门禁、考勤、身份核验等场景,建议多尝试不同场景的图像(如不同光照、姿态),熟悉参数调优规律,进一步提升识别稳定性。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online