公司动态

人脸检测性能拆解:SCRFD 2.5GF 下 4.2ms 的实现路径

📅 2026/9/3 12:57:05
人脸检测性能拆解:SCRFD 2.5GF 下 4.2ms 的实现路径
人脸检测性能拆解SCRFD 2.5GF 下 4.2ms 的实现路径【免费下载链接】insightfaceState-of-the-art 2D and 3D Face Analysis Project项目地址: https://gitcode.com/GitHub_Trending/in/insightface场景锚定一个常见的卡点安防或直播场景里多路视频流每帧都要先定位人脸再进入识别、属性分析环节。检测器如果单帧耗时 20ms 以上整条流水线就卡在第一个算子上。人脸检测要同时扛住小目标、密集遮挡和端侧算力预算传统方案往往在精度和速度之间二选一。InsightFace 仓库中的 SCRFD 给出了另一条路线2.5GF 算力下 4.2ms 推理、WIDERFace Hard 集 77.87 的 mAP比同量级的 ResNet 基线高出约 3.4 个点。本文拆解它的设计决策与部署路径。原理拆解point-based 回归与锚框尺度设计SCRFD 不依赖传统检测器那种多比例×多尺度的 anchor 集合而是 point-based 回归每个特征点直接预测到框边界的距离。尺度覆盖交给三层特征图stride 8/16/32和每层两个 base_size。配置位于detection/scrfd/configs/scrfd/scrfd_2.5g.pyanchor_generatordict( typeAnchorGenerator, ratios[1.0], scales[1, 2], base_sizes[16, 64, 256], # 三层特征各配一组尺度 strides[8, 16, 32])常规做法用固定 anchor 模板枚举候选框小人脸和大人脸的精度互相牵制这里每层只保留两个候选参数量压到 0.67M候选框总数也更小后处理压力随之下降。PAFPN 特征金字塔与通道压缩SCRFD 的 neck 是 PAFPNin_channels[24,48,48,80]out_channels24在标准 FPN 自下而上上采样之外增加了一条自上而下的路径让浅层高分辨率特征也携带深层语义。与 ResNet-50 FPN 配置动辄 256 输出通道不同SCRFD 全线只用 24 通道并配合 head 里的 GroupNorm16 组控制小特征图上的归一化开销这是 2.5GF 量级能跑下来的关键之一。ATSS 动态标签分配正样本选择用的是ATSSAssigner(topk9)按 IoU 中位数确定该特征点的候选再取分类得分最高的 9 个作为正样本。相比 RetinaNet 基线里MaxIoUAssigner的固定阈值pos 0.5 / neg 0.4动态分配在 WIDERFace 这类小目标密集、遮挡严重的场景里避免了同一张图正样本要么过多要么过少的失衡训练收敛更稳。落地路径环境准备克隆仓库并安装训练侧依赖# 克隆仓库只读使用 git clone https://gitcode.com/GitHub_Trending/in/insightface # 安装 SCRFD 训练侧依赖 pip install -r detection/scrfd/requirements.txt训练代码基于 mmdetection 生态mmcv 1.2.6 / 1.3.3 经过测试只跑推理的话装 onnxruntime、opencv、numpy 即可。模型准备仓库 README 提供预训练 ONNX 的下载入口也可从训练产物自行转换tools/scrfd2onnx.py指定固定输入尺寸后用 onnx-simplifier 做优化。核心调用detection/scrfd/tools/scrfd.py的SCRFD类import cv2 from scrfd import SCRFD detector SCRFD(model_filescrfd_2.5g.onnx) # 也可用 2p5gkps 带关键点版本 detector.prepare(ctx_id-1, input_size(640, 640)) # CPU 推理固定输入尺寸 img cv2.imread(test.jpg) bboxes, kpss detector.detect(img, 0.5) # 阈值 0.5结果校验bboxes形状为 (N,5)即 x1,y1,x2,y2 加置信度坐标已映射回原图可直接绘制_KPS变体还会返回 (N,5,2) 的五点关键点。用 2p5gkps 等_KPS模型时输出包含关键点普通 SCRFD_2.5G 的kpss恒为 None。数据透视下表取自detection/scrfd/README.md的官方评测WIDERFaceVGA 分辨率模型Easy / Medium / Hard (mAP)参数量(M)推理(ms)SCRFD-2.5G93.78 / 92.16 / 77.870.674.2ResNet-2.5GF 基线93.21 / 91.11 / 74.471.625.4RetinaFace (MobileNet0.25)87.78 / 81.16 / 47.320.447.9同参数量级内SCRFD-2.5G 的 Hard 集 mAP 比 ResNet 基线高 3.4 点、快 1.28 倍相对 RetinaFace-MobileNet 0.25Hard 集 mAP 高出约 30 个点推理耗时缩短到约五分之一。README 还给出了 0.5GF 变体的 CPU 实测AMD Ryzen 9 3950XPyTorch 单线程640×480 输入 28.3ms320×240 输入 11.4ms输入分辨率约减半耗时同比例下降——小目标多的场景不建议直接降分辨率。边界与陷阱输入尺寸是精度的第一变量。320×240 下 mAP 从 90.57 掉到 82 左右Easy 集同仓库 CPU 实测漏检集中在小人脸。在线路允许的前提下优先 640×640必须压延迟就先试 640×480并保留 0.5 阈值。阈值要用验证集扫不要拍。detection/scrfd/tools/scrfd.py中 NMS 的 iou_threshold 默认为 0.4训练配置里是 0.45两者接近多人密集重叠场景可放宽到 0.5 减少误抑制。score 阈值按下面方式找拐点for thr in (0.1, 0.3, 0.5, 0.6): # 在验证集上扫阈值 b, _ detector.detect(img, thr) print(thr, b.shape[0])批量推理的缓存与后处理开销。推理类内置center_cache上限 100 项缓存各尺度 anchor 中心点频繁切换输入尺寸会反复触发重算服务化时固定input_size即可。Python 实现的 NMS 是纯循环单帧吞吐受它限制高帧率场景建议把 ONNX 模型交给 C 侧推理。生态位与延伸SCRFD 在 insightface 生态中是 2D 人脸检测的基础模块上游训练代码基于 mmdetection / mmdet下游为python-package中face_analysis管线的人脸对齐、识别与属性分析提供输入。端侧或 C 部署需求可以关注仓库内的cpp-package/inspireface已封装跨平台推理。算法的取舍——锚框、neck、标签分配——决定了 ONNX 模型能达到的上限而从环境到校验的三步路径是把这种上限转化为工程收益的最短距离。文中性能数据均出自仓库detection/scrfd/README.mdWIDERFace VGA 分辨率评测CPU 数据为 AMD Ryzen 9 3950X、PyTorch CPU 推理实际部署以硬件与推理引擎为准。【免费下载链接】insightfaceState-of-the-art 2D and 3D Face Analysis Project项目地址: https://gitcode.com/GitHub_Trending/in/insightface创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考