4 · RetinaFace 检测器
RetinaFace 是当前最先进的人脸检测器之一,融合了多任务学习与特征金字塔结构。本节深入剖析其核心设计:RetinaFace架构、特征金字塔、SSH模块 以及 关键点回归。
▎RetinaFace 整体架构
RetinaFace 基于 ResNet 或 MobileNet 作为骨干,通过特征金字塔 (FPN) 提取多尺度特征,并在每个金字塔层级附加 SSH 模块与多任务预测头。
▎特征金字塔 (FPN)
RetinaFace 采用自上而下的路径和横向连接,构建 P2 ~ P5 特征金字塔,使浅层细节与深层语义融合。
▎SSH 模块 (Single Stage Head)
SSH 模块通过并行不同膨胀率的卷积层(3×3, 5×5, 7×7)扩大感受野,同时保持计算高效。每个金字塔层级后均附加 SSH。
▎关键点回归 (Landmark Regression)
RetinaFace 同时预测人脸框的 5个关键点(左眼、右眼、鼻尖、左嘴角、右嘴角),使用 Smooth L1 损失进行回归,提升追踪稳定性。
▎组件速览
| 组件 | 作用 | 输出 |
|---|---|---|
| 骨干网络 | 提取基础特征 (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