在2026年的今天,提到高性能的人脸检测,Insight Face 绝对是绕不开的名字。这个在2019年横空出世的模型,凭借Deformable Convolution和Dense Regression Loss,当年就在WiderFace数据集上拿下了SOTA(State-of-the-Art)的成绩。虽然现在原版的完整模型还没完全开源,但社区里那个基于RetinaNet改进的简化版,因为加了SSH检测模块,精度提升明显,成了实战中的香饽饽。
咱们今天重点聊的,就是那个轻量化的mnet版本。它的底子其实是RetinaNet,用了特征金字塔(FPN)技术,能把不同尺度的特征融合起来,这对检测小人脸特别管用。
它和原版RetinaNet最大的区别在哪?除了主干网络换成了更轻量的MobileNet,核心就在于检测模块。它把SSH网络的检测模块给加了进来。这个SSH模块里有个“上下文模块”,作用是啥?简单说就是扩张预检测区域的上下文信息,让模型“看”得更宽。这个上下文模块再和卷积层一叠加,就组成了最终的分类头和回归头。
更牛的是,这个mnet网络在检测的同时,还能做多任务学习。除了常规的分类和回归,它还额外加了5个目标点的回归任务。当然,这玩意儿是活的,你后续完全可以改成AFLW里的21个点,或者常用的68点、106点,扩展性很强。
跑检测的时候,流程和常见的单阶段检测器差不多。在GitHub的retinaface.py里,detect()函数是核心。这里有几个参数你得调好:threshold(分类概率阈值,超过就算正例)、nms_threshold(非极大值抑制的IOU阈值)还有scale(图像金字塔缩放值)。
说到Anchor,这可是Insight Face的精髓。简化版在特征金字塔上有3个检测分支,对应的stride分别是32、16和8。
默认设置下,每个stride对应一个ratio,每个ratio对应两个scale。咱们算笔账:假设输入图片是640×640。
加起来,一张图就能生成16800个Anchor!这么多框,就是为了保证不管人脸多大,总有一个框能套得住。
训练的时候,数据增强是必修课。开源版代码里,为了保持输入一致,用了Crop(裁剪)的方式。所有图片都会被强制缩放到640×640×3。
这里有个细节:代码里有个PRE_SCALES = [0.3, 0.45, 0.6, 0.8, 1.0]。每张图片会随机选一个比例进行缩放。比如选了0.3,图片短边就会变成640/0.3 ≈ 2133。缩放完再随机裁剪出640×640的区域。
Label的制作是最烧脑的。核心逻辑是看Anchor和真实框(GT Box)的IOU(交并比)。
因为一张图里人脸有限,但Anchor有一万多个,所以大部分Anchor都是负例。为了解决正负样本不均衡,RetinaNet用了Focal Loss,这里就不展开了。
对于正例Anchor,不仅要算分类Loss,还要算回归Loss。回归的目标是中心点坐标的相对距离(dx, dy)和长宽比的对数(dw, dh)。关键点(Landmark)也是同理,算的是相对于检测框中心的偏移量。负例Anchor不参与回归Loss的计算,权重直接置0。
想在2026年的复杂场景下保持高精度,单尺度测试肯定不够看。Insight Face沿用了经典的“图像金字塔”策略,也就是Multi-scale Testing。
测试时,你可以定义target_size(短边长度)和max_size(长边最大长度)。
target_size,只要长边不超max_size,就按短边缩放。target_size可以设为[500, 800, 1100, 1400, 1700]。这意味着同一张图会被缩放成5种不同的大小,分别送入网络检测。最后把所有尺度的检测结果汇总,再做一次NMS。虽然速度慢点,但精度提升是实打实的。S3FD、SRN这些模型都在用这招。

最后聊聊实战。很多同学跑不通代码,多半是参数没设对。
anchor_cfg是写死的,如果你的应用场景人脸特别小(比如监控场景),可能需要把Stride 8对应的Scales再调小一点,比如改成(1, 0.5)。总之,Insight Face这个简化版mnet,结构清晰,效果能打。只要把Anchor生成和Label匹配的逻辑搞懂,你自己改改网络结构、换换主干,也能训练出适合自己业务的高精度模型。
武汉格发信息技术有限公司,格发许可优化管理系统可以帮你评估贵公司软件许可的真实需求,再低成本合规性管理软件许可,帮助贵司提高软件投资回报率,为软件采购、使用提供科学决策依据。支持的软件有: CAD,CAE,PDM,PLM,Catia,Ugnx, AutoCAD, Pro/E, Solidworks 等。