×

PyTorch教程14.8之基于区域的CNN(R-CNN)

消耗积分:0 | 格式:pdf | 大小:0.27 MB | 2023-06-05

陈伟

分享资料个

除了第 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)。

Girshick等人,2014 年

然后使用 CNN 对每个候选区域执行前向传播以提取其特征。接下来,每个区域提案的特征用于预测该区域提案的类别和边界框。

https://file.elecfans.com/web2/M00/A9/CD/poYBAGR9O8KAMP_vAAQHJgcCVic113.svg

图 14.8.1 R-CNN 模型。

图 14.8.1显示了 R-CNN 模型。更具体地说,R-CNN包括以下四个步骤:

  1. 执行选择性搜索以在输入图像上提取多个高质量区域建议 Uijlings等人,2013 年这些提议的区域通常是在具有不同形状和大小的多个尺度上选择的。每个区域提案都将标有一个类别和一个真实边界框。

  2. 选择一个预训练的 CNN 并在输出层之前截断它。resize每个region proposal到网络需要的输入大小,通过前向传播输出为region proposal提取的特征。

  3. 以每个region proposal的提取特征和标注类别为例。训练多个支持向量机对对象进行分类,其中每个支持向量机单独确定示例是否包含特定类。

  4. 以每个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 )

https://file.elecfans.com/web2/M00/AA/47/pYYBAGR9O8WATfePAAfvq7owwD4432.svg

图 14.8.2快速 R-CNN 模型。

图 14.8.2描述了快速 R-CNN 模型。其主要计算如下:

  1. 与 R-CNN 相比,在快速 R-CNN 中,CNN 用于特征提取的输入是整个图像,而不是单个区域建议。此外,这个 CNN 是可训练的。给定输入图像,让 CNN 输出的形状为 1×c×h1×w1.

  2. 假设选择性搜索生成n区域提案。这些区域提议(不同形状)在 CNN 输出上标记感兴趣区域(不同形状)。然后这些感兴趣的区域进一步提取相同形状的特征(比如高度 h2和宽度w2指定)以便于连接。为了实现这一点,快速 R-CNN 引入了 感兴趣区域 (RoI) 池化层:CNN 输出和区域提议被输入到该层,输出形状的级联特征n×c×h2×w2为所有区域提案进一步提取。

  3. 使用全连接层,将连接的特征转换为形状的输出n×d, 在哪里d取决于模型设计。

  4. 预测每个类别和边界框n区域提案。更具体地说,在类和边界框预测中,将全连接层输出转换为形状的输出 n×q(q是类的数量)和形状的输出n×4, 分别。类别预测使用 softmax 回归。

fast R-CNN 中提出的感兴趣区域池化层与7.5 节中介绍的池化层不同在池化层中,我们通过指定池化窗口、填充和步幅的大小来间接控制输出形状。相反,我们可以直接在感兴趣区域池化层中指定输出形状。

例如,让我们将每个区域的输出高度和宽度指定为h2w2, 分别。对于形状的任何感兴趣区域窗口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。

https://file.elecfans.com/web2/M00/AA/47/pYYBAGR9O8iAF6hzAAC-ikVsQiI293.svg

图 14.8.3 A2×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
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条评论

快来发表一下你的评论吧 !