<hr> 前言
欢迎来到“从代码学习深度学习”系列博客!在盘算机视觉范畴,目的检测是一个焦点使命,它不但要求我们识别图像中的物体,还需要定位它们的位置。地区卷积神经网络(Region-based Convolutional Neural Networks, R-CNN)及厥后续改进版本(Fast R-CNN, Faster R-CNN, Mask R-CNN)是办理这一题目的里程碑式工作。它们渐渐提高了目的检测的正确性和效率,并扩展到实例分割等更复杂的使命。
本篇博客将带你回顾 R-CNN 系列模子的发展历程,并通过 PyTorch 代码示例(重点在爱好地区汇聚层)来明确其焦点组件的工作原理。我们将从最初的 R-CNN 开始,渐渐探索其改进版本,明确它们是如何办理前代模子的瓶颈,并引入新的创新思想的。
完整代码:下载链接
R-CNN
R-CNN (Regions with CNN features) 是将深度学习应用于目的检测范畴的开创性工作之一。它的焦点思想是利用卷积神经网络(CNN)提取地区特性,从而进行目的分类和定位。
R-CNN 的第一步是从整张图像中挑选出大概包含物体的小地区,称为“候选地区”或“发起地区”(region proposals)。这些地区是由 Selective Search 这类算法选出来的,不是通过滑动窗口或CNN直接得到的。数量大约为2000个。(注:锚框是Faster R-CNN等后续方法的技能,R-CNN并不使用锚框。)R-CNN通过先选出大概含目的的图像地区,对这些地区单独用CNN提取特性,再用这些特性去判定目的种类和更精准的位置。
上图展示了R-CNN模子。具体来说,R-CNN包括以下四个步调:
- 对输入图像使用_选择性搜索_(Selective Search)来选取多个高质量的发起地区。这些发起地区通常是在多个尺度下选取的,并具有差别的形状和巨细。每个发起地区都将被标注种别和真实边界框。
- 选择一个预训练的卷积神经网络,并将其在输出层之前截断。将每个发起地区变形为网络需要的输入尺寸,并通过前向传播输出抽取的发起地区特性。
- 将每个发起地区的特性连同其标注的种别作为一个样本。训练多个支持向量机(SVM)对目的分类,此中每个支持向量机用来判定样本是否属于某一个种别。
- 将每个发起地区的特性连同其标注的边界框作为一个样本,训练线性回归模子来预测真实边界框。
尽管R-CNN模子通过预训练的卷积神经网络有效地抽取了图像特性,但它的速度很慢。因为大概从一张图像中选出上千个发起地区,这需要上千次的卷积神经网络的前向传播来实行目的检测。这种庞大的盘算量使得R-CNN在实际世界中难以被广泛应用。
Fast R-CNN
针对 R-CNN 的速度瓶颈,Fast R-CNN 提出了关键改进。R-CNN的重要性能瓶颈在于,对每个发起地区,卷积神经网络的前向传播是独立的,而没有共享盘算。由于这些地区通常有重叠,独立的特性抽取会导致重复的盘算。Fast R-CNN 对R-CNN的重要改进之一,是仅在整张图象上实行卷积神经网络的前向传播。
上图中描述了Fast R-CNN模子。它的重要盘算如下:
- 与R-CNN相比,Fast R-CNN用来提取特性的卷积神经网络的输入是整个图像,而不是各个发起地区。此外,这个网络通常会到场训练。设输入为一张图像,将卷积神经网络的输出的形状记为1×c×h1×w1。
- 假设选择性搜索天生了n个发起地区。这些形状各异的发起地区在卷积神经网络的输出上分别标出了形状各异的爱好地区。然后,这些感爱好的地区需要进一步抽取出形状相同的特性(比如指定高度h2和宽度w2),以便于连结后输出。为了实现这一目的,Fast R-CNN引入了_爱好地区汇聚层_(RoI pooling):将卷积神经网络的输出和发起地区作为输入,输出连结后的各个发起地区抽取的特性,形状为n×c×h2×w2。
- 通过全连接层将输出形状变更为n×d,此中超参数d取决于模子设计。
- 预测n个发起地区中每个地区的种别和边界框。更具体地说,在预测种别和边界框时,将全连接层的输出分别转换为形状为n×q(q是种别的数量)的输出和形状为n×4的输出。此中预测种别时使用softmax回归。
爱好地区汇聚层 (RoI Pooling)
在汇聚层中,我们通过设置汇聚窗口、填充和步幅的巨细来间接控制输出形状。而爱好地区汇聚层对每个地区的输出形状是可以直接指定的。
例如,指定每个地区输出的高和宽分别为h2和w2。对于任何形状为h×w的爱好地区窗口,该窗口将被分别为h2×w2子窗口网格,此中每个子窗口的巨细约为(h/h2)×(w/w2)。在实践中,任何子窗口的高度和宽度都应向上取整,此中的最大元素作为该子窗口的输出。因此,爱好地区汇聚层可从形状各异的爱好地区中均抽取出形状相同的特性。
代码示例:爱好地区汇聚层 (RoI Pooling) 的盘算方法
下面我们通过一段 PyTorch 代码来演示爱好地区汇聚层 (RoI Pooling) 的盘算方法。
- # 演示兴趣区域汇聚层(ROI Pooling)的计算方法
- import torch # 导入PyTorch库
- import torchvision # 导入PyTorch视觉库
- # 创建一个4×4的特征图张量作为CNN抽取的特征
- # torch.arange(16.) 创建一个包含0到15的一维浮点数张量,维度为[16]
- # reshape(1, 1, 4, 4) 将张量重塑为4维张量,维度为[1, 1, 4, 4]
- # 第一个维度: 批次大小(batch size) = 1
- # 第二个维度: 通道数(channels) = 1
- # 第三个维度: 高度(height) = 4
- # 第四个维度: 宽度(width) = 4
- X = torch.arange(16.).reshape(1, 1, 4, 4)
- X[
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
|