除了第 14.7 节中描述的单次多框检测之外,基于区域的 CNN 或具有 CNN 特征的区域 (R-CNN) 也是将深度学习应用于对象检测的许多开创性方法之一 (Girshick等人,2014 年)。在本节中,我们将介绍 R-CNN 及其一系列改进:fast R-CNN ( Girshick, 2015 )、faster R-CNN ( Ren et al. , 2015 )和掩模 R-CNN ( He等,2017)。由于篇幅有限,我们将只关注这些模型的设计。
14.8.1。R-CNN
R -CNN首先从输入图像中提取许多(例如,2000 个)region proposals (例如,anchor boxes 也可以被认为是 region proposals),标记它们的类别和边界框(例如,offsets)。
然后使用 CNN 对每个候选区域执行前向传播以提取其特征。接下来,每个区域提案的特征用于预测该区域提案的类别和边界框。
图 14.8.1显示了 R-CNN 模型。更具体地说,R-CNN包括以下四个步骤:
-
执行选择性搜索以在输入图像上提取多个高质量区域建议 (Uijlings等人,2013 年)。这些提议的区域通常是在具有不同形状和大小的多个尺度上选择的。每个区域提案都将标有一个类别和一个真实边界框。
-
选择一个预训练的 CNN 并在输出层之前截断它。resize每个region proposal到网络需要的输入大小,通过前向传播输出为region proposal提取的特征。
-
以每个region proposal的提取特征和标注类别为例。训练多个支持向量机对对象进行分类,其中每个支持向量机单独确定示例是否包含特定类。
-
以每个region proposal的提取特征和标注bounding box为例。训练线性回归模型来预测地面实况边界框。
尽管 R-CNN 模型使用预训练的 CNNs 来有效地提取图像特征,但速度很慢。想象一下,我们从单个输入图像中选择了数千个区域建议:这需要数千个 CNN 前向传播来执行对象检测。这种庞大的计算负载使得在实际应用中广泛使用 R-CNN 变得不可行。
14.8.2。快速 R-CNN
R-CNN 的主要性能瓶颈在于每个 region proposal 的独立 CNN 前向传播,没有共享计算。由于这些区域通常有重叠,独立的特征提取会导致大量重复计算。Fast R-CNN相比 R-CNN的主要改进之一是 CNN 前向传播仅在整个图像上进行 ( Girshick, 2015 )。
图 14.8.2描述了快速 R-CNN 模型。其主要计算如下:
-
与 R-CNN 相比,在快速 R-CNN 中,CNN 用于特征提取的输入是整个图像,而不是单个区域建议。此外,这个 CNN 是可训练的。给定输入图像,让 CNN 输出的形状为 1×c×h1×w1.
-
假设选择性搜索生成n区域提案。这些区域提议(不同形状)在 CNN 输出上标记感兴趣区域(不同形状)。然后这些感兴趣的区域进一步提取相同形状的特征(比如高度 h2和宽度w2指定)以便于连接。为了实现这一点,快速 R-CNN 引入了 感兴趣区域 (RoI) 池化层:CNN 输出和区域提议被输入到该层,输出形状的级联特征n×c×h2×w2为所有区域提案进一步提取。
-
使用全连接层,将连接的特征转换为形状的输出n×d, 在哪里d取决于模型设计。
-
预测每个类别和边界框n区域提案。更具体地说,在类和边界框预测中,将全连接层输出转换为形状的输出 n×q(q是类的数量)和形状的输出n×4, 分别。类别预测使用 softmax 回归。
fast R-CNN 中提出的感兴趣区域池化层与7.5 节中介绍的池化层不同。在池化层中,我们通过指定池化窗口、填充和步幅的大小来间接控制输出形状。相反,我们可以直接在感兴趣区域池化层中指定输出形状。
例如,让我们将每个区域的输出高度和宽度指定为h2和w2, 分别。对于形状的任何感兴趣区域窗口h×w, 这个窗口被分为 h2×w2子窗口的网格,其中每个子窗口的形状大约是(h/h2)×(w/w2). 在实际应用中,任何一个子窗口的高和宽都要向上取整,最大的元素作为子窗口的输出。因此,即使感兴趣区域具有不同的形状,感兴趣区域池化层也可以提取相同形状的特征。
作为说明性示例,在图 14.8.3中,左上角 3×3感兴趣的区域被选择在4×4 输入。对于这个感兴趣的区域,我们使用2×2感兴趣区域池化层以获得2×2输出。请注意,四个划分的子窗口中的每一个都包含元素 0、1、4 和 5(5 是最大值);2 和 6(6 是最大值);8 和 9(9 是最大值);和 10。
下面我们演示感兴趣区域池化层的计算。假设CNN提取的特征的高和宽 X
都是4,并且只有一个通道。
让我们进一步假设输入图像的高度和宽度均为 40 像素,并且选择性搜索在该图像上生成两个区域建议。每个区域建议由五个元素表示:其对象类,后跟(x,y)- 其左上角和右下角的坐标。
rois = torch.Tensor([[0
评论
查看更多