OpenCV人脸检测框稳定追踪实战 - 第4节

4. RetinaFace检测器

RetinaFace 是当前最先进的人脸检测器之一,融合了多任务学习与特征金字塔结构。本节深入剖析其核心设计:RetinaFace架构、特征金字塔、SSH模块 以及 关键点回归。

▎RetinaFace 整体架构

RetinaFace 基于 ResNet 或 MobileNet 作为骨干,通过特征金字塔 (FPN) 提取多尺度特征,并在每个金字塔层级附加 SSH 模块与多任务预测头。

Backbone ResNet / MobileNet C2, C3, C4, C5 特征金字塔 P2 (高分辨率) P3 P4 P5 (低分辨率) 自上而下 & 横向连接 SSH 模块 上下文增强 3×3 卷积 5×5 卷积 7×7 卷积 多尺度感受野 预测头 分类 (cls) 框回归 (box) 关键点 (5pts) + 置信度

▎特征金字塔 (FPN)

RetinaFace 采用自上而下的路径和横向连接,构建 P2 ~ P5 特征金字塔,使浅层细节与深层语义融合。

C5 C4 C3 P5 P4 P3 上采样 + 横向连接 P2

▎SSH 模块 (Single Stage Head)

SSH 模块通过并行不同膨胀率的卷积层(3×3, 5×5, 7×7)扩大感受野,同时保持计算高效。每个金字塔层级后均附加 SSH。

输入特征 P3 / P4 / P5 3×3 卷积 5×5 卷积 7×7 卷积 特征融合 Concat + 1×1

▎关键点回归 (Landmark Regression)

RetinaFace 同时预测人脸框的 5个关键点(左眼、右眼、鼻尖、左嘴角、右嘴角),使用 Smooth L1 损失进行回归,提升追踪稳定性。

左眼 右眼 鼻尖 左嘴角 右嘴角 检测框 + 5点回归

▎组件速览

组件作用输出
骨干网络提取基础特征 (C2~C5)多尺度特征图
特征金字塔 (FPN)融合高低层语义P2~P5 特征
SSH 模块多感受野上下文增强增强特征
分类头人脸/背景二分类置信度分数
框回归头边界框偏移4个坐标
关键点头5个面部关键点10个坐标值

▎PyTorch 风格伪代码

# RetinaFace 检测头示意 (简化)
class RetinaFaceHead(nn.Module):
    def __init__(self, in_channels):
        super().__init__()
        # SSH 模块:3×3, 5×5, 7×7 并行
        self.conv3 = nn.Conv2d(in_channels, 256, 3, padding=1)
        self.conv5 = nn.Conv2d(in_channels, 256, 5, padding=2)
        self.conv7 = nn.Conv2d(in_channels, 256, 7, padding=3)
        self.fusion = nn.Conv2d(256*3, 256, 1)
        # 预测分支
        self.cls_head = nn.Conv2d(256, 2, 1)          # 人脸/背景
        self.box_head = nn.Conv2d(256, 4, 1)          # 边界框
        self.landmark_head = nn.Conv2d(256, 10, 1)    # 5关键点

    def forward(self, x):
        # SSH 前向
        x3 = self.conv3(x)
        x5 = self.conv5(x)
        x7 = self.conv7(x)
        x = torch.cat([x3, x5, x7], dim=1)
        x = self.fusion(x)
        # 多任务输出
        cls = self.cls_head(x)
        box = self.box_head(x)
        lm = self.landmark_head(x)
        return cls, box, lm