Retinaface+CurricularFace 轻量级 CPU 人脸识别部署方案
你是否认为,要运行一个像样的人脸识别系统,非得有昂贵的 GPU 显卡不可?或者被复杂的 CUDA 安装、PyTorch 版本冲突搞得焦头烂额?
今天告诉你:没有 GPU,照样能玩转高性能人脸识别。
我们这次的主角是 RetinaFace 和 CurricularFace 这对组合。一个负责'找脸',一个负责'认人'。借助优化后的预置镜像,你无需手动配置复杂环境,即可获得一个开箱即用、CPU 也能流畅运行的人脸识别系统。
1. 为什么选择这个方案?轻量、高效、开箱即用
1.1 技术组合的优势:各司其职,强强联合
想象一下,你要在聚会照片里找到朋友。需要两步:第一步圈出所有人的脸;第二步确认哪张是目标。
- RetinaFace(视网膜脸):精准的人脸检测器。任务是在图片中找出每一张人脸的位置(方框)和五个关键点(左眼、右眼、鼻尖、左嘴角、右嘴角)。
- CurricularFace(课程脸):先进的人脸识别模型。当 RetinaFace 裁剪出人脸后,CurricularFace 生成一个 512 维的数字向量(特征向量),包含面部核心信息。
结合两者形成流水线:输入图片 → RetinaFace 检测并裁剪 → CurricularFace 生成特征向量 → 比较相似度判断是否同一人。
1.2 轻量级部署的核心:预置镜像与优化推理
这套组合能在 CPU 上运行,关键在于两点:
- 模型本身的高效性:RetinaFace 和 CurricularFace 在精度和速度上平衡良好,不像'巨无霸'模型那样对算力要求极高。
- 预置镜像的优化:镜像已做好所有准备工作。
- 环境全配好:Python、PyTorch、OpenCV、ModelScope 等依赖库版本经过测试,保证兼容。
- 模型已下载:预训练权重内置,无需自行寻找。
- 代码已优化:提供推理脚本
inference_face.py,封装了检测、对齐、特征提取、相似度计算步骤。
这意味着跳过了最令人头疼的环境搭建阶段,直接进入使用阶段。
2. 五分钟快速上手:启动环境并运行第一个例子
2.1 启动环境并进入目录
准备包含所需依赖的运行环境后,打开终端。按照指引进入工作目录并激活环境。
# 1. 进入项目目录
cd <project_directory>
# 2. 激活预置的 Python 环境
conda activate torch25
执行完这两步,环境即准备好。可输入 python --version 验证。
2.2 运行内置的示例脚本
在工作目录下,直接运行:
python inference_face.py
该命令使用脚本内置的两张示例图片进行人脸比对。稍后终端输出类似:
图片 1 中检测到 1 张人脸。
图片 2 中检测到 1 张人脸。
余弦相似度得分:0.85
判定结果:同一人
系统自动完成以下工作:
- 读取两张图片。
- 用 RetinaFace 找到最大人脸。
- 用 CurricularFace 提取特征。
- 计算余弦相似度(0.85)。
- 根据默认阈值(0.4)判断为'同一人'。
2.3 测试自己的图片
将本地图片上传到当前目录,使用命令行参数指定路径:
python inference_face.py --input1 ./my_face1.jpg --input2 ./my_face2.jpg
或简写:
python inference_face.py -i1 ./my_face1.jpg -i2 ./my_face2.jpg
你可以测试同一个人不同表情、你和朋友的照片等。
3. 深入使用:掌握脚本参数与核心功能
3.1 关键参数详解
inference_face.py 提供了几个实用参数:
| 参数 | 简写 | 作用 | 默认值 |
|---|---|---|---|
--input1 | -i1 | 第一张图片路径(绝对/相对/URL) | 内置示例图 1 |
--input2 | -i2 | 第二张图片路径 | 内置示例图 2 |
--threshold | -t | 判定阈值。相似度大于此值判定为'同一人' | 0.4 |
阈值理解:相似度范围 -1 到 1,越接近 1 越相似。
- 安全核验场景(门禁、支付):建议调高,如
0.6或0.7。 - 相册聚类场景:保持
0.4或0.5。
3.2 实用命令示例
1. 提高判定标准
python inference_face.py -i1 ./employee_morning.jpg -i2 ./employee_afternoon.jpg --threshold 0.65
2. 直接比对网络图片
python inference_face.py -i1 https://example.com/photo_a.jpg -i2 https://example.com/photo_b.jpg
3. 批量测试想法 虽然脚本不支持直接批量输入文件夹,但可用 Python 循环实现:
import os
import subprocess
folder1 = './personA_photos'
folder2 = './personB_photos'
for img1 in os.listdir(folder1)[:5]:
for img2 in os.listdir(folder2)[:5]:
path1 = os.path.join(folder1, img1)
path2 = os.path.join(folder2, img2)
cmd = f'python inference_face.py -i1 {path1} -i2 {path2}'
print(f"\n比对:{img1} vs {img2}")
subprocess.run(cmd, shell=True)
4. 理解原理与最佳实践:让系统更'懂'你
4.1 系统工作原理(简化版)
- 加载模型:脚本启动时加载 RetinaFace 和 CurricularFace 模型。
- 读取与预处理:将图片读入内存并转换格式。
- 人脸检测与对齐:RetinaFace 扫描找到面积最大的人脸及 5 个关键点,系统进行旋转和裁剪对齐。
- 特征提取:将对齐后的小图送入 CurricularFace,输出 512 维特征向量。
- 相似度计算与判定:计算余弦相似度,与阈值比较得出结论。
4.2 获得更好效果的实用建议
- 高质量输入:正面清晰,光线均匀,无过大遮挡,避免过度美颜。
- 理解'最大人脸'逻辑:脚本默认只处理每张图片中检测到的最大人脸。多人合影需先裁剪或使用支持多人的脚本。
- 调整阈值:根据场景测试数据分布,找到适合任务的'黄金阈值'。
- 侧脸与光照:侧脸、背光或极暗环境下性能可能下降。
5. 总结
回顾一下,我们在没有 GPU、不配置复杂环境的情况下,快速部署并体验了一个业界主流水平的人脸识别系统。
整个过程简单明了:
- 准备环境:利用预置镜像,跳过环境坑。
- 验证效果:一行命令
python inference_face.py看到比对结果。 - 自定义输入:通过参数灵活控制。
- 理解原理:了解'检测->对齐->提取->比对'流程。
这个轻量级方案降低了人脸识别技术的入门门槛,适用于课程设计、原型验证或 AI 应用探索。基于核心比对功能,可构建相册分类、考勤 demo 等应用。

