拓冰建站拓冰建站
首页 / 资讯中心 / 正文

04-人脸对齐与ArcFace识别

人脸对齐与 ArcFace 识别Umeyama、112×112 与余弦阈值本文讲透一件事检测到的五点如何变成标准脸标准脸如何变成可比较的向量向量如何用余弦相似度判定「是不是同一个人」。对齐核心是 Umeyama 相似变换与 kRef5 模板识别权重为w600k_r50.onnx业务锁定门槛为主角锁定相似度阈值0.32。1. 为何必须对齐识别网络训练时几乎只见过摆正、缩放到固定大小本项目 112×112的脸。若把歪头、仰拍、任意裁切直接塞进网络眼睛可能跑到图像下半部尺度不一导致纹理频率变化同一人在特征空间被几何扰动打散。对齐目标用检测五点估计变换把脸搬进训练分布的标准座位。可以把对齐理解成「证件照规范动作」自动化眼睛水平、脸居中、尺度统一——不是为了好看是为了让网络始终在熟悉的几何里工作。2. 标准五点模板 kRef5在 112×112 画布上两眼约在高度 52水平距约 35.2鼻尖居中略下 (56, 72)嘴角更靠下 (y≈92)间距约 29.2小于眼距。这是 InsightFace / ArcFace 生态的常用模板。自定义五点却沿用别人的预训练权重等于把脸摆进网络没见过的座位分数会系统性异常。图112×112 标准五点位置检测点经相似变换贴合到这些锚点后再送入 ArcFace。3. Umeyama估计 2D 相似变换相似变换含旋转 统一缩放 平移不含非均匀拉伸。相似变换估计如下映射[x’] [ a b tx ] [x][y’] [ -b a ty ] [y][1 ] [ 0 0 1 ] [1]其中尺度s hypot(a,b)旋转θ atan2(b,a)按实现约定。Umeyama 估计相似变换核心staticcv::Matestimate_sim_transform(conststd::arraycv::Point2f,5src){doublesx0,sy0,dx0,dy0;for(inti0;i5;i){sxsrc[i].x;sysrc[i].y;dxkRef5[i][0];dykRef5[i][1];}sx/5;sy/5;dx/5;dy/5;doublesxx0,syy0,sxy0,syx0,var_s0;for(inti0;i5;i){doublesrcxsrc[i].x-sx,srcysrc[i].y-sy;doubledstxkRef5[i][0]-dx,dstykRef5[i][1]-dy;sxxsrcx*dstx;syysrcy*dsty;sxysrcx*dsty;syxsrcy*dstx;var_ssrcx*srcxsrcy*srcy;}if(var_s1e-8)returncv::Mat();doublea(sxxsyy)/var_s;doubleb(sxy-syx)/var_s;doubletxdx-a*sx-b*sy;doubletydyb*sx-a*sy;return(cv::Mat_double(2,3)a,b,tx,-b,a,ty);}为何不用自由仿射类型自由度优点风险相似旋转等比平移不把脸拉扁大姿态残差大仿射再含剪切/非均匀缩放更能硬凑五点扭曲五官伤特征ArcFace 预训练假设偏相似变换乱升自由度会「对齐看起来贴点、特征却坏」。图检测五点源通过 Umeyama 相似变换贴到 kRef5目标再 warpAffine 得到 112×112。4. warpAffine 出图输入是 整帧或足够大的图 全图坐标五点不是只喂紧脸框矩阵会把五官搬进 112双线性插值常数边填充 默认黑边姿态过大时边角可能黑——这是质量信号。对齐失败外观 眼睛不水平、鼻子歪、半张脸黑边、两眼距在 112 图上极小。此类图 绝不能静默送识别。数值直觉假设检测左眼 (200,180)、右眼 (260,182)模板眼距 35.24、检测眼距 ≈60.03粗尺度 s ≈ 35.24 / 60.03 ≈ 0.587再叠加旋转检测眼连线斜率约 2/60与平移使眼落到 (38.3,51.7)、(73.5,51.5)。手算完整 Umeyama 较繁但可用「对齐后把五点画回 112 图」验收应几乎压在 kRef5 上。5. 对齐质量门禁建议显式检查五点是否都有效、非 NaNvar_s 1e-8导致 M 空warp 后黑边占比是否过大112 图上两眼距离是否过小尺度崩了重投影误差把 kps 乘 M 后与 kRef5 的平均距离。门禁失败应返回明确错误而不是输出一张扭曲图——后者产生「有相似度、其实是垃圾」的分数最难排查。可视化三件套原图五点、112 对齐脸、可选模板点叠画。6. ArcFace脸 → 向量默认模型./models/w600k_r50.onnx。ResNet50 骨干、WebFace600K 一类数据训出的 ArcFace 头输出通常 512 维以 ONNX 输出维为准。流程对齐得 112×112 BGR按训练约定转 RGB、归一化、通道优先的张量排布前向得feat[D]L2 归一化。图L2 归一化后两向量点积即 cosθ越接近 1 越像业务用阈值 T 划分匹配。公式sim cosθ (a·b) / (|a||b|) a·b 当 |a||b|1sim直觉→1很像→0几乎正交不像0更不像视训练分布一边归一化、一边不归一化 会让阈值体系整体崩盘。7. 业务阈值0.32 不是魔法但是契约主角锁定相似度阈值0.32的用途包括轨迹平均/最大相似度是否够格参与主角锁定、过低则跳过跟拍等。含义低于 0.32默认不认为「够像底图」达到/超过进入锁定候选逻辑通常还要结合多帧、prominence 等但本篇只讲相似度本身。为何不能照搬论文数字学术测试集多为近正脸、高清监控是俯拍、压缩、侧脸、口罩。同一模型在证件照域 0.4 很严在监控域可能需要 0.32 才锁得住——或反过来。阈值必须在目标域用正负样本对扫出来。ROC 思维收集正对同一人不同帧 vs 底图负对路人 vs 底图。画分数分布选误识率可接受的工作点。跟拍场景通常 更不能接受误识路人锁成主角故偏严再用多帧聚合把拒识拉回来。8. 底图质量决定上限参考脸thumb同样检测 → 对齐 → embedding。烂底图无人能救检查项建议人脸边长尽量 ≥112再缩到 112姿态近正脸遮挡无口罩墨镜手挡清晰度无运动模糊人数有且仅有一张主脸入库门禁失败应拒绝注册。这是性价比最高的质量闸。9. 侧脸、口罩、墨镜大侧脸可对齐但对齐后有效纹理少sim 偏低 → 姿态过滤或等正脸口罩鼻嘴区域失效非口罩模型分数下沉墨镜眼点不稳对齐与识别双杀逆光剪影纹理近无分数无意义。策略轨迹保留历史最佳正脸特征或要求锁定前至少一次高质量正脸。10. 轨迹级聚合 vs 单帧拍板更稳的做法每 track 维护最近 N 次有效 sim用均值或中位数连续 M 次超过 T 才锁定锁定后提高变更门槛避免路人偶发高分抢走。示例单帧 0.30 0.32但近 5 帧均值 0.35 且连续 3 帧 0.30 → 业务可锁。同一模型决策策略不同产品表现天差地别。11. 1:1 与 1:N本场景多为 1:1现场脸 vs 用户底图。扩到 1:N 时比较次数↑假阳性期望↑需开集最高分不够高则「陌生人」1:1 的 0.32 不能直接当 1:N 阈值。12. 归一化细节为何致命方式动作风险01/255漏除会饱和-11常见 InsightFace与 01 搞混减均值除方差按数据集通道均值写错即漂底图与现场必须走同一embed函数。几何对齐对了、数值规范化错了一样认不出。13. 端到端分数旅程SCRFD 给出全图五点相似变换估计 warpAffine→ 112×112w600k_r50.onnx前向 → 512-dL2 norm与 thumb embedding 点积得sim与主角锁定相似度阈值0.32比较并结合轨迹统计决定是否锁定。任一步通道反了、未对齐、未归一化都会表现为「所有人很低」或「所有人很高」。14. 常见故障对照现象优先检查所有人 sim 都很低通道/归一化、未对齐、模型不匹配所有人 sim 都很高未 L2、比错向量只有侧脸低正常加姿态门禁换底图全好旧底图质量差对齐花屏点序与 kRef5 不一致偶发路人高分单帧决策改轨迹聚合M 为空五点重合/var_s 退化15. 相似变换残差与大姿态当脸偏航很大五点无法同时贴近平面模板Umeyama 仍给出「最小二乘最好」的 M但残差大warp 后必扭曲。应用层应mean_reproj_err mean_i || M(src_i) - kRef5_i ||超过经验像素阈例如数个像素量级需按实现标定→ 本帧不参与锁定投票。16. 安全与偏见科普embedding 不是原图仍属生物特征相关数据控访问、控留存、与用户 ID 映射分离。不同肤色/年龄误差可能不同评估集应覆盖目标人群。误识业务代价通常高于拒识阈值策略要反映这一点。17. 实现检查清单关键点顺序与 kRef5 一致输出确为 112×112颜色通道正确特征 L2 后再点积底图与现场同一套预处理阈值来自目标域本项目契约值 0.32 作起点/默认对齐失败有错误路径禁止 silent 黑图提特征底图入库有质量门禁线上尽量轨迹聚合。18. 分数带日常解读相对本域分数带相对 0.32直觉动作≫0.32很像强投票≈0.32略高临界多帧确认略低不确定继续观察≪0.32不像或质量崩丢弃本帧切勿把他域论文阈值直接印刷到产品换镜头与压缩分布会移动。19. 同一人分数为何波动表情、转头、光照、压缩都会改纹理。可怕的不是波动而是用单点极值决策。看分布中心与高质量帧占比只有偶发尖峰、多数很低 → 怀疑误匹配或门禁失效。20. L2 归一化与数值坑voidPersonFocusFaceRecogOrt::l2_normalize(std::vectorfloatfeat){doublenorm0;for(floatv:feat)norm(double)v*v;normstd::sqrt(norm);if(norm1e-8){for(floatv:feat)v(float)(v/norm);}}数值例子 未归一化向量若范数约为 12两向量夹角其实不大但原始点积可能到几十另一对范数都很小的噪声向量点积却接近 0。若不归一化就设阈值等于拿「长度」和「角度」混在一起比阈值无法跨样本迁移。若norm ≤ 1e-8全零或崩坏输出函数 不除特征保持原样——后续点积无意义。应对检测 embedding 范数异常则丢弃本帧。特征比较 在双方已归一化前提下直接累加点积没有在 compare 里再次归一化。因此必须保证 对齐脸嵌入 / 人脸嵌入 出口已经 L2。若某条 GPU 捷径漏了 normalize会出现「偶发分数爆炸」。21. 轨迹打分如何吃 0.32锁定不只看单帧是否 ≥0.32还会把轨迹统计折成综合分。核心逻辑人物聚焦模块解读硬门avg与max_sim同时低于 0.32 → 该轨没有资格软合成 更看重max_sim0.58其次高分占比0.30均值权最小0.12——鼓励「曾经有过清晰正脸」prominence 人在画面中更大、更居中加分避免角落路人偶发像而夺锁。手算例子轨 Aavg0.28, max0.41, hi_ratio0.3, prom0.6硬门max0.41≥0.32 → 通过thumb_core 0.120.28 0.580.41 0.300.3 0.03360.23780.09 0.3614score 0.720.3614 0.28*0.6 ≈ 0.260 0.168 0.428轨 Bavg0.35, max0.36, hi_ratio0.8, prom0.3稳定但峰值一般、不太居中thumb_core 0.120.35 0.580.36 0.300.8 0.0420.20880.24 0.4908score 0.720.4908 0.28*0.3 ≈ 0.353 0.084 0.437两轨分数接近时日志里的avg/max/n/hi/prom/score比单看一个 0.32 开关更有信息量。22. ArcFace 损失直觉公式级训练时类别权重与特征都落在超球面上logits 用角度cos(θ_y) → ArcFace: cos(θ_y m)L -log( e^s·cos(θ_ym) / (e^s·cos(θ_ym) Σ_j≠y e^s·cos(θ_j)) )m角度间隔迫使同一类更聚、类间更开s尺度放大梯度。推理时你只拿到特征用余弦比。换模型必须重标定阈值不同m/s、不同数据训出的分数分布不可直接共用 0.32。23. 对齐失败的可复现实验固定一张正脸图故意搞坏五点操作112 图外观典型 sim 变化左右眼交换五官镜像拧曲同人 sim 暴跌鼻尖平移 20px脸被拉斜中幅下降五点全缩到中心黑边巨大 / M 近退化不可用只用脸框四角假装五点完全错位噪声级这能快速证明识别问题优先查几何再查模型。24. expand-pad 重试与相似度现场比对偶发失败时代码会对脸框做约 0.18 比例外扩再 embed扩大上下文、减轻切下巴。外扩过大可能引入邻人肩膀纹理sim 漂移过小则对齐黑边增多。与检测 ROI「不外扩」不同这是 识别前对已检脸框 的补偿两者不要混为一谈。25. 余弦与欧氏的换算双方单位向量时||a-b||² 2 - 2·(a·b) 2(1 - sim)故sim0.32对应欧氏距离||a-b|| sqrt(2(1-0.32)) sqrt(1.36) ≈ 1.166sim0.50→sqrt(1.0)1.0sim0.80→sqrt(0.4)≈0.632。用哪一种报数都行但团队内部必须统一并与主角锁定相似度阈值0.32的余弦语义一致。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门