Tiger AI Platform 人脸识别功能汇总
导读 :本文汇总平台「人脸识别」能力------业界常用框架与任务模型对比、本项目选型(InsightFace)、底库与实时 1:N 识别流程、API / 权限,以及操作界面说明。
文中配图位请按说明截取平台页面,放入
docs/images/face/后替换占位图。
文章目录
- [Tiger AI Platform 人脸识别功能汇总](#Tiger AI Platform 人脸识别功能汇总)
-
- 一、功能概览
- [*图 1:侧栏「视觉识别 → 人脸识别」入口](#*图 1:侧栏「视觉识别 → 人脸识别」入口)
- 二、框架与方案对比(选型背景)
-
- [2.1 常见框架 / SDK 对比](#2.1 常见框架 / SDK 对比)
- [2.2 任务模型对比(检测 vs 识别)](#2.2 任务模型对比(检测 vs 识别))
- [2.3 Buffalo 套件档位对比](#2.3 Buffalo 套件档位对比)
- 三、本项目采用的框架与模型
-
- [3.1 技术选型结论](#3.1 技术选型结论)
- [3.2 种子模型(模型管理)](#3.2 种子模型(模型管理))
- 四、系统架构与数据流
-
- [4.1 模块结构](#4.1 模块结构)
- [4.2 端到端流程](#4.2 端到端流程)
- [4.3 登记与识别细节](#4.3 登记与识别细节)
- 五、人脸底库功能
-
- [5.1 数据模型](#5.1 数据模型)
- [5.2 底库界面能力](#5.2 底库界面能力)
- [5.3 匹配策略说明](#5.3 匹配策略说明)
- 六、实时识别界面
- [七、API 与权限](#七、API 与权限)
- 八、部署与使用步骤(简版)
- 九、阈值、性能与注意事项
- 十、与平台其他视觉能力的边界
- 十一、配图清单(请按序补齐)
- 十二、相关代码与文档索引
一、功能概览
平台在视觉识别菜单下提供独立工作台 人脸识别 (路由 /ai/face),完成:
| 能力 | 说明 |
|---|---|
| 实时 1:N 识别 | 浏览器摄像头抓帧 → 服务端检测 + 特征提取 → 与底库余弦匹配 → 画面叠加与结果表 |
| 人脸底库 | 人员 CRUD、多图登记(上传 / 拍照)、按模型绑定特征向量 |
| 模型纳管 | 种子模型 Buffalo-S / Buffalo-L,在「模型管理」中拉取 InsightFace 权重 |
| 权限控制 | 菜单与按钮级权限(查询 / 新增 / 修改 / 删除) |
识别流水线(本项目):
text
图像帧
→ SCRFD 人脸检测(可选 detThresh)
→ 对齐
→ ArcFace 特征(512 维,L2 归一化)
→ 与底库矩阵余弦相似度 1:N
→ score ≥ threshold → 匹配姓名;否则 unknown

*图 1:侧栏「视觉识别 → 人脸识别」入口
二、框架与方案对比(选型背景)
人脸相关能力通常拆成:检测(在哪) 、识别 / 比对(是谁) 、活体 / 属性(可选)。工程上可选开源框架或云 API。
2.1 常见框架 / SDK 对比
| 方案 | 类型 | 优势 | 局限 | 适合场景 |
|---|---|---|---|---|
| InsightFace | 开源(ONNX) | 检测+识别一体化;buffalo 套件成熟;CPU/GPU 均可;社区与论文基线强 | 商用需自行评估许可;需管权重与底库 | 本平台采用;本地部署 1:N |
| DeepFace | 开源封装 | 多后端(VGG-Face、Facenet、ArcFace 等)易试用 | 生产性能与依赖链偏重;API 偏脚本 | 快速验证、研究对比 |
| face_recognition (dlib) | 开源 | 上手简单、教程多 | 精度与抗干扰弱于现代 ArcFace;维护偏旧 | 演示、小样本 |
| MediaPipe Face | 开源 | 实时检测/网格强;移动端友好 | 不提供开箱 1:N 身份识别 | 美颜、关键点、活体辅助 |
| OpenCV DNN / YuNet | 开源 | 部署轻、依赖少 | 识别能力弱或需自建比对 | 仅检测、嵌入式 |
| FaceNet / 自训 ArcFace | 自研管线 | 可控、可定制数据集 | 工程成本高(训练、对齐、底库、服务) | 大规模定制 |
| 云 API(Face++、腾讯云、阿里云等) | 商业 SaaS | 精度与运维省心;活体/证件等齐全 | 费用、隐私出境/合规、离线不可用 | ToB 快速上线、强合规云厂商 |
2.2 任务模型对比(检测 vs 识别)
| 任务 | 代表模型 | 输出 | 本项目 |
|---|---|---|---|
| 人脸检测 | SCRFD、RetinaFace、YuNet、MTCNN | 框 / 关键点 / 检测分 | SCRFD(InsightFace buffalo 内置) |
| 人脸识别(特征) | ArcFace、CosFace、SphereFace、MobileFaceNet | 固定维 embedding | ArcFace 系(S:MobileFace;L:ResNet50) |
| 比对策略 | 余弦 / 欧氏距离 + 阈值 | 是否同一人 | 余弦相似度 ,默认阈值 0.4 |
| 识别模式 | 1:1 核验 / 1:N 检索 | 比对两人 / 搜底库 | 1:N 底库检索 |
2.3 Buffalo 套件档位对比
InsightFace 官方 buffalo 套件将检测与识别 ONNX 打包发布,本平台种子了两档:
| 档位 | 识别骨干 | 相对精度 | 速度 / 资源 | 建议 |
|---|---|---|---|---|
| buffalo_s | MobileFace(w600k_mbf.onnx) |
中高 | CPU 友好 | 默认开发与演示 |
| buffalo_l | ResNet50(w600k_r50.onnx) |
更高 | 更吃算力,建议 GPU + CUDA EP | 底库较大或要求更高召回 |
不同 pack /
model_key的特征空间不互通:更换识别模型后必须重新登记人脸。
三、本项目采用的框架与模型
3.1 技术选型结论
| 项 | 本项目选择 |
|---|---|
推理框架 library |
insightface |
任务类型 task |
face-recognition |
| 运行时 | ONNX Runtime(优先 CUDA EP,否则 CPU) |
| 检测 | SCRFD,det_size=(640, 640),默认 detThresh=0.5 |
| 特征 | ArcFace 512 维,入库与比对前 L2 归一化 |
| 匹配 | 内存底库矩阵 × 查询向量(余弦),阈值默认 0.4 |
依赖(见 backend/requirements.txt):
text
insightface>=0.7.3
onnxruntime>=1.17.0 # GPU 环境可换装匹配的 onnxruntime-gpu
3.2 种子模型(模型管理)
| model_key | 显示名 | version(pack) | 权重来源 |
|---|---|---|---|
insightface-buffalo-s |
InsightFace Buffalo-S | buffalo_s |
InsightFace v0.7 buffalo_s.zip |
insightface-buffalo-l |
InsightFace Buffalo-L | buffalo_l |
InsightFace v0.7 buffalo_l.zip |
- 分类:
人脸识别;状态启用后出现在人脸页「识别模型」下拉框。 - 权重目录:
backend/uploads/insightface/models/<pack>/ - 拉取方式:模型管理 → 拉取权重 ;或
python scripts/poc_insightface.py buffalo_s

*图 2:模型管理中筛选 library=insightface / task=face-recognition,并展示 Buffalo-S/L 与「拉取权重」
四、系统架构与数据流
4.1 模块结构
| 层级 | 路径 | 职责 |
|---|---|---|
| ORM | backend/models/face.py |
FacePerson、FaceEmbedding |
| 底库服务 | backend/services/face_gallery.py |
打包/解包向量、缓存、余弦匹配、多图平均 |
| 推理 | backend/inference.py |
FaceAnalysis 缓存、抽特征、识别绘图 |
| API | backend/routes/face.py |
/api/ai/face/* |
| 前端 | frontend/src/views/ai/face/index.vue |
实时识别 + 底库 UI |
| 客户端 | frontend/src/api/ai.js → faceApi |
封装 HTTP |
4.2 端到端流程
#mermaid-svg-qliePry8LoYgb9SX{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-qliePry8LoYgb9SX .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-qliePry8LoYgb9SX .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-qliePry8LoYgb9SX .error-icon{fill:#552222;}#mermaid-svg-qliePry8LoYgb9SX .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-qliePry8LoYgb9SX .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-qliePry8LoYgb9SX .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-qliePry8LoYgb9SX .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-qliePry8LoYgb9SX .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-qliePry8LoYgb9SX .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-qliePry8LoYgb9SX .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-qliePry8LoYgb9SX .marker{fill:#333333;stroke:#333333;}#mermaid-svg-qliePry8LoYgb9SX .marker.cross{stroke:#333333;}#mermaid-svg-qliePry8LoYgb9SX svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-qliePry8LoYgb9SX p{margin:0;}#mermaid-svg-qliePry8LoYgb9SX .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-qliePry8LoYgb9SX .cluster-label text{fill:#333;}#mermaid-svg-qliePry8LoYgb9SX .cluster-label span{color:#333;}#mermaid-svg-qliePry8LoYgb9SX .cluster-label span p{background-color:transparent;}#mermaid-svg-qliePry8LoYgb9SX .label text,#mermaid-svg-qliePry8LoYgb9SX span{fill:#333;color:#333;}#mermaid-svg-qliePry8LoYgb9SX .node rect,#mermaid-svg-qliePry8LoYgb9SX .node circle,#mermaid-svg-qliePry8LoYgb9SX .node ellipse,#mermaid-svg-qliePry8LoYgb9SX .node polygon,#mermaid-svg-qliePry8LoYgb9SX .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-qliePry8LoYgb9SX .rough-node .label text,#mermaid-svg-qliePry8LoYgb9SX .node .label text,#mermaid-svg-qliePry8LoYgb9SX .image-shape .label,#mermaid-svg-qliePry8LoYgb9SX .icon-shape .label{text-anchor:middle;}#mermaid-svg-qliePry8LoYgb9SX .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-qliePry8LoYgb9SX .rough-node .label,#mermaid-svg-qliePry8LoYgb9SX .node .label,#mermaid-svg-qliePry8LoYgb9SX .image-shape .label,#mermaid-svg-qliePry8LoYgb9SX .icon-shape .label{text-align:center;}#mermaid-svg-qliePry8LoYgb9SX .node.clickable{cursor:pointer;}#mermaid-svg-qliePry8LoYgb9SX .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-qliePry8LoYgb9SX .arrowheadPath{fill:#333333;}#mermaid-svg-qliePry8LoYgb9SX .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-qliePry8LoYgb9SX .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-qliePry8LoYgb9SX .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-qliePry8LoYgb9SX .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-qliePry8LoYgb9SX .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-qliePry8LoYgb9SX .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-qliePry8LoYgb9SX .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-qliePry8LoYgb9SX .cluster text{fill:#333;}#mermaid-svg-qliePry8LoYgb9SX .cluster span{color:#333;}#mermaid-svg-qliePry8LoYgb9SX div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-qliePry8LoYgb9SX .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-qliePry8LoYgb9SX rect.text{fill:none;stroke-width:0;}#mermaid-svg-qliePry8LoYgb9SX .icon-shape,#mermaid-svg-qliePry8LoYgb9SX .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-qliePry8LoYgb9SX .icon-shape p,#mermaid-svg-qliePry8LoYgb9SX .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-qliePry8LoYgb9SX .icon-shape rect,#mermaid-svg-qliePry8LoYgb9SX .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-qliePry8LoYgb9SX .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-qliePry8LoYgb9SX .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-qliePry8LoYgb9SX :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 数据库
InsightFace + Gallery
Flask /api/ai/face
前端 /ai/face
实时识别 Tab
人脸底库 Tab
POST .../enroll
POST /recognize
人员 CRUD
FaceAnalysis SCRFD+ArcFace
按 model_key 缓存底库矩阵
face_person
face_embedding
4.3 登记与识别细节
- 新增人员 :只写
face_person(姓名、工号、备注、启停),此时尚无特征。 - 登记(enroll) :上传 1~5 张图 → 每张取检测分最高的人脸 embedding → 平均后 L2 → 按
model_key覆盖写入face_embedding→ 清底库缓存;可选保存登记图到uploads/faces/<person_id>/。 - 识别(recognize):抽全图人脸 → 对每个 embedding 做 1:N → 返回 bbox / name / score / matched。
- 实时页优化 :抓帧宽约 640;隔帧 (默认 2)降低 CPU 压力;客户端 IoU>0.3 短时跟踪,减少标签闪烁。
五、人脸底库功能
5.1 数据模型
人员 face_person
| 字段 | 说明 |
|---|---|
| name | 姓名(必填) |
| employee_no | 工号 / 编号(可选) |
| remark | 备注 |
| status | 0 启用 / 1 停用(停用后不参与匹配) |
特征 face_embedding
| 字段 | 说明 |
|---|---|
| person_id | 外键,级联删除 |
| model_key | 与 AiModel.model_key 绑定 |
| dim | 默认 512 |
| vector | float32 二进制 |
| source_path | 登记图相对路径(可选) |
同一人员、同一 model_key 仅保留一条主特征(再次登记会覆盖)。
5.2 底库界面能力
| 功能 | 说明 |
|---|---|
| 查询 | 按姓名搜索列表 |
| 新增 / 编辑 / 删除 | 人员信息维护;删除级联特征 |
| 登记人脸 | 选择 InsightFace 模型;本地上传与/或摄像头拍照,合计最多 5 张 |
| 特征数展示 | 列表显示 embeddingCount |
| 启停 | 停用人员不进入匹配矩阵 |

图 3:人脸底库列表(含姓名、工号、特征数、状态、操作列)

图 4:登记人脸对话框(模型选择 + 上传/拍照预览,1~5 张)
5.3 匹配策略说明
- 仅加载 status=启用 且对应
model_key的特征。 - 查询向量与底库矩阵做点积(等价于余弦,因已 L2)。
score >= threshold判定匹配;否则姓名为unknown。- 建议在真实底库上标定阈值区间 0.35~0.45(默认 0.4)。
六、实时识别界面
| 控件 | 默认 / 范围 | 作用 |
|---|---|---|
| 识别模型 | Buffalo-S/L(已拉取权重) | 决定 pack 与底库 model_key |
| 摄像头 | 系统设备列表 | getUserMedia |
| 相似度阈值 | 0.4(0.2~0.8) | 匹配门槛 |
| 隔帧 | 2(0~5) | CPU 建议 2~3;GPU 可调 0 |
| 开始 / 停止 | --- | 启停识别循环 |
画面 HUD:FPS、人脸数、已识别数;右侧表格:姓名、相似度百分比、匹配/未知。

图 5:实时识别页(左侧摄像头叠加框 + 右侧识别结果表,建议含至少一人已匹配)
七、API 与权限
前缀:/api/ai/face(需 JWT)。
| 方法 | 路径 | 权限 | 说明 |
|---|---|---|---|
| GET | /persons |
ai:face:list |
底库列表(可按 name 过滤) |
| GET | /persons/:id |
ai:face:list |
详情(含 embeddings) |
| POST | /persons |
ai:face:add |
新增人员 |
| PUT | /persons/:id |
ai:face:edit |
编辑 |
| DELETE | /persons/:id |
ai:face:remove |
删除 |
| POST | /persons/:id/enroll |
ai:face:add |
登记:modelId + files |
| POST | /recognize |
ai:face:list |
识别:file/image + modelId + threshold 等 |
菜单种子:ai:face:list|query|add|edit|remove(见 backend/seed.py)。
八、部署与使用步骤(简版)
- 安装依赖:
insightface、onnxruntime(或 GPU 版)。 - 启动后端种子后,打开 模型管理 ,对 Buffalo-S(或 L)执行 拉取权重。
- 打开 人脸识别 → 人脸底库:新增人员 → 登记 1~5 张正脸照。
- 切到 实时识别:选同一模型、调阈值与隔帧 → 开始识别。
- 可选 PoC:
cd backend && python scripts/poc_insightface.py buffalo_s

图 6:模型管理中对 InsightFace 模型点击「拉取权重」成功后的状态(filePath / 大小)
九、阈值、性能与注意事项
| 项 | 建议 |
|---|---|
| 余弦阈值 | 默认 0.4;误识多则调高,拒识多则调低 |
| 检测阈值 | 后端默认 0.5(前端暂未暴露) |
| CPU | 抓帧宽 640 + 隔帧 2~3 |
| GPU | 安装 CUDA 对应 onnxruntime-gpu 后可将隔帧调低 |
| 换模型 | 必须重新 enroll |
| 合规 | 人脸属敏感个人信息;须授权、限用途与留存;InsightFace 许可见官方仓库 |
页面顶部已有合规提示条,对外演示勿将底库暴露至公网。

图 7:人脸识别页顶部合规提示(含 InsightFace 许可与隐私说明)
十、与平台其他视觉能力的边界
| 模块 | 关系 |
|---|---|
摄像头检测 /ai/camera |
通用目标检测(YOLO 等),不是人脸底库 1:N |
| 视频 / 图片检测 | 物体检测与告警,不走 face_embedding |
人脸识别 /ai/face |
唯一完整的 InsightFace 底库登记与实时识别工作台 |
十一、配图清单(请按序补齐)
将截图保存到 docs/images/face/,文件名与上文占位一致:
| 文件名 | 建议内容 |
|---|---|
01-menu-face.png |
菜单进入人脸识别 |
02-model-manage-insightface.png |
模型管理中的 InsightFace 模型 |
03-gallery-list.png |
人脸底库列表 |
04-enroll-dialog.png |
登记人脸对话框 |
05-live-recognize.png |
实时识别运行中 |
06-fetch-weights.png |
拉取权重成功 |
07-compliance-banner.png |
合规提示条 |
若暂无截图,Markdown 预览中图片会显示为裂图;补齐文件后无需改文案路径。
十二、相关代码与文档索引
| 说明 | 路径 |
|---|---|
| 开发速查(API / 阈值) | face-recognition.md |
| ORM | backend/models/face.py |
| 底库匹配 | backend/services/face_gallery.py |
| 推理 | backend/inference.py(InsightFace 段) |
| 路由 | backend/routes/face.py |
| 前端页 | frontend/src/views/ai/face/index.vue |
| 种子模型与菜单 | backend/seed.py |
| PoC | backend/scripts/poc_insightface.py |
文档版本与平台人脸模块实现同步整理;框架对比表供选型说明,实际能力以仓库代码与种子数据为准。