RetinaNet 分类头和回归头的网络结构分析

发布于:2024-10-13 ⋅ 阅读:(14) ⋅ 点赞:(0)

RetinaNet 是由 Facebook AI Research(FAIR)在 2017 年提出的一种高效的一阶段(one-stage)目标检测算法。相比于两阶段(two-stage)方法,RetinaNet 通过引入 Focal Loss 解决了类别不平衡问题,从而在保持高检测速度的同时,实现了与两阶段方法相媲美的检测精度。

本文将深入解析 RetinaNet 的分类头回归头的网络结构,并详细说明每一层的输入输出尺寸。

RetinaNet 总体架构概述

RetinaNet 主要由以下几个部分组成:

  1. 主干网络(Backbone):通常使用 ResNet(如 ResNet-50 或 ResNet-101)作为特征提取器。
  2. 特征金字塔网络(Feature Pyramid Network, FPN):在主干网络的不同层级生成多尺度的特征图。
  3. 分类头(Classification Head):用于对每个锚框(anchor)进行类别预测。
  4. 回归头(Regression Head):用于对每个锚框进行边界框回归(位置调整)。

下图展示了 RetinaNet 的整体架构、分类头和回归头的结构(图来自于B站up:霹雳吧啦Wz):

在这里插入图片描述
在这里插入图片描述

特征金字塔网络(FPN)

在深入讨论分类头和回归头之前,首先简要介绍 FPN 的输出。FPN 从主干网络的不同层级提取特征,并生成多个尺度的特征图,通常标记为 P3 到 P7,对应不同的下采样率(stride):

  • P3: 下采样率 8,尺寸为 ( H 8 × W 8 × 256 \frac{H}{8} \times \frac{W}{8} \times 256 8H×8W×256 )
  • P4: 下采样率 16,尺寸为 ( H 16 × W 16 × 256 \frac{H}{16} \times \frac{W}{16} \times 256 16H×16W×256 )
  • P5: 下采样率 32,尺寸为 ( H 32 × W 32 × 256 \frac{H}{32} \times \frac{W}{32} \times 256 32H×32W×256 )
  • P6: 下采样率 64,尺寸为 ( H 64 × W 64 × 256 \frac{H}{64} \times \frac{W}{64} \times 256 64H×64W×256)
  • P7: 下采样率 128,尺寸为 ( H 128 × W 128 × 256 \frac{H}{128} \times \frac{W}{128} \times 256 128H×128W×256)

其中,( H ) 和 ( W ) 分别为输入图像的高度和宽度。

分类头和回归头的网络结构

RetinaNet 的分类头和回归头结构基本相同,均由多个卷积层堆叠而成,但在最后的输出层有所不同。以下将分别详细介绍这两个头部的结构及其每一层的输入输出尺寸。

分类头(Classification Head)

分类头的任务是对每个锚框进行类别预测。其结构如下:

  1. 共享卷积层(Shared Convolutional Layers):

    • 层 1: 3x3 卷积,输入通道数 256,输出通道数 256,步幅 1,填充 1
    • 层 2: 3x3 卷积,输入通道数 256,输出通道数 256,步幅 1,填充 1
    • 层 3: 3x3 卷积,输入通道数 256,输出通道数 256,步幅 1,填充 1
    • 层 4: 3x3 卷积,输入通道数 256,输出通道数 256,步幅 1,填充 1

    每一层后均接 ReLU 激活函数。

  2. 分类卷积层(Classification Convolutional Layer):

    • 3x3 卷积,输入通道数 256,输出通道数 ( K × C K \times C K×C ),步幅 1,填充 1

    其中:

    • ( K ) 为每个位置的锚框数量(通常为 9)。
    • ( C ) 为类别数量(不包括背景类)。
  3. 输出层:

    • 最终输出通过 sigmoid 激活函数,生成每个锚框对应的类别概率。

输入输出尺寸示例(以 P3 为例,假设输入尺寸为 ( H 8 × W 8 × 256 \frac{H}{8} \times \frac{W}{8} \times 256 8H×8W×256 ):

层级 输入尺寸 卷积参数 输出尺寸
共享层 1 ( H 8 × W 8 × 256 \frac{H}{8} \times \frac{W}{8} \times 256 8H×8W×256 ) 3x3, stride=1, padding=1, 256 通道 ( H 8 × W 8 × 256 \frac{H}{8} \times \frac{W}{8} \times 256 8H×8W×256 )
ReLU 同上 - -
共享层 2 ( H 8 × W 8 × 256 \frac{H}{8} \times \frac{W}{8} \times 256 8H×8W×256 ) 3x3, stride=1, padding=1, 256 通道 ( H 8 × W 8 × 256 \frac{H}{8} \times \frac{W}{8} \times 256 8H×8W×256 )
ReLU 同上 - -
共享层 3 ( H 8 × W 8 × 256 \frac{H}{8} \times \frac{W}{8} \times 256 8H×8W×256 ) 3x3, stride=1, padding=1, 256 通道 ( H 8 × W 8 × 256 \frac{H}{8} \times \frac{W}{8} \times 256 8H×8W×256 )
ReLU 同上 - -
共享层 4 ( H 8 × W 8 × 256 \frac{H}{8} \times \frac{W}{8} \times 256 8H×8W×256 ) 3x3, stride=1, padding=1, 256 通道 ( H 8 × W 8 × 256 \frac{H}{8} \times \frac{W}{8} \times 256 8H×8W×256 )
ReLU 同上 - -
分类卷积层 ( H 8 × W 8 × 256 \frac{H}{8} \times \frac{W}{8} \times 256 8H×8W×256 ) 3x3, stride=1, padding=1, ( K × C K \times C K×C ) 通道 ( H 8 × W 8 × ( K × C ) \frac{H}{8} \times \frac{W}{8} \times (K \times C) 8H×8W×(K×C) )
Sigmoid 同上 - -

回归头(Regression Head)

回归头的任务是对每个锚框进行边界框回归,预测边界框的偏移量。其结构与分类头基本相同,唯一区别在于最后的输出层。

  1. 共享卷积层(Shared Convolutional Layers):

    • 层 1: 3x3 卷积,输入通道数 256,输出通道数 256,步幅 1,填充 1
    • 层 2: 3x3 卷积,输入通道数 256,输出通道数 256,步幅 1,填充 1
    • 层 3: 3x3 卷积,输入通道数 256,输出通道数 256,步幅 1,填充 1
    • 层 4: 3x3 卷积,输入通道数 256,输出通道数 256,步幅 1,填充 1

    每一层后均接 ReLU 激活函数。

  2. 回归卷积层(Regression Convolutional Layer):

    • 3x3 卷积,输入通道数 256,输出通道数 ( K × 4 K \times 4 K×4 ),步幅 1,填充 1

    其中:

    • ( K ) 为每个位置的锚框数量(通常为 9)。
    • 4 对应边界框的四个偏移量(中心点偏移量 ( t x , t y t_x, t_y tx,ty ),宽度和高度的对数尺度偏移量 ( t w , t h t_w, t_h tw,th )。
  3. 输出层:

    • 最终输出通常不经过激活函数,直接输出回归偏移量。

输入输出尺寸示例(以 P3 为例,假设输入尺寸为 ( H 8 × W 8 × 256 \frac{H}{8} \times \frac{W}{8} \times 256 8H×8W×256 ):

层级 输入尺寸 卷积参数 输出尺寸
共享层 1 ( H 8 × W 8 × 256 \frac{H}{8} \times \frac{W}{8} \times 256 8H×8W×256 ) 3x3, stride=1, padding=1, 256 通道 ( H 8 × W 8 × 256 \frac{H}{8} \times \frac{W}{8} \times 256 8H×8W×256 )
ReLU 同上 - -
共享层 2 ( H 8 × W 8 × 256 \frac{H}{8} \times \frac{W}{8} \times 256 8H×8W×256 ) 3x3, stride=1, padding=1, 256 通道 ( H 8 × W 8 × 256 \frac{H}{8} \times \frac{W}{8} \times 256 8H×8W×256 )
ReLU 同上 - -
共享层 3 ( H 8 × W 8 × 256 \frac{H}{8} \times \frac{W}{8} \times 256 8H×8W×256 ) 3x3, stride=1, padding=1, 256 通道 ( H 8 × W 8 × 256 \frac{H}{8} \times \frac{W}{8} \times 256 8H×8W×256 )
ReLU 同上 - -
共享层 4 ( H 8 × W 8 × 256 \frac{H}{8} \times \frac{W}{8} \times 256 8H×8W×256 ) 3x3, stride=1, padding=1, 256 通道 ( H 8 × W 8 × 256 \frac{H}{8} \times \frac{W}{8} \times 256 8H×8W×256 )
ReLU 同上 - -
回归卷积层 ( H 8 × W 8 × 256 \frac{H}{8} \times \frac{W}{8} \times 256 8H×8W×256 ) 3x3, stride=1, padding=1, ( K × 4 K \times 4 K×4 ) 通道 ( H 8 × W 8 × ( K × 4 ) \frac{H}{8} \times \frac{W}{8} \times (K \times 4) 8H×8W×(K×4) )
无激活函数 同上 - -

注:在此示例中,假设类别数量 ( C = 80 ),则分类卷积层输出通道数为 ( 9 × 80 = 720 9 \times 80 = 720 9×80=720)。

具体示例:以 P3 特征层为例

假设输入图像尺寸为 ( 512 × 512 512 \times 512 512×512 ),则 P3 的尺寸为 ( 64 × 64 × 256 64 \times 64 \times 256 64×64×256 )(即 ( 512 8 × 512 8 × 256 \frac{512}{8} \times \frac{512}{8} \times 256 8512×8512×256 ))。

分类头的层级尺寸

层级 输入尺寸 卷积参数 输出尺寸
共享层 1 64 × 64 × 256 3x3, stride=1, padding=1, 256 通道 64 × 64 × 256
ReLU 64 × 64 × 256 - -
共享层 2 64 × 64 × 256 3x3, stride=1, padding=1, 256 通道 64 × 64 × 256
ReLU 64 × 64 × 256 - -
共享层 3 64 × 64 × 256 3x3, stride=1, padding=1, 256 通道 64 × 64 × 256
ReLU 64 × 64 × 256 - -
共享层 4 64 × 64 × 256 3x3, stride=1, padding=1, 256 通道 64 × 64 × 256
ReLU 64 × 64 × 256 - -
分类卷积层 64 × 64 × 256 3x3, stride=1, padding=1, ( 9 × C 9 \times C 9×C ) 通道 64 × 64 × ( 9C )
Sigmoid 64 × 64 × ( 9C ) - -

回归头的层级尺寸

层级 输入尺寸 卷积参数 输出尺寸
共享层 1 64 × 64 × 256 3x3, stride=1, padding=1, 256 通道 64 × 64 × 256
ReLU 64 × 64 × 256 - -
共享层 2 64 × 64 × 256 3x3, stride=1, padding=1, 256 通道 64 × 64 × 256
ReLU 64 × 64 × 256 - -
共享层 3 64 × 64 × 256 3x3, stride=1, padding=1, 256 通道 64 × 64 × 256
ReLU 64 × 64 × 256 - -
共享层 4 64 × 64 × 256 3x3, stride=1, padding=1, 256 通道 64 × 64 × 256
ReLU 64 × 64 × 256 - -
回归卷积层 64 × 64 × 256 3x3, stride=1, padding=1, ( 9 × 4 9 \times 4 9×4 ) 通道 64 × 64 × 36
无激活函数 64 × 64 × 36 - -

注:在此示例中,假设类别数量 ( C = 80 ),则分类卷积层输出通道数为 ( 9 × 80 = 720 9 \times 80 = 720 9×80=720)。

多尺度特征图的处理

RetinaNet 使用 FPN 生成多个尺度的特征图(P3-P7),每个特征图都会通过独立的分类头和回归头进行处理。因此,对于每个特征图,分类头和回归头的网络结构和层级尺寸类似,只是输入特征图的尺寸不同。

以 P4(下采样率 16,尺寸 ( H 16 × W 16 × 256 \frac{H}{16} \times \frac{W}{16} \times 256 16H×16W×256 ))为例,其分类头和回归头的每一层输入输出尺寸将是 ( H 16 × W 16 × 256 \frac{H}{16} \times \frac{W}{16} \times 256 16H×16W×256 ),最终输出为 ( H 16 × W 16 × ( 9 C ) \frac{H}{16} \times \frac{W}{16} \times (9C) 16H×16W×(9C) )(分类)和 ( H 16 × W 16 × 36 \frac{H}{16} \times \frac{W}{16} \times 36 16H×16W×36 )(回归)。

总结

RetinaNet 的分类头和回归头采用了相同的共享卷积层结构,具体如下:

  • 共享卷积层:4 个 3x3 卷积层,每层 256 个通道,步幅 1,填充 1,后接 ReLU 激活。
  • 输出卷积层
    • 分类头:1 个 3x3 卷积层,输出通道数为 ( K × C K \times C K×C )(通常为 9×类别数),后接 sigmoid 激活函数。
    • 回归头:1 个 3x3 卷积层,输出通道数为 ( K × 4 K \times 4 K×4 )(9×4),不经过激活函数。

每个特征图(P3-P7)都会独立地通过分类头和回归头进行处理,从而实现多尺度的目标检测。

疑问

我在思考检测头的结构时,曾经问过一个现在看来可笑的问题:我觉得检测头的输出应该是 1 × 1 × 9 C 1\times1\times9C 1×1×9C,这样9C个通道,就是9C个数值,代表了每一种框被分类为每一类的概率,可为什么检测头的输出是 ( H 8 × W 8 × 256 \frac{H}{8} \times \frac{W}{8} \times 256 8H×8W×256 )呢?

Answer: 如果分类头的输出是 1 × 1 × 9 C 1\times1\times9C 1×1×9C,这意味着整个特征图只生成一个锚框的分类概率,这与 RetinaNet 的设计理念不符。RetinaNet 需要在图像的每一个空间位置上预测多个锚框,以便覆盖不同的位置和尺度的目标。所以实际上,该层特征图的尺寸是 H 8 × W 8 \frac{H}{8} \times \frac{W}{8} 8H×8W ,一共有 H 8 × W 8 \frac{H}{8} \times \frac{W}{8} 8H×8W这么多个像素,每个像素都要预测9个anchor属于某一类别的概率。(我的疑问完全是因为自己格局小了)