ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

SCRFD 人脸检测:0.67M 参数、4.2ms,InsightFace 里这个轻量检测器怎么做到的

SCRFD 人脸检测:0.67M 参数、4.2ms,InsightFace 里这个轻量检测器怎么做到的 SCRFD 人脸检测0.67M 参数、4.2msInsightFace 里这个轻量检测器怎么做到的【免费下载链接】insightfaceState-of-the-art 2D and 3D Face Analysis Project项目地址: https://gitcode.com/GitHub_Trending/in/insightfaceSCRFD 是 InsightFace 仓库中最实用的轻量级人脸检测模块基于 ONNX 推理单张 VGA 图像只要 4.2ms0.67M 参数的 2.5GF 版本在 WIDER Face 三个子集上全面超过 RetinaFace。如果你要落地实时人脸检测这篇文章讲清楚它凭什么快、最小推理流程怎么写、哪个规格适合你以及生产环境里几个真实的坑。先回答够不够用WIDER Face 上的精度-速度权衡SCRFD 的评测数据都写在 detection/scrfd/README.md 里精度、FLOPs、推理耗时统一在 VGA 分辨率下测得这是对比各检测器时最可信的口径。预训练模型部分给出的规格如下规格Params(M)FLOPsWIDER EasyMediumHardInfer(ms)SCRFD_500M0.570.5G90.5788.1268.513.6SCRFD_2.5G0.672.5G93.7892.1677.874.2SCRFD_10G3.8610G95.1693.8783.054.9两个值得注意的信号Hard 子集才是分水岭。RetinaFaceMobileNet 0.25在 Hard 上只有 47.32SCRFD_500M 拉到 68.51小脸和遮挡场景的提升全部体现在这里。所以如果你的业务涉及多人合影、远距离监控至少用 2.5G 版本。速度差异主要看 FLOPs 而不是参数量。500M 到 10G 参数量涨了 6 倍多耗时只从 3.6ms 到 4.9ms说明计算量被压得很低瓶颈在 CPU 访存而非模型容量。README 还给了 0.5G 版在 Ryzen 9 3950X 上单线程OMP_NUM_THREADS1、无 mkldnn的实测640x480 输入 28.3msOriginal-Size 输入时 Hard 能到 82.03——原始分辨率输入对小脸更友好代价是耗时这个取舍后面会再提。多人室内合影正是 Hard 子集那类场景人脸尺度差异大、有低头侧脸。这类图片是检验一个检测器小脸召回率最直接的素材。最小可运行推理流程推理参考实现在 detection/scrfd/tools/scrfd.py它用 onnxruntime 加载 ONNX 模型自己实现了 blob 归一化、距离解码distance2bbox和 NMS。跑通的最短路径如下模型从 README 的 Pretrained-Models 表下载2.5G 带关键点版 SCRFD_2.5G_KPS# 来源: detection/scrfd/tools/scrfd.py import cv2, onnxruntime from detection.scrfd.tools.scrfd import SCRFD det SCRFD(model_filescrfd_2.5gkps.onnx) det.prepare(-1) # ctx_id0 表示 CPUExecutionProvider img cv2.imread(group.jpg) bboxes, kpss det.detect(img, 0.5, input_size(640, 640)) # bboxes: [x1,y1,x2,y2,score]; kpss: 5 个关键点(眼睛/鼻尖/嘴角), 无 KPS 版为 None调用链只有四步构造 session、选 provider、读图、detect。输入图像内部会自动做 keep-ratio 缩放并 pad 到input_size输出的框已经映射回原图坐标不需要自己算逆变换。几个容易踩的坑都是从这个脚本的实现细节里看出来的动态输入要显式给input_size。tools/scrfd2onnx.py导出的 ONNX 默认是动态输入此时必须传input_size否则detect里的断言直接失败。想省一次网络往返可以用--shape 640 640导出固定尺寸模型再交给 onnx-simplifier 优化。pad 区域会引入边界假框。detect把缩放后的图放进左上角、右下角留黑边黑边区域偶尔会出低分框。thresh传 0.5 基本可以滤掉如果追求高召回把阈值压到 0.2 以下记得把边界框丢弃或收紧nms_thresh。选对 KPS 版本。输出张量个数6/9/10/15决定模型是否带关键点、走 3 层还是 5 层 FPN。后续要做人脸对齐、注册识别直接选_KPS版2.5G_KPS 比 2.5G 多 0.15M 参数Hard 精度 77.13 vs 77.87几乎无损。阈值口径别混。test_widerface.py评测用score_thr0.02demo 用 0.5nms的 IoU 阈值默认 0.45。同一张图两种阈值结果差异很大对账时先确认口径。0.67MB 模型怎么塞进端侧先澄清一个常见的单位混淆README 里 0.67 是参数量M不是文件大小。2.5G 版 ONNXfp32实际下载下来约 2.7MB量化后更小。这个量级意味着它可以直接打进手机 APP 的安装包也可以放进 Web 端 WASM 推理——仓库 README 的 Demo 一节列了 ncnn、MNN、TNN、ONNXRuntime 的 C 移植端侧部署基本不用自己写前处理。端侧的两个实操建议输入尺寸按业务选。prepare之后的detect接受任意input_size。小脸密集场景监控、街景用 640x640 甚至更高单人脸刷脸场景 320x320 足够耗时近似按面积缩放0.5G 版在 320x240 下单线程 11.4msREADME 实测。GPU 服务侧直接转 TensorRT。trtexec --onnxscrfd_2.5g.onnx --saveEnginescrfd_2.5g.trt --fp16一条命令fp16 对精度影响很小延迟还能再压一截。多实例并发时建议每线程一个InferenceSessiononnxruntime 的 session 本身不是为高频多线程共享设计的。为什么它能又快又准三个设计点这部分点到为止细节看 configs/scrfd/scrfd_2.5g.py多尺度锚点AnchorGenerator配base_sizes[16,64,256]、strides[8,16,32]、每层 2 个 scale相当于给不同焦段各配一台镜头——stride 8 那层负责几十像素的小脸stride 32 那层负责大脸不用一套锚框硬扛全尺度。PAFPN 颈部in_channels[24,48,48,80]压到out_channels24通道数小特征融合开销低这也是 FLOPs 能压到 2.5G 的关键。ATSS 样本分配assignerdict(typeATSSAssigner, topk9)按局部统计量动态挑正样本替代固定 IoU 阈值训练配置里allowed_border-1、pos_weight-1就是配套写法。值得一提的是这些规格不是调出来的是搜出来的仓库search_tools/里保留了两阶段网络搜索的完整流程先生成 64 个候选 backbone 配置训练 80 轮按 WIDER Hard mAP 选优再以最优者为模板做整体搜索detection/scrfd/search_tools/ 可以直接照着复现。这解释了为什么参数量和 FLOPs 能卡得这么整。上图展示了检测框之上的完整分析链路关键点、眼开合、活体、口罩、年龄性别。SCRFD 输出的 bbox 加 KPS 就是这一整条链路的入口——python-package/insightface/ 里的app/face_analysis.py把检测、对齐、识别、属性串在一起做完检测之后的事不用自己接。最后收一个判断单人实时场景选 0.5G3.6ms多人/小脸密集选 2.5G离线高精度再上 10G对 Hard 子集精度有硬指标的话记得优先验证原始分辨率输入的效果README 里 82.03 vs 68.51 的差距说明输入尺寸本身就是你手里最大的调优旋钮。【免费下载链接】insightfaceState-of-the-art 2D and 3D Face Analysis Project项目地址: https://gitcode.com/GitHub_Trending/in/insightface创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表