14.8. 区域卷积神经网络(R-CNN)¶ 在 SageMaker Studio Lab 中打开 Notebook
除了在 第 14.7 节中描述的单发多框检测之外,基于区域的CNN(区域CNN或R-CNN)也是将深度学习应用于目标检测的开创性方法之一 (Girshick et al., 2014)。本节将介绍R-CNN及其一系列改进:快速R-CNN (Girshick, 2015)、更快R-CNN (Ren et al., 2015)和掩码R-CNN (He et al., 2017)。由于篇幅有限,我们将只重点介绍这些模型的设计。
14.8.1. R-CNN¶
R-CNN首先从输入图像中提取许多(例如2000个)区域提议(例如,锚框也可以被视为区域提议),标记它们的类别和边界框(例如,偏移量)。
然后,使用一个CNN对每个区域提议进行前向传播以提取其特征。接下来,使用每个区域提议的特征来预测该区域提议的类别和边界框。
图 14.8.1 R-CNN模型。¶
图 14.8.1展示了R-CNN模型。更具体地说,R-CNN包括以下四个步骤:
对输入图像执行选择性搜索以提取多个高质量的区域提议 (Uijlings et al., 2013)。这些提议的区域通常在多个尺度上以不同的形状和大小被选择。每个区域提议都将被标记上类别和真实边界框。
选择一个预训练的CNN,并在输出层之前截断它。将每个区域提议调整为网络所需的输入大小,并通过前向传播输出为该区域提议提取的特征。
以每个区域提议的提取特征和标记类别为样本。训练多个支持向量机来对物体进行分类,其中每个支持向量机独立地确定样本是否包含特定类别。
以每个区域提议的提取特征和标记边界框为样本。训练一个线性回归模型来预测真实边界框。
尽管R-CNN模型使用预训练的CNN有效地提取图像特征,但它的速度很慢。想象一下,我们从单个输入图像中选择了数千个区域提议:这需要数千次CNN前向传播来执行目标检测。这种巨大的计算负载使得R-CNN在实际应用中难以广泛使用。
14.8.2. 快速 R-CNN¶
R-CNN的主要性能瓶颈在于为每个区域提议进行独立的CNN前向传播,而不共享计算。由于这些区域通常有重叠,独立的特征提取导致了大量的重复计算。快速R-CNN相对于R-CNN的一个主要改进是,CNN的前向传播仅在整个图像上执行一次 (Girshick, 2015)。
图 14.8.2 快速 R-CNN 模型。¶
图 14.8.2 描述了快速 R-CNN 模型。其主要计算过程如下:
与R-CNN相比,在快速R-CNN中,用于特征提取的CNN的输入是整个图像,而不是单个区域提议。此外,这个CNN是可训练的。给定一个输入图像,设CNN输出的形状为 \(1 \times c \times h_1 \times w_1\)。
假设选择性搜索生成了 \(n\) 个区域提议。这些区域提议(形状不同)在CNN输出上标记出感兴趣区域(形状也不同)。然后,这些感兴趣区域进一步提取相同形状(比如指定高度 \(h_2\) 和宽度 \(w_2\))的特征,以便于连接。为实现这一点,快速R-CNN引入了感兴趣区域(RoI)池化层:将CNN输出和区域提议输入到该层,输出为所有区域提议提取的、形状为 \(n \times c \times h_2 \times w_2\) 的连接特征。
使用一个全连接层,将连接后的特征转换为形状为 \(n \times d\) 的输出,其中 \(d\) 取决于模型设计。
预测 \(n\) 个区域提议中每一个的类别和边界框。更具体地说,在类别和边界框预测中,将全连接层的输出分别转换为形状为 \(n \times q\)(\(q\) 是类别数)的输出和形状为 \(n \times 4\) 的输出。类别预测使用softmax回归。
快速R-CNN中提出的感兴趣区域池化层不同于我们在 第 7.5 节中介绍的池化层。在池化层中,我们通过指定池化窗口、填充和步幅的大小来间接控制输出形状。相比之下,我们可以在感兴趣区域池化层中直接指定输出形状。
例如,让我们将每个区域的输出高度和宽度分别指定为 \(h_2\) 和 \(w_2\)。对于任何形状为 \(h \times w\) 的感兴趣区域窗口,该窗口被划分为一个 \(h_2 \times w_2\) 的子窗口网格,其中每个子窗口的形状近似为 \((h/h_2) \times (w/w_2)\)。在实践中,任何子窗口的高度和宽度都应向上取整,并使用最大元素作为子窗口的输出。因此,即使感兴趣区域的形状不同,感兴趣区域池化层也可以提取出相同形状的特征。
举一个说明性的例子,在 图 14.8.3 中,在一个 \(4 \times 4\) 的输入上选择了左上角的 \(3\times 3\) 感兴趣区域。对于这个感兴趣区域,我们使用一个 \(2\times 2\) 的感兴趣区域池化层来获得一个 \(2\times 2\) 的输出。请注意,四个划分的子窗口分别包含元素0、1、4和5(5是最大值);2和6(6是最大值);8和9(9是最大值);以及10。
图 14.8.3 一个 \(2\times 2\) 的感兴趣区域池化层。¶
下面我们演示感兴趣区域池化层的计算。假设CNN提取的特征 X
的高度和宽度均为4,并且只有一个通道。
import torch
import torchvision
X = torch.arange(16.).reshape(1, 1, 4, 4)
X
tensor([[[[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.],
[12., 13., 14., 15.]]]])
from mxnet import np, npx
npx.set_np()
X = np.arange(16).reshape(1, 1, 4, 4)
X
[22:09:37] ../src/storage/storage.cc:196: Using Pooled (Naive) StorageManager for CPU
array([[[[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.],
[12., 13., 14., 15.]]]])
我们进一步假设输入图像的高度和宽度都是40像素,并且选择性搜索在该图像上生成了两个区域提议。每个区域提议表示为五个元素:其对象类别,后跟其左上角和右下角的 \((x, y)\) 坐标。
rois = torch.Tensor([[0, 0, 0, 20, 20], [0, 0, 10, 30, 30]])
rois = np.array([[0, 0, 0, 20, 20], [0, 0, 10, 30, 30]])
因为 X
的高度和宽度是输入图像高度和宽度的 \(1/10\),所以根据指定的 spatial_scale
参数,两个区域提议的坐标乘以0.1。然后,这两个感兴趣区域在 X
上被标记为 X[:, :, 0:3, 0:3]
和 X[:, :, 1:4, 0:4]
。最后,在 \(2\times 2\) 的感兴趣区域池化中,每个感兴趣区域被划分为一个子窗口网格,以进一步提取相同形状 \(2\times 2\) 的特征。
torchvision.ops.roi_pool(X, rois, output_size=(2, 2), spatial_scale=0.1)
tensor([[[[ 5., 6.],
[ 9., 10.]]],
[[[ 9., 11.],
[13., 15.]]]])
npx.roi_pooling(X, rois, pooled_size=(2, 2), spatial_scale=0.1)
array([[[[ 5., 6.],
[ 9., 10.]]],
[[[ 9., 11.],
[13., 15.]]]])
14.8.3. 更快 R-CNN¶
为了在目标检测中更准确,快速 R-CNN 模型通常需要在选择性搜索中生成大量的区域提议。为了在不损失准确性的情况下减少区域提议,更快 R-CNN 提出了用区域提议网络来取代选择性搜索 (Ren et al., 2015)。
图 14.8.4 更快 R-CNN 模型。¶
图 14.8.4 展示了更快R-CNN模型。与快速R-CNN相比,更快R-CNN仅将区域提议方法从选择性搜索改为区域提议网络。模型的其余部分保持不变。区域提议网络按以下步骤工作:
使用一个填充为1的 \(3\times 3\) 卷积层将CNN的输出转换为一个具有 \(c\) 个通道的新输出。这样,CNN提取的特征图空间维度上的每个单元都得到一个长度为 \(c\) 的新特征向量。
以特征图的每个像素为中心,生成多个不同尺度和宽高比的锚框并进行标记。
使用每个锚框中心的长度为 \(c\) 的特征向量,预测该锚框的二元类别(背景或物体)和边界框。
考虑那些预测类别为物体的预测边界框。使用非极大值抑制移除重叠的结果。剩余的物体预测边界框就是感兴趣区域池化层所需的区域提议。
值得注意的是,作为更快R-CNN模型的一部分,区域提议网络与模型的其余部分联合训练。换句话说,更快R-CNN的目标函数不仅包括目标检测中的类别和边界框预测,还包括区域提议网络中锚框的二元类别和边界框预测。由于端到端的训练,区域提议网络学会了如何生成高质量的区域提议,从而在减少从数据中学到的区域提议数量的情况下,保持目标检测的准确性。
14.8.4. 掩码 R-CNN¶
在训练数据集中,如果图像上还标记了物体的像素级位置,掩码 R-CNN 可以有效地利用这些详细的标签来进一步提高目标检测的准确性 (He et al., 2017)。
图 14.8.5 掩码 R-CNN 模型。¶
如 图 14.8.5 所示,掩码 R-CNN 是在更快 R-CNN 的基础上修改而来的。具体来说,掩码 R-CNN 将感兴趣区域池化层替换为*感兴趣区域(RoI)对齐*层。这个感兴趣区域对齐层使用双线性插值来保留特征图上的空间信息,这更适合于像素级预测。该层的输出包含所有感兴趣区域的相同形状的特征图。它们不仅用于预测每个感兴趣区域的类别和边界框,还通过一个额外的全卷积网络来预测物体的像素级位置。关于使用全卷积网络预测图像像素级语义的更多细节将在本章的后续章节中提供。
14.8.5. 小结¶
R-CNN从输入图像中提取许多区域提议,使用CNN对每个区域提议进行前向传播以提取其特征,然后使用这些特征来预测该区域提议的类别和边界框。
快速R-CNN相对于R-CNN的一个主要改进是,CNN的前向传播仅在整个图像上执行一次。它还引入了感兴趣区域池化层,这样即使感兴趣区域的形状不同,也可以为其提取相同形状的特征。
更快R-CNN用一个联合训练的区域提议网络取代了快速R-CNN中使用的选择性搜索,这样前者可以在减少区域提议数量的情况下保持目标检测的准确性。
在更快 R-CNN 的基础上,掩码 R-CNN 额外引入了一个全卷积网络,从而利用像素级标签来进一步提高目标检测的准确性。
14.8.6. 练习¶
我们能否将目标检测构建为一个单一的回归问题,例如预测边界框和类别概率?你可以参考YOLO模型的设计 (Redmon et al., 2016)。
比较单发多框检测与本节介绍的方法。它们的主要区别是什么?你可以参考 Zhao et al. (2019) 的图2。