
SCRFD人脸检测器选型全解0.5GF起步、3.6ms出框一篇讲透从原理到部署【免费下载链接】insightfaceState-of-the-art 2D and 3D Face Analysis Project项目地址: https://gitcode.com/GitHub_Trending/in/insightface支付摄像头前近处的人脸占满半个画面远处的人脸只剩十几像素。实时人脸检测要在几十毫秒内把每张脸都框出来还要给出 5 个关键点否则下游对齐、识别全部跑偏。InsightFace 的 SCRFDSample and Computation Redistribution样本与计算再分配ICLR 2022 收录就是为此设计的从 0.5GF 到 34GFGF 即 GigaFLOPs计算量档位的五个规格覆盖手机到服务器的全部部署场景。本文带你完成理解原理、选对规格、跑通推理三件事。 到底难在哪核心矛盾是一条尺度跨度大脸区域脸多、位置稳定每个特征点都算一遍是浪费小脸区域脸少而密特征稀疏时稍有遗漏就漏检。传统检测器在所有位置花同样的算力两头都不讨好。SCRFD 的解法是像排班一样重新分配资源市中心店铺密集不必每个路口都站岗郊区人口稀疏反而要加密巡逻。具体落到三个设计要点计算再分配骨干浅层通道多、算得密深层通道少、算得省算力压在定位贡献最大的浅层样本再分配训练时不靠人工 IoU 阈值挑正样本由分配器按邻域统计量自动判定头部共享分类与回归头共用卷积砍掉一半头部的 FLOPs。 三个关键机制ATSS让正负样本自己长出来这个机制解决小脸正样本被固定阈值误杀的问题。配置里只声明分配器类型和 topk 数# detection/scrfd/configs/scrfd/scrfd_2.5g.py train_cfgdict( assignerdict(typeATSSAssigner, topk9)) # 邻域内按中心距离取前9个候选ATSSAssigner 在 detection/scrfd/mmdet/core/bbox/assigners/atss_assigner.py 中的实现对每张真值脸在每个金字塔层取中心距离最近的 topk 个 anchor 做候选计算这些候选的 IoU 均值和标准差用均值加标准差当动态阈值高于它的才算正样本。阈值随图像局部尺度自适应不再写死一个 0.5。不这样做密集小脸场景里大量本该算正样本的 anchor 会因 IoU 略低于阈值被判成负样本模型被反复教这里没有脸Hard 子集精度直接受损。共享头加双尺度 anchor小脸在浅层就能被接住这个机制解决小脸需要密集特征、但算力预算有限的问题。关键配置# detection/scrfd/configs/scrfd/scrfd_2.5g.py bbox_headdict( typeSCRFDHead, cls_reg_shareTrue, # 分类/回归共用卷积头部FLOPs减半 anchor_generatordict( ratios[1.0], scales[1, 2], # 每个位置两个尺度候选 base_sizes[16, 64, 256], strides[8, 16, 32])) # 三层特征金字塔三个数各管一摊base_sizes[16, 64, 256]对应三个 stride覆盖小、中、大脸scales[1, 2]让每个特征位置有两个尺度候选十几像素的小脸在 stride8 的浅层就有合适的 anchor 接住cls_reg_shareTrue则把分类和回归从两组卷积压成一组小模型的推理延迟对头部 FLOPs 极其敏感这一步省得实在。不共享的话同等主干下头部算力翻倍0.5GF 档位根本塞不进手机实时预算没有双尺度 anchor小脸只能靠更深、更稀疏的特征层漏检率会明显上升。推理端 anchor 缓存同一尺寸只算一次这个机制解决每帧重复计算锚点中心坐标的隐性开销。ONNX 导出默认走动态输入也可固定形状后交给 onnx-simplifier 优化# 固定640x640导出可再经onnx-simplifier优化 python tools/scrfd2onnx.py configs/scrfd/scrfd_2.5g.py model.pth --shape 640 640tools/scrfd2onnx.py 不传--shape时按 640x640 建图并导出动态 shape 的 ONNX传了则输出固定形状文件。Python 推理端 tools/scrfd.py 用center_cache按(高, 宽, stride)做键缓存锚点中心坐标表同一输入尺寸从第二次推理起直接命中不再重建。不缓存的话每帧都要为三层特征图各算一遍 mgrid 坐标数组高频调用时这部分纯浪费的开销会被放大。 规格怎么选五档对号入座下表来自 detection/scrfd/README.md 的 Pretrained-Models 表mAP 为 WIDERFace 单尺度、VGA 分辨率评测Infer 为 640x640 输入的单帧延迟。规格参数量(M)Infer(ms)EasyMediumHardSCRFD_500M0.573.690.5788.1268.51SCRFD_1G0.644.192.3890.5774.80SCRFD_2.5G0.674.293.7892.1677.87SCRFD_10G3.864.995.1693.8783.05SCRFD_34G9.8011.796.0694.9285.29如果你的场景是手机 App 或嵌入式端侧选 SCRFD_500M因为 0.57M 参数、3.6ms 档位延迟是端侧唯一能同时满足实时和占用的选项。如果你的场景是服务器单路实时、精度预算中等选 SCRFD_2.5G因为 Hard 77.87 比 500M 高近 10 个点延迟只多 0.6ms性价比最高。如果你的场景是安防或支付这类高精度离线服务选 SCRFD_10G因为 3.86M 参数换 Hard 83.054.9ms 的延迟在离线链路里完全不构成瓶颈。两个可核对的实测数据点。其一端侧 CPU 单线程AMD Ryzen 9 3950X、OMP_NUM_THREADS1500M 规格在 640x480 输入下 28.3ms降到 320x240 只要 11.4ms——速度不够时先降输入尺寸再考虑换更小模型。其二同条件下 RetinaFace MobileNet-0.25 版本 Hard 精度 47.32、延迟 7.9ms可见 SCRFD 在小档位的精度优势来自算法本身而非参数堆料。 跑通最小路径四步出框# 1. 克隆仓库 git clone https://gitcode.com/GitHub_Trending/in/insightface # 2. 安装推理依赖 pip install onnxruntime opencv-python numpy # 3. 进入推理目录按README的Pretrained-Models表下载 scrfd_2p5gkps.onnx 放到当前目录 cd insightface/detection/scrfd # 4. 运行需准备一张测试图默认读 tests/data/t3.jpg python tools/scrfd.py权重下载位置在 detection/scrfd/README.md 的 Pretrained-Models 表里_KPS后缀的权重带 5 个关键点输出。tools/scrfd.py的__main__里已内置加载、prepare(-1)、detect(img, 0.5)和可视化保存的完整流程照着改图片路径即可。如果卡住了对照三条排查项detect 直接抛 AssertionError→ ONNX 模型导出时固定了 shapedetect()却没传input_size内部断言input_size is not None or self.input_size is not None失败 → 显式传入detect(img, 0.5, input_size(640, 640))。关键点全为空→ 你拿的是不带关键点的权重use_kps由输出头数量自动推断6/10 个输出头无关键点9/15 个才有 → 换_KPS后缀的权重重新下载。框的位置整体偏移或缩放不对→ 在返回结果上又手动除了一次缩放系数 →detect()返回的框已映射回原图坐标系直接使用即可。⚙️ 上生产前三端各一条关键配置CPUONNX Runtime 多核跑法关键配置是在set_providers之外设置intra_op_num_threads等于物理核数。官方单线程数字上表 28.3ms只作基线多线程下同一张 500M 模型能压到一半以下。GPU把 python-package/insightface/model_zoo/scrfd.py 里prepare(ctx_id)走的CPUExecutionProvider换成CUDAExecutionProviderctx_id传 GPU 设备号。注意 SCRFD 本身 FLOPs 不高GPU 上的收益主要在批量并发单帧收益有限。端侧仓库 README 的 Demo 一节列了 ncnn、MNN、TNN 等 C 推理实现参考500M 规格是端侧首选FP16 或 INT8 量化可再压一档延迟。改模型精度前先回归 Hard 子集量化对小脸分数影响比框坐标更敏感。 它在整条链路里的位置SCRFD 是 InsightFace 整条链路的前端输出人脸框和 5 个关键点下游 ArcFace 识别器用这 5 点做仿射对齐把脸摆正到统一姿态再提特征3D 重建模块则直接消费检测框作为输入。框不准后面全歪。两条可直接跑通的路径examples/demo_analysis.py 演示检测 → 对齐 → 识别/属性的完整组装python-package/insightface/app/face_analysis.py 是这套组装方式的库实现。这张多人照片来自 python-package 自带测试数据恰好覆盖近处大脸和侧脸适合当 SCRFD 的首张测试图。⚠️ 边界与延伸SCRFD 适合静态图和逐帧视频对密集小脸和中等遮挡的鲁棒性在同类轻量检测器里算强但对极端侧脸、严重遮挡没有额外保障这类场景需要配合姿态估计或活体检测模块到这儿就该换工具了。想定制自己的 FLOPs 档位从 detection/scrfd/search_tools/ 入手里面是论文中两步网络结构搜索的完整脚本导出细节看 detection/scrfd/tools/scrfd2onnx.py。多档位权重方面_KPS版本与同档非关键点版相比2.5G 规格 Easy 93.80 对 93.78Hard 77.13 对 77.87延迟 4.3ms 对 4.2ms——需要关键点时这个取舍基本无成本精度差不到 1 个点。【免费下载链接】insightfaceState-of-the-art 2D and 3D Face Analysis Project项目地址: https://gitcode.com/GitHub_Trending/in/insightface创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考