基于 Retinaface 与 CurricularFace 的人脸身份核验方案
在实际业务中,人脸核验常面临检测不准、特征不稳或部署过重的问题。比如访客登记效率低、闸机识别失败率高,或是考勤系统受眼镜遮挡影响大。解决这些问题的关键在于选对模型组合并优化本地部署流程。
本方案将 RetinaFace 人脸检测与 CurricularFace 高精度识别打包,无需复杂的环境配置,即可实现'上传照片→自动找脸→比对身份'的完整闭环。所有计算在本地完成,不依赖云 API,特别适合对隐私和响应速度有要求的中小场景。
1. 环境准备与基础验证
镜像启动后,系统已预装全部依赖。我们先切换到模型所在路径,并启用专用 Python 环境:
cd /root/Retinaface_CurricularFace
conda activate torch25
这一步省去了传统开发中最耗时的环节:环境冲突排查。镜像中 Python 3.11.14、PyTorch 2.5.0+cu121、CUDA 12.1 与 cuDNN 8.9 已完全对齐,无需手动降级或升级任何组件。
直接执行预置脚本,使用镜像自带的两张示例图进行比对:
python inference_face.py
几秒钟后,你会看到类似这样的输出:
[INFO] 检测到图像 1 中最大人脸(置信度 0.992)
[INFO] 检测到图像 2 中最大人脸(置信度 0.987)
[INFO] 特征提取完成,512 维向量生成
[RESULT] 余弦相似度:0.683 → 判定为同一人
这个结果说明:RetinaFace 成功定位了两张图中各自最清晰的人脸区域,并交由 CurricularFace 编码为高区分度特征向量,最终通过余弦相似度完成判定。
关键提示:该脚本默认使用 0.4 作为判定阈值。这意味着只要相似度超过 0.4,就认为是同一人。这个值在多数日常场景下足够稳健,后续我们会讲如何根据实际需求调整它。
你可以立刻用自己手机拍一张正面照,传到服务器上测试。假设照片保存在 /home/user/selfie.jpg,执行:
python inference_face.py --input1 /home/user/selfie.jpg --input2 /home/user/id_photo.jpg
注意两点:
- 路径必须是绝对路径,相对路径可能报错;
- 图片无需裁剪、无需对齐,系统会自动用 RetinaFace 检测并截取最大人脸区域。
如果你看到输出中包含 已自动对齐人脸至 112x112 标准尺寸,那就说明整个 Pipeline 已经完整跑通——检测、对齐、编码、比对,四步全链路无断点。
2. 技术逻辑解析:为什么是这两者?
RetinaFace:精准定位每一张脸
很多人以为人脸检测就是画个框,但实际难点在于小脸、侧脸、遮挡脸、暗光脸的定位。RetinaFace 的突破在于引入了'人脸关键点回归'和'密集锚点设计'。
它不仅能输出边界框(bbox),还能同时预测双眼、鼻尖、左右嘴角共 5 个关键点。有了这些点,系统就能做真正的仿射对齐——把歪着的脸'掰正',把远距离的小脸'拉近',再统一缩放到 112×112 像素。这一步直接决定了后续识别的上限。
举个例子:
- 普通 MTCNN 检测器在侧脸场景下容易漏检或框偏;
- RetinaFace 在相同条件下仍能稳定输出 5 点坐标,对齐后输入 CurricularFace 的特征质量提升明显。

