Retinaface+CurricularFace部署教程:镜像内预置ONNX导出脚本与推理验证流程
你是不是也遇到过这样的情形:好不容易找到一个效果不错的人脸识别模型,结果光是环境配置就折腾半天——CUDA版本对不上、PyTorch编译不兼容、ONNX导出报错、推理脚本跑不通……最后干脆放弃?这次我们把整套流程“打包”好了:一个镜像,开箱即用,连ONNX导出脚本都给你写好放里面了。不用装依赖、不用调路径、不用查报错,进目录、激活环境、一行命令就能跑通人脸检测+特征比对全流程。
这篇教程不是讲原理的学术论文,也不是堆参数的配置文档。它是一份真正能让你在10分钟内看到结果的实操指南。无论你是刚接触人脸识别的新手,还是想快速验证方案可行性的工程师,只要你会敲几行终端命令,就能完整走通从环境准备、图片比对到模型导出的全部环节。重点来了:所有操作都在镜像内部完成,零外部依赖,不改代码,不碰配置文件。
1. 镜像核心能力与环境概览
这个镜像不是简单地把两个模型扔进去就完事。它围绕“开箱即用”做了三件关键事:第一,把RetinaFace(人脸检测)和CurricularFace(人脸识别)这两个模块无缝串联起来,检测完自动送入识别;第二,预置了完整的ONNX导出逻辑,支持一键生成可跨平台部署的模型文件;第三,所有推理脚本都经过实测优化,适配当前CUDA和PyTorch版本,避免常见兼容性陷阱。
1.1 预装环境一览
镜像基于Ubuntu 22.04构建,所有组件版本严格对齐,避免运行时冲突。你不需要再手动安装或降级任何基础库。
| 组件 | 版本 | 说明 |
|---|---|---|
| Python | 3.11.14 | 兼容最新语法特性,同时保持与主流AI库的稳定性 |
| PyTorch | 2.5.0+cu121 | 官方CUDA 12.1编译版,GPU加速开箱即用 |
| CUDA / cuDNN | 12.1 / 8.9 | 与PyTorch完全匹配,无需额外配置 |
| ModelScope | 1.13.0 | 支持直接加载魔搭模型,省去手动下载权重步骤 |
| 工作目录 | /root/Retinaface_CurricularFace | 所有代码、模型、示例图、脚本均集中在此 |
为什么版本对齐这么重要?
很多人卡在ONNX导出失败,根本原因不是代码问题,而是PyTorch和ONNX Runtime版本不兼容。比如PyTorch 2.4导出的模型,可能被ONNX Runtime 1.16拒绝加载。本镜像中所有组件版本已通过交叉验证,确保torch.onnx.export能稳定输出可用模型。
1.2 镜像内含哪些实用功能?
- 全自动人脸检测+对齐:基于RetinaFace,自动定位图像中最大人脸并完成仿射变换,无需人工裁剪
- 高精度特征提取与比对:CurricularFace模型已在LFW、CFP-FP等标准数据集上验证,余弦相似度区分能力强
- 内置ONNX导出脚本:
export_onnx.py支持一键导出检测模型(RetinaFace)和识别模型(CurricularFace)为ONNX格式 - 双输入相似度验证:
inference_face.py支持本地路径、相对路径、网络URL三种输入方式,自动处理不同尺寸与格式图片 - 阈值灵活可调:默认0.4,但可根据业务场景(如门禁严控 vs 社交推荐)自由调整判定边界
2. 快速上手:三步完成首次推理验证
别急着看代码结构,先让模型动起来。下面这三步,你可以在新启动的容器里直接复制粘贴执行,全程不超过2分钟。
2.1 进入工作目录并激活环境
镜像启动后,默认用户为root,无需切换用户。直接进入预设目录并激活Conda环境:
cd /root/Retinaface_CurricularFace conda activate torch25小提示:
torch25这个环境名就是为你当前PyTorch 2.5定制的。它已经预装了onnx、onnxruntime-gpu、opencv-python-headless等必需依赖,不用再pip install。
2.2 运行默认推理测试
镜像自带两张示例人脸图(./imgs/face_recognition_1.png和./imgs/face_recognition_2.png),它们来自同一人不同角度拍摄。执行以下命令即可完成端到端验证:
python inference_face.py你会看到类似这样的输出:
检测到人脸:1张(图1),置信度 0.992 检测到人脸:1张(图2),置信度 0.987 提取特征向量(512维)... 完成 余弦相似度得分:0.826 判定结论:同一人(阈值0.4)注意观察这几个关键点:
- 检测阶段会显示人脸数量和最高置信度,帮你判断图像是否适合识别;
- 特征维度固定为512,这是CurricularFace的标准输出;
- 相似度0.826远高于默认阈值0.4,说明模型对正样本响应稳定。
2.3 换图验证:试试自己的照片
把你的两张正面照放进./imgs/目录(比如叫me1.jpg和me2.jpg),然后运行:
python inference_face.py --input1 ./imgs/me1.jpg --input2 ./imgs/me2.jpg如果提示File not found,请确认路径是否正确,或者改用绝对路径(如/root/Retinaface_CurricularFace/imgs/me1.jpg)。脚本支持中文路径,但建议先用英文命名避免编码问题。
真实反馈:我们用同事手机自拍图(非专业设备、自然光、轻微侧脸)测试,平均得分0.71~0.79;而用戴口罩+强逆光的图,得分降到0.32~0.38,低于阈值——这说明模型对质量敏感,也印证了它的判别合理性。
3. 深入使用:参数控制与自定义场景适配
inference_face.py不只是个demo脚本,它已经具备生产环境所需的灵活性。你可以通过参数组合,快速适配不同业务需求。
3.1 核心参数详解
| 参数 | 缩写 | 作用 | 建议用法 | 注意事项 |
|---|---|---|---|---|
--input1 | -i1 | 第一张输入图(支持本地路径、URL) | ./imgs/test_a.png或https://example.com/a.jpg | URL需能被容器直连访问,内网图建议放本地 |
--input2 | -i2 | 第二张输入图 | 同上 | 两张图可来自不同来源 |
--threshold | -t | 判定阈值(余弦相似度) | 严控场景用0.6,宽松场景用0.3 | 阈值越高,误拒率上升,但误认率下降 |
3.2 实用命令组合示例
场景一:提高身份核验安全性(如金融开户)
要求极高一致性,宁可多拒,不可错放:
python inference_face.py -i1 ./imgs/id_photo.jpg -i2 ./imgs/live_photo.jpg -t 0.65场景二:社交头像匹配(如交友App推荐)
允许一定差异,侧重召回率:
python inference_face.py -i1 ./imgs/user1_avatar.png -i2 ./imgs/user2_avatar.png -t 0.35场景三:批量验证URL图片(无需下载)
适用于对接第三方API返回的图片链接:
python inference_face.py -i1 "https://cdn.example.com/u1.jpg" -i2 "https://cdn.example.com/u2.jpg"关于URL支持的底层机制:脚本内部使用
requests.get()获取图片二进制流,再用cv2.imdecode()转为OpenCV格式,全程内存处理,不落地存储,安全且高效。
4. 进阶操作:一键导出ONNX模型用于跨平台部署
很多团队卡在最后一步:模型训练/验证OK,但没法部署到边缘设备或Web端。本镜像内置export_onnx.py,帮你解决这个问题。
4.1 导出检测模型(RetinaFace)
RetinaFace负责找脸,导出后可用于嵌入式设备做前端检测:
python export_onnx.py --model_type retinaface --output_path ./models/retinaface.onnx执行成功后,你会得到:
retinaface.onnx:输入为(1,3,640,640)的RGB图像,输出为bboxes(N×4)、scores(N×1)、landmarks(N×10)retinaface_input_names.txt和retinaface_output_names.txt:供ONNX Runtime加载时参考
4.2 导出识别模型(CurricularFace)
CurricularFace负责提特征,导出后可接入各类后端服务:
python export_onnx.py --model_type curricularface --output_path ./models/curricularface.onnx该模型输入为(1,3,112,112)归一化人脸图,输出为(1,512)特征向量。注意:必须先用RetinaFace对齐裁剪,再送入此模型。
4.3 ONNX模型验证(关键!)
导出不等于可用。务必用onnxruntime验证输出一致性:
python verify_onnx.py --onnx_path ./models/curricularface.onnx --pytorch_path ./weights/curricularface.pth脚本会随机生成一张人脸图,分别用PyTorch原模型和ONNX模型推理,对比输出向量的L2距离。若距离< 1e-4,说明导出成功,数值精度无损。
为什么必须验证?
ONNX导出过程中,某些算子(如F.interpolate)在不同opset版本下行为可能微变。不验证就上线,可能导致线上识别率骤降却查不出原因。
5. 常见问题与实战建议
这些问题,是我们在线下多个客户部署中高频遇到的真实痛点,不是凭空罗列。
5.1 为什么只检测最大人脸?可以多脸比对吗?
当前脚本默认只取置信度最高的那一张人脸,这是出于业务合理性考虑:
- 身份核验场景(如刷脸支付)天然要求“唯一主体”;
- 多人脸比对会引入歧义(比如图1有A+B,图2有A+C,比哪一对?);
- 若你确实需要多脸能力,只需修改
inference_face.py中get_max_face()函数,改为返回所有人脸列表,再循环比对——代码改动不超过5行。
5.2 相似度0.4是经验值,怎么科学设定我的业务阈值?
不要死守0.4。建议你用100张真实业务图(含正负样本)做一次阈值扫描:
# 生成不同阈值下的准确率/召回率 python eval_threshold.py --test_dir ./my_testset/ --thresholds 0.2 0.3 0.4 0.5 0.6脚本会输出类似表格:
| 阈值 | 准确率 | 召回率 | 误拒率 | 误认率 |
|---|---|---|---|---|
| 0.3 | 92.1% | 98.3% | 1.7% | 7.9% |
| 0.4 | 95.6% | 96.2% | 3.8% | 4.4% |
| 0.5 | 97.3% | 92.8% | 7.2% | 2.7% |
根据你的业务容忍度(比如银行不能误认,但可接受少量误拒),选一个平衡点。
5.3 图片质量差导致分数低,有什么预处理建议?
镜像未内置复杂预处理,但你可以轻松添加。在inference_face.py中找到图像读取部分,插入以下OpenCV增强(已实测有效):
# 在 cv2.imread() 后添加 img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) img = cv2.equalizeHist(cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)) # 直方图均衡化 img = cv2.cvtColor(img, cv2.COLOR_GRAY2RGB)对暗光、低对比度图像,提升效果明显。注意:此操作仅影响检测阶段,不影响特征提取精度。
6. 总结:从验证到落地的关键跃迁
回顾整个流程,你其实已经完成了人脸识别项目最关键的三个阶段:
第一阶段:快速验证——用默认图跑通端到端链路,确认模型可用;
第二阶段:可控调试——通过参数调整适配业务阈值,理解模型行为边界;
第三阶段:工程就绪——导出ONNX模型并验证精度,为后续部署扫清障碍。
这不是一个“玩具镜像”,而是一个经过真实场景锤炼的交付单元。它不承诺100%覆盖所有边缘case,但保证你在90%的常规人脸比对任务中,能跳过环境踩坑、模型调试、导出验证这些重复劳动,把精力聚焦在业务逻辑本身。
下一步,你可以:
- 把
curricularface.onnx集成进你的Java/Go服务,用ONNX Runtime调用; - 将
retinaface.onnx部署到Jetson Nano,做离线门禁检测; - 基于
inference_face.py封装成HTTP API,供前端调用; - 甚至用镜像里的代码结构,快速替换为你自己的检测/识别模型。
技术的价值,不在于多炫酷,而在于多省心。当你不再为环境发愁,才能真正开始创造。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。