RetinaFace+CurricularFace 人脸识别实战指南
本文介绍如何使用预置环境快速部署 RetinaFace 和 CurricularFace 进行人脸检测与识别。跳过底层依赖冲突,直奔核心能力:检测人脸、提取特征、比对身份。整个过程不需要安装额外软件,只要运行环境就绪,即可完成首次人脸比对。
基于 RetinaFace 和 CurricularFace 的人脸识别技术方案。RetinaFace 负责高精度人脸检测与关键点定位,CurricularFace 负责特征提取与身份比对。通过预置环境可快速启动推理脚本,支持本地图片及网络 URL 输入。用户可调整相似度阈值以适应不同业务场景(如考勤、门禁)。实测表明该方案在复杂光照、遮挡条件下具有较好鲁棒性,无需复杂环境配置即可实现工业级人脸比对流程。
本文介绍如何使用预置环境快速部署 RetinaFace 和 CurricularFace 进行人脸检测与识别。跳过底层依赖冲突,直奔核心能力:检测人脸、提取特征、比对身份。整个过程不需要安装额外软件,只要运行环境就绪,即可完成首次人脸比对。
RetinaFace 是一个专门用于人脸定位的模型。它能精准定位一张图里所有人脸的位置,并标出五个关键点:左眼中心、右眼中心、鼻尖、左嘴角、右嘴角。这些点就像人脸的'坐标锚点',为后续对齐和识别打下基础。
它的强项在于鲁棒性,不怕复杂场景。比如光线很暗、逆光导致脸部发黑、人脸侧着甚至只露出半张脸、戴着口罩墨镜或有头发遮挡,RetinaFace 依然能稳定输出可用的检测框和关键点。
注意:RetinaFace 只输出'这张图里有几张脸,每张脸在哪',它完全不知道这些人是谁。
找到脸之后,下一步才是真正的'识别':这是谁?
CurricularFace 把每张检测出来的人脸,转换成一串 512 维的数字向量(你可以把它想象成这张脸的'数字指纹')。然后通过计算两串数字之间的余弦相似度,来判断它们是否属于同一个人。
为什么叫 CurricularFace?因为它的训练方式借鉴了'课程学习'理念:先让模型学会区分差异大的人脸,再逐步挑战更难的样本。这种由易到难的训练方式,让它在真实场景中表现更稳、泛化能力更强。
国际权威评测 LFW 上,CurricularFace 的准确率超过 99.8%,属于当前开源模型中的第一梯队。
单独用 RetinaFace,你只能看到'框';单独用 CurricularFace,它根本不知道该处理哪块区域。只有把它们串起来,才能形成闭环:
这个流程全自动,无需人工裁剪、无需手动对齐、无需调整姿态。
镜像预装了所有必要组件,目录结构清晰,脚本封装完整。你不需要从 GitHub clone 仓库、不需要 pip install 一堆包、不需要手动下载模型权重。
镜像启动后,所有内容都已就位:
/root/Retinaface_CurricularFace镜像启动成功后,首先进入预设的工作目录,并激活专用 Conda 环境:
cd /root/Retinaface_CurricularFace conda activate torch25
这条命令的作用是切换到代码所在路径,避免路径错误,并激活名为 torch25 的 Conda 环境,确保使用的是镜像预装的 PyTorch 2.5 版本。
镜像内置了一个开箱即用的推理脚本 inference_face.py,它会自动加载两张示例图片,完成端到端的人脸检测 + 特征提取 + 相似度计算。
直接运行:
python inference_face.py
你会看到类似这样的输出:
[INFO] Loading model... [INFO] Detecting face in input1... [INFO] Detected 1 face, using largest one. [INFO] Detecting face in input2... [INFO] Detected 1 face, using largest one. [INFO] Extracting features... [INFO] Cosine similarity: 0.872 [INFO] Result: Same person
这个结果说明 RetinaFace 成功在两张图中各找到了一张人脸,CurricularFace 提取了特征,并计算出 0.872 的相似度。默认阈值为 0.4,因此判定为'同一人'。
假设你有两张自己的照片,分别存放在 /home/user/photo1.jpg 和 /home/user/photo2.jpg,你想确认 AI 是否能识别出是同一个人。
只需一条命令:
python inference_face.py --input1 /home/user/photo1.jpg --input2 /home/user/photo2.jpg
注意:
/ 开头),相对路径可能报错.jpg, .jpeg, .png, .bmp--input1 "/home/user/我的照片.jpg"你甚至不需要把图片保存到本地。只要图片有公开 URL,脚本可以直接拉取:
python inference_face.py -i1 https://example.com/face_a.jpg -i2 https://example.com/face_b.jpg
这个功能特别适合测试社交媒体头像匹配、验证证件照与现场抓拍照一致性、快速比对不同来源的人脸图像。
默认阈值是 0.4,意味着相似度大于 0.4 就判为'同一人'。但在实际业务中,这个值往往需要调整:
修改方式很简单:
python inference_face.py -i1 a.jpg -i2 b.jpg --threshold 0.65
你也可以用缩写 -t:
python inference_face.py -i1 a.jpg -i2 b.jpg -t 0.65
| 参数 | 缩写 | 说明 | 建议用法 |
|---|---|---|---|
--input1 | -i1 | 第一张图片路径或 URL | 必填,支持本地路径和网络地址 |
--input2 | -i2 | 第二张图片路径或 URL | 必填,同上 |
--threshold | -t | 判定阈值(余弦相似度) | 默认 0.4,按需调整 |
重要提醒:脚本默认会自动选取每张图中面积最大的人脸进行比对。这意味着如果你上传的是多人合影,它不会比对所有人,只选最显眼的一张。
输出的相似度是一个介于 -1 到 1 之间的浮点数:
实测参考(使用普通手机拍摄):
Q:运行报错 ModuleNotFoundError: No module named 'torch'?
A:忘记激活环境。请务必先执行 conda activate torch25,再运行脚本。
Q:提示 No faces detected?
A:检查图片是否满足基本条件:
--threshold 0.3(仅限 RetinaFace 内部调参,如需可修改代码配置)Q:输出相似度很低(如 0.12),但明明是同一人?
A:优先排查以下三点:
推荐做法:用手机原相机拍两张标准正面照(无滤镜、无美颜),效果最佳。
Q:想批量比对多组图片,怎么办?
A:当前脚本为单次双图比对设计。如需批量处理,可在 Python 中循环调用,或使用如下 Shell 脚本模板:
for i in {1..10}; do python inference_face.py -i1 ./batch/img${i}_a.jpg -i2 ./batch/img${i}_b.jpg -t 0.5 >> results.log done
inference_face.py,支持本地路径、网络 URL、阈值调节等多种实用功能;现在,你已经掌握了用 RetinaFace+CurricularFace 完成一次专业级人脸比对的全部技能。只需要一个能联网的终端,就能跑通工业级人脸识别流程。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 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