InsightFace 人脸门禁 4 个里程碑落地:本地人脸库 + 摄像头实时识别
InsightFace 人脸门禁 4 个里程碑落地本地人脸库 摄像头实时识别【免费下载链接】insightfaceState-of-the-art 2D and 3D Face Analysis Project项目地址: https://gitcode.com/GitHub_Trending/in/insightface实验室管理员要在 30 分钟内搭一套能开门的人脸识别学生刷脸进门、陌生人亮红灯。用 InsightFace 就能做到——它的buffalo_l模型包把检测、对齐、512 维 ArcFace 特征、比对手一次打包CPU 上跑通全流程下面分 4 个里程碑把它搭完。项目一览InsightFace 是什么InsightFace 是学术界公认的 2D/3D 人脸分析项目强项是把检测→对齐→识别→属性整条流水线做成了开箱即用的 ONNX 模型训练侧提供 ArcFace、SCRFD、RetinaFace 等 SOTA 实现推理侧一个pip install就能调。数据流是这样的一张 BGR 人脸图进来先过 RetinaFace 检测器拿到边界框和 5 个关键点再用关键点做仿射对齐裁出 112×112 的正脸ArcFace 模型把它压成一个 512 维向量向量与库中已注册的人做余弦相似度 1:N 比对最后输出姓名和分数。多张脸的图也支持examples/face_recognition/insightface_app.py 就是这个流程的参考实现准备清单硬件与软件合并一张表项目最低要求推荐配置CPU4 核任意 x86i7 及以上内存8GB16GB摄像头720P USB1080P光照充足GPU无纯 CPU 可跑GTX 1050Ti 以上装onnxruntime-gpuPython3.83.10最关键的 3 条命令模型在首次初始化时自动下载到~/.insightface/models/buffalo_l约 326MB无需手动下载git clone https://gitcode.com/GitHub_Trending/in/insightface cd insightface pip install insightface onnxruntime opencv-python python -c import insightface; print(insightface.__version__)里程碑一最小代码提取 512 维人脸向量目标给定一张照片拿到能代表这个人身份的 512 维embedding。import cv2 from insightface.app import FaceAnalysis # 首次运行自动下载 buffalo_l 模型包约326MB # namebuffalo_l 对应模型包GPU 机器改用 CUDAExecutionProvider app FaceAnalysis(namebuffalo_l, providers[CPUExecutionProvider]) app.prepare(ctx_id-1, det_thresh0.5) # ctx_id-1 表示 CPU def extract_feature(path): 读图 → 检测对齐 → 返回 512 维特征向量 img cv2.imread(path) faces app.get(img) assert len(faces) 1, 未检测到人脸检查光线和人脸大小 return faces[0].embedding验证vec extract_feature(photo_a.jpg)打印len(vec)应输出512。检测不到人时把det_thresh从 0.5 降到 0.3 再试参数含义可查 python-package/insightface/app/face_analysis.py。里程碑二两张照片判定是否同一人目标输入两张照片输出一个 0~1 的相似度和是/否结论。import numpy as np def cosine_sim(a, b): 归一化后直接点乘省一次开方 return float(a b / (np.linalg.norm(a) * np.linalg.norm(b))) # 同一人的两张自拍照 same cosine_sim(extract_feature(me_1.jpg), extract_feature(me_2.jpg)) # 两个不同的人 diff cosine_sim(extract_feature(me_1.jpg), extract_feature(him.jpg)) print(f本人 {same:.3f} vs 他人 {diff:.3f})验证本人分数应显著高于他人典型差距在 0.2 以上本人常 0.9他人常 0.5。若两条分数贴得太近多半是照片侧脸、逆光或遮挡换一张正脸照再测。里程碑三本地人脸库注册成员 1:N 检索目标把 N 个已注册的人存成一张姓名→向量表新照片进来直接给出最像的人。import json, os import numpy as np class FaceLibrary: 内存字典 JSON 落盘百人到千人都够用 def __init__(self, pathlab_faces.json): self.path, self.people path, {} if os.path.exists(path): self.people json.load(open(path)) def add(self, name, img): self.people[name] extract_feature(img).tolist() json.dump(self.people, open(self.path, w)) def search(self, img, topk1): 1:N 检索返回 [(姓名, 相似度)] 降序列表 q extract_feature(img) scored [(n, cosine_sim(q, np.array(v))) for n, v in self.people.items()] return sorted(scored, keylambda x: -x[1])[:topk]验证注册 3 个同学每人 1 张正脸照再用其中一人的另一张自拍调search()第一名必须是本人且分数 0.6再用陌生人的照片确认最高分 0.5。库规模到几千条时再考虑换成向量数据库现阶段 JSON 足矣。里程碑四摄像头实时采集并给出结论目标打开摄像头逐帧跑检测→比对识别通过画绿框、陌生人画红框这就是门禁判定循环。def live_access(lib, threshold0.65): cap cv2.VideoCapture(0) while True: ok, frame cap.read() if not ok: break for face in app.get(frame): # 检测 特征一次完成 name, score lib.search(frame[face.bbox.astype(int)]) # 取人脸区域比对 ok_hit score threshold color (0, 255, 0) if ok_hit else (0, 0, 255) box face.bbox.astype(int) cv2.rectangle(frame, (box[0], box[1]), (box[2], box[3]), color, 2) cv2.putText(frame, f{name} {score:.2f}, (box[0], box[1] - 6), cv2.FONT_HERSHEY_SIMPLEX, 0.7, color, 2) cv2.imshow(access, frame) # 绿框即开门信号接继电器同理 if cv2.waitKey(1) 0xFF ord(q): break cap.release()验证正对镜头站着应稳定亮绿框并显示姓名换一个人脸过去 1 秒内切红框。CPU 上buffalo_l逐帧约 10~15 FPS够门禁用觉得卡就按下面清单降分辨率。选型与调优决策表 一份清单模型包决策表摘自 model_zoo/README.md精度取 LFW 与 MR-ALL模型包适用场景精度速度buffalo_sc16MB只检测、不识别—最快buffalo_s159MB嵌入式、低配 CPU 实时LFW 99.70 / MR-ALL 71.87快buffalo_m313MB平衡档与 buffalo_l 相同较快buffalo_l326MB默认普通 PC 门禁LFW 99.83 / MR-ALL 91.25中等调优清单按收益排序比对阈值threshold默认 0.65 偏宽松误放陌生人就升到 0.70~0.72漏放真人则降到 0.60。务必用本人 5 张 陌生人 5 张自测集校准别只凭感觉。GPU 加速装onnxruntime-gpu构造FaceAnalysis时providers[CUDAExecutionProvider]、ctx_id0。降负载摄像头从 1080P 降到 720Pcap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)检测输入分辨率可在app.prepare()的det_size里调小。戴口罩场景参考 recognition/tools/mask_renderer.py 的思路补全嘴部区域比单纯调阈值有效。避坑 FAQ3 个最影响成功率的问题现象明明有人脸却报未检测到人脸。原因检测模型在小分辨率下会漏人FaceAnalysis默认检测尺寸为 (128,128) 和 (640,640) 两档人脸像素太小或侧脸严重就过不了 det_thresh0.5。 解决app.prepare(ctx_id-1, det_thresh0.3)放宽阈值把人脸凑到画面宽度的 1/5 以上正对镜头再采。现象两个长得像的同学被判成同一人。原因0.65 的阈值对相似脸型偏宽松cosine 相似度会虚高。 解决阈值升到 0.70 以上复测注册阶段每人存 2~3 张不同光照下的照片取平均向量比单张更稳。现象CPU 上逐帧处理卡顿画面明显掉帧。原因buffalo_l的 RetinaFace-10GF 检测器 ResNet50 识别器对 CPU 压力不小。 解决按顺序试——换buffalo_s包159MB检测降到 500MF、帧宽降到 1280、最后才上 GPU。收尾这套 30 分钟的架子只是起点接 detection/scrfd 的 SCRFD 换更快的检测器、用 attribute/gender_age 加年龄性别统计、把 JSON 库换成 server 目录里的服务端检索都能平滑扩展。下期预告把这套门禁接到定时任务自动输出每日考勤报表。【免费下载链接】insightfaceState-of-the-art 2D and 3D Face Analysis Project项目地址: https://gitcode.com/GitHub_Trending/in/insightface创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考