Tiger AI Platform平台中增加人脸识别功能

Tiger AI Platform 人脸识别功能汇总

导读 :本文汇总平台「人脸识别」能力------业界常用框架与任务模型对比、本项目选型(InsightFace)、底库与实时 1:N 识别流程、API / 权限,以及操作界面说明。

文中配图位请按说明截取平台页面,放入 docs/images/face/ 后替换占位图。


文章目录

一、功能概览

平台在视觉识别菜单下提供独立工作台 人脸识别 (路由 /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 FacePersonFaceEmbedding
底库服务 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.jsfaceApi 封装 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 登记与识别细节

  1. 新增人员 :只写 face_person(姓名、工号、备注、启停),此时尚无特征。
  2. 登记(enroll) :上传 1~5 张图 → 每张取检测分最高的人脸 embedding → 平均后 L2 → 按 model_key 覆盖写入 face_embedding → 清底库缓存;可选保存登记图到 uploads/faces/<person_id>/
  3. 识别(recognize):抽全图人脸 → 对每个 embedding 做 1:N → 返回 bbox / name / score / matched。
  4. 实时页优化 :抓帧宽约 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)。


八、部署与使用步骤(简版)

  1. 安装依赖:insightfaceonnxruntime(或 GPU 版)。
  2. 启动后端种子后,打开 模型管理 ,对 Buffalo-S(或 L)执行 拉取权重
  3. 打开 人脸识别 → 人脸底库:新增人员 → 登记 1~5 张正脸照。
  4. 切到 实时识别:选同一模型、调阈值与隔帧 → 开始识别。
  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

文档版本与平台人脸模块实现同步整理;框架对比表供选型说明,实际能力以仓库代码与种子数据为准。

相关推荐
阿里云大数据AI技术1 小时前
Search Lake:ES x Paimon 让湖上多模态数据可搜可用
人工智能·elasticsearch·搜索引擎
程序员cxuan2 小时前
Grok Build 被众人唾骂,结果老马把它开源了
人工智能·后端·程序员
从零开始的代码生活_2 小时前
C++ 继承详解:访问控制、对象模型、菱形继承与设计取舍
开发语言·c++·后端·学习·算法
神奇霸王龙2 小时前
Claude Code屠榜:MiMo与Grok紧追Codex
服务器·网络·人工智能·gpt·ai·ai编程
C^h2 小时前
python函数学习
人工智能·python·机器学习
KAU的云实验台2 小时前
【研究分享】大语言模型 × 进化计算新范式? —— 以ReEvo为例拆解
人工智能·语言模型·自然语言处理
品牌全球行2 小时前
共商共建共享 链接数字未来——“一带一路数字新城(深圳)会客厅筹备办”揭牌仪式在深圳隆重举行
大数据·人工智能
决战灬2 小时前
langgraph之interrupt(理论篇)
人工智能·python·agent
Byron Loong2 小时前
【视觉】工业相机通讯协议对比GigE Vision、USB3 Vision、CXP、CL、UVC、RTSP、NDI
计算机视觉·视觉检测·实时音视频