type
status
date
slug
summary
tags
category
icon
password
Last edited time
Oct 4, 2024 03:12 PM
区域卷积神经网络:R-CNN,Fast R-CNN,Faster R-CNN,Mask R-CNN
📝 主旨内容
R-CNN(Region-based CNN)
首先从输入图像中选取若干个提议区域(锚框选取方式的一种),并标注它们的类别和边界框(如偏移量)。然后用卷积神经网络来对每个提议区域(锚框)进行前向传播以抽取特征。最后用每个提议区域的特征来预测类别和边界框。
R-CNN包括以下四个步骤:
- 对输入图像使用选择性搜索来选取多个高质量的提议区域。这些提议区域通常是在多个尺度下选取的,并具有不同的形状和大小。每个提议区域都将被标注类别和真实边界框;
- 选择一个预训练的卷积神经网络,并将其在输出层之前截断。将每个提议区域变形为网络需要的输入尺寸,并通过前向传播输出抽取的提议区域特征;
- 将每个提议区域的特征连同其标注的类别作为一个样本。训练多个支持向量机对目标分类,其中每个支持向量机用来判断样本是否属于某一个类别;
- 将每个提议区域的特征连同其标注的边界框作为一个样本,训练线性回归模型来预测真实边界框。
每次选择的锚框的大小是不同的,在这种情况下,怎样使这些大小不一的锚框变成一个batch?
RoI pooling(兴趣区域池化层 Region of Interesting)
- R-CNN 中比较关键的层,作用是将大小不一的锚框变成统一的形状
- 给定一个锚框,先将其均匀地分割成 n * m 块,然后输出每块里的最大值,这样的话,不管锚框有多大,只要给定了 n 和 m 的值,总是输出 nm 个值,这样的话,不同大小的锚框就都可以变成同样的大小,然后作为一个小批量,之后的处理就比较方便了
上图中对 3 * 3 的黑色方框中的区域进行 2 * 2 的兴趣区域池化,由于 3 * 3 的区域不能均匀地进行切割成 4 块,所以会进行取整(最终将其分割成为 2 * 2、1 * 2、2 * 1、1 * 1 四块),在做池化操作的时候分别对四块中每一块取最大值,然后分别填入 2 * 2 的矩阵中相应的位置
兴趣区域汇聚层(RoI Pooing)与一般的汇聚层有什么不同?
- 在一般的汇聚层中,通过设置汇聚窗口、填充和步幅的大小来间接控制输出形状
- 在兴趣区域汇聚层中,对每个区域的输出形状是可以直接指定的
尽管R-CNN模型通过预训练的卷积神经网络有效地抽取了图像特征,但它的速度很慢。 想象一下,我们可能从一张图像中选出上千个提议区域,这需要上千次的卷积神经网络的前向传播来执行目标检测。 这种庞大的计算量使得R-CNN在现实世界中难以被广泛应用。
Fast R-CNN
R-CNN每次拿到一张图片都需要抽取特征,如果说一张图片中生成的锚框数量较大,抽取特征的次数也会相应的增加,大大增加了计算量
R-CNN的主要性能瓶颈在于,对每个提议区域,卷积神经网络的前向传播是独立的,而没有共享计算。由于这些区域通常有重叠,独立的特征抽取会导致重复的计算。Fast R-CNN对R-CNN的主要改进之一,是仅在整张图象上执行卷积神经网络的前向传播。
- Faste R-CNN 的改进是:在拿到一张图片之后,首先使用 CNN 对图片进行特征提取(不是对图片中的锚框进行特征提取,而是对整张图片进行特征提取,仅在整张图像上执行卷积神经网络的前向传播),最终会得到一个 7 * 7 或者 14 * 14 的 feature map
- 抽取完特征之后,再对图片进行锚框的选择(selective search),搜索到原始图片上的锚框之后将其(按照一定的比例)映射到 CNN 的输出上
- 映射完锚框之后,再使用 RoI pooling 对 CNN 输出的 feature map 上的锚框进行特征抽取,生成固定长度的特征(将 n * m 的矩阵拉伸成为 nm 维的向量),之后再通过一个全连接层(这样就不需要使用SVM一个一个的操作,而是一次性操作了)对每个锚框进行预测:物体的类别和真实的边缘框的偏移
- Fast R-CNN 相对于 R-CNN 更快的原因是:Fast R-CNN 中的 CNN 不再对每个锚框抽取特征,而是对整个图片进行特征的提取(这样做的好处是:不同的锚框之间可能会有重叠的部分,如果对每个锚框都进行特征提取的话,可能会对重叠的区域进行多次重复的特征提取操作),然后再在整张图片的feature中找出原图中锚框对应的特征,最后一起做预测
它的主要计算如下:
- 与R-CNN相比,Fast R-CNN用来提取特征的卷积神经网络的输入是整个图像,而不是各个提议区域。此外,这个网络通常会参与训练。设输入为一张图像,将卷积神经网络的输出的形状记为
1×c×h1×w1
;
- 假设选择性搜索生成了
n
个提议区域。这些形状各异的提议区域在卷积神经网络的输出上分别标出了形状各异的兴趣区域。然后,这些感兴趣的区域需要进一步抽取出形状相同的特征(比如指定高度h2
和宽度w2
),通过RoI pooling将卷积神经网络的输出和提议区域作为输入,输出连结后的各个提议区域抽取的特征,形状为n×c×h2×w2
;
- 通过全连接层将输出形状变换为
n×d
,其中超参数d
取决于模型设计;
- 预测
n
个提议区域中每个区域的类别和边界框。更具体地说,在预测类别和边界框时,将全连接层的输出分别转换为形状为n×q
(q
是类别的数量)的输出和形状为n×4
的输出。其中预测类别时使用softmax
回归。
Faster R-CNN
为了较精确地检测目标结果,Fast R-CNN模型通常需要在选择性搜索中生成大量的提议区域。 Faster R-CNN提出将选择性搜索替换为区域提议网络(region proposal network),从而减少提议区域的生成数量,并保证目标检测的精度。
- Faster R-CNN 的改进:使用 RPN 神经网络来替代 selective search
- RoI 的输入是CNN 输出的 feature map 和生成的锚框
- RPN 的输入是 CNN 输出的 feature map,输出是一些比较高质量的锚框(可以理解为一个比较小而且比较粗糙的目标检测算法: CNN 的输出进入到 RPN 之后再做一次卷积,然后生成一些锚框(可以是 selective search 或者其他方法来生成初始的锚框),再训练一个二分类问题:预测锚框是否框住了真实的物体以及锚框到真实的边缘框的偏移,最后使用 NMS 进行去重,使得锚框的数量变少)
- RPN 的作用是生成大量结果很差的锚框,然后进行预测,最终输出比较好的锚框供后面的网络使用(预测出来的比较好的锚框会进入 RoI pooling,后面的操作与 Fast R-CNN 类似)
- 通常被称为两阶段的目标检测算法:RPN 做小的目标检测(粗糙),整个网络再做一次大的目标检测(精准)
- Faster R-CNN 目前来说是用的比较多的算法,准确率比较高,但是速度比较慢
与Fast R-CNN相比,Faster R-CNN只将生成提议区域的方法从选择性搜索改为了区域提议网络,模型的其余部分保持不变。具体来说,区域提议网络的计算步骤如下:
- 使用填充为
1
的3×3
的卷积层变换卷积神经网络的输出,并将输出通道数记为c
。这样,卷积神经网络为图像抽取的特征图中的每个单元均得到一个长度为c
的新特征。
- 以特征图的每个像素为中心,生成多个不同大小和宽高比的锚框并标注它们。
- 使用锚框中心单元长度为
c
的特征,分别预测该锚框的二元类别(含目标还是背景)和边界框。
- 使用非极大值抑制,从预测类别为目标的预测边界框中移除相似的结果。最终输出的预测边界框即是兴趣区域汇聚层所需的提议区域。
值得一提的是,区域提议网络作为Faster R-CNN模型的一部分,是和整个模型一起训练得到的。 换句话说,Faster R-CNN的目标函数不仅包括目标检测中的类别和边界框预测,还包括区域提议网络中锚框的二元类别和边界框预测。 作为端到端训练的结果,区域提议网络能够学习到如何生成高质量的提议区域,从而在减少了从数据中学习的提议区域的数量的情况下,仍保持目标检测的精度。
Mask R-CNN
如果在训练集中还标注了每个目标在图像上的像素级位置,那么Mask R-CNN能够有效地利用这些详尽的标注信息进一步提升目标检测的精度。
Mask R-CNN 是基于 Faster R-CNN 修改而来的,改进在于
- 假设有每个像素的标号的话,就可以对每个像素做预测(FCN)
- 将兴趣区域汇聚层替换成了兴趣区域对齐层(RoI pooling -> RoI align),使用双线性插值(bilinear interpolation)保留特征图上的空间信息,进而更适于像素级预测:对于pooling来说,假如有一个3 * 3的区域,需要对它进行2 * 2的RoI pooling操作,那么会进行取整从而切割成为不均匀的四个部分,然后进行 pooling 操作,这样切割成为不均匀的四部分的做法对于目标检测来说没有太大的问题,因为目标检测不是像素级别的,偏移几个像素对结果没有太大的影响。但是对于像素级别的标号来说,会产生极大的误差;RoI align 不管能不能整除,如果不能整除的话,会直接将像素切开,切开后的每一部分是原像素的加权(它的值是原像素的一部分)
- 兴趣区域对齐层的输出包含了所有与兴趣区域的形状相同的特征图,它们不仅被用于预测每个兴趣区域的类别和边界框,还通过额外的全卷积网络预测目标的像素级位置
🤗 总结归纳
- R-CNN 是最早、也是最有名的一类基于锚框和 CNN 的目标检测算法(R-CNN 可以认为是使用神经网络来做目标检测工作的奠基工作之一),它对图像选取若干提议区域,使用卷积神经网络对每个提议区域执行前向传播以抽取其特征,然后再用这些特征来预测提议区域的类别和边框
- Fast/Faster R-CNN持续提升性能:Fast R-CNN 只对整个图像做卷积神经网络的前向传播,还引入了兴趣区域汇聚层(RoI pooling),从而为具有不同形状的兴趣区域抽取相同形状的特征;Faster R-CNN 将 Fast R-CNN 中使用的选择性搜索替换为参与训练的区域提议网络,这样可以在减少提议区域数量的情况下仍然保持目标检测的精度;Mask R-CNN 在 Faster R-CNN 的基础上引入了一个全卷积网络,从而借助目标的像素级位置进一步提升目标检测的精度
- Faster R-CNN 和 Mask R-CNN 是在追求高精度场景下的常用算法(Mask R-CNN 需要有像素级别的标号,所以相对来讲局限性会大一点,在无人车领域使用的比较多)
📎 参考文章
- 作者:ziuch
- 链接:https://ziuch.com/article/Object-Detection-R-CNN-Series
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。