RetinaFace 与 CurricularFace 人脸识别实战
做人脸识别,最容易卡住的往往不是模型本身,而是环境和数据。CUDA、PyTorch、cuDNN 这些依赖一旦对不上,排查起来很耗时间。下面这套流程把重心放在真正影响结果的部分:先把人脸找准,再把身份特征提出来,最后做比对。
RetinaFace:先把脸定位准
RetinaFace 的任务很明确,就是在图像里找出人脸位置,并给出五个关键点:左眼中心、右眼中心、鼻尖、左嘴角、右嘴角。后面的对齐步骤基本都靠它。
它在复杂场景里表现比较稳,像光线偏暗、侧脸、口罩、墨镜这些情况,都还能保持可用的检测效果。它只负责检测,不负责判断这个人是谁。
CurricularFace:再把身份特征提出来
CurricularFace 会把检测到的人脸转成一个 512 维向量。这个向量可以理解成'数字指纹',后面只要算余弦相似度,就能判断两张脸是不是同一个人。
它用了课程学习(Curriculum Learning)的思路,训练时从简单样本逐步过渡到难样本,泛化能力比较强。LFW 基准上准确率超过 99.8%,这个水平已经足够支撑大多数工程场景的验证。
实际流程
- 输入原始图片
- RetinaFace 检测出最大人脸区域和关键点
- 做仿射变换,把脸对齐到标准正脸姿态
- CurricularFace 提取 512 维特征向量
- 计算余弦相似度,输出 0~1 的分数
环境准备
先确认这些组件已经装好:
- Python 3.11+
- PyTorch + CUDA + cuDNN
- ModelScope
进入工作目录并激活环境:
cd /root/Retinaface_CurricularFace
conda activate torch25
激活成功后,终端提示符前会出现 (torch25)。
推理用法
本地图片直接比对,脚本是 inference_face.py:
python inference_face.py --input1 /home/user/photo1.jpg --input2 /home/user/photo2.jpg
路径要用绝对路径,支持 .jpg、.jpeg、.png、.bmp。
如果图片放在网络上,也可以直接传 URL:
python inference_face.py -i1 https://example.com/face_a.jpg -i2 https://example.com/face_b.jpg
默认阈值是 0.4。这个值能跑通,但在业务里通常要自己调。考勤场景一般会设得高一点,社交推荐可以放宽一些。
python inference_face.py -i1 a.jpg -i2 b.jpg --threshold 0.65
参数和结果怎么看
| 参数 | 缩写 | 说明 |
|---|---|---|
--input1 | -i1 | 第一张图片路径或 URL |
--input2 | -i2 | 第二张图片路径或 URL |
--threshold |

