前言
代码地址:maskrcnn-benchmark(PyTorch)
我在入门学习计算机视觉的适合,看一些经典的论文原文比较吃力。于是通过看各种参考文献及查阅各路资料,入门的角度写了一些博客,希望能够和大家一起进步。
笔者在阅读《Mask R-CNN》原文后,根据自身理解及查阅资料,以入门角度尽可能想要还原论文细节,水平有限,欢迎交流。
一、实例分割
1.1 从分类到实例分割
- Classification(分类):只对图像中的主要目标进行分类。
- Classification + Localization(分类+定位):我们也想知道主要目标的边界框。
- Objection Detection(目标检测):图像中有多个目标,我们想知道在已知类别中,每个目标的类别及边界框位置。
- Instance Segmentation(实例分割):得到单个目标的分类结果,并得到每个目标的边界框位置。
1.2 实例分割的背景
语义分割通过对输入图像中每个像素的标签进行预测,给出了较好的推理,例如是前景还是背景。每个像素都根据其所在的对象类进行标记。为了进一步发展,实例分割为属于同一类的对象的单独实例提供了不同的标签。
- 目标检测:可以区分个体但不够准确。
- 语义分割:可以划分像素但不可以区分个体。
而实例分割则可以结合二者的优点,对个体的分类及定位更加精准。因此,实例分割可以定义为同时解决目标检测问题和语义分割问题的技术。
二、从RCNN、Fast RCNN、Faster RCNN,到Mask RCNN
入门计算机视觉的目标检测,那么RCNN、Fast RCNN,Faster RCNN的文章是无法避而不谈的。要很好地理解 Mask R-CNN 网络架构,最好从R-CNN来理解。
以下仅仅是对RCNN,Fast RCNN,Faster RCNN的简单回顾,如果需要详细了解,可以学习这篇博客。
2.1 RCNN
- 在网络的底部,基于非深度学习的选择性搜索 (SS) 用于特征提取以生成 2k 区域建议。
- 每个riigion proposall(区域提案) 都经过扭曲并通过卷积神经网络(CNN)和最后的支持向量机(SVM),输出分类和边界框。(因此效率很低)
- (如果感兴趣,可以阅读《Faster RCNN超详细入门 01-准备篇-背景 RCNN,SPPnet,Fast RCNN,RoI Pooling》)
2.2 Fast RCNN
- 在Fast R-CNN中,区域提议部分仍然使用基于非深度学习的 SS 方法,SS 仍然用于生成 2k 个区域建议。
- 但是,与R-CNN不同的是,输入整张图像(而非每一个区域)经过 CNN 进行特征提取以生成特征图(这样就相当于共享了参数,提高了速度)。之后根据每个区域提议共享这些特征图以用于 RoI 池化。
- 对于每个区域提案,在提案上执行 RoI 池化,最终通过网络,即全连接(FC)层。并且不再使用 SVM。
- 最后,在全连接(FC)层的输出端输出分类和边界框。
2.3 Faster RCNN
详细可参考《Faster RCNN超详细入门 02网络细节与训练方法 (anchors,RPN,bbox,bounding box,Region proposal layer……)》
- 在Faster RCNN中,输入图像通过 CNN。这些特征图将用于区域提议网络(RPN)以生成区域提议,并用于生成特征图以用于稍后的 RoI 池化。
- 不再使用SS。 因此,整个网络是一个端到端的深度学习网络,对于梯度传播提高目标检测精度至关重要。
- 与Fast RCNN类似,对于每个 region proposal,RoI pooling 都在proposal 上进行,最后通过网络,即全连接层。最后,输出分类和边界框。
feature_maps = process(image)
ROIs = region_proposal(feature_maps)
for ROI in ROIs
patch = roi_pooling(feature_maps, ROI)
results = detector2(patch)
2.4 Mask RCNN
- Mask RCNN,架构非常接近Faster RCNN。主要区别在于,在网络的末端,还有另一个头,即上图中的掩码分支,用于生成掩码进行实例分割。还有把Faster RCNN中的ROI Pooling换成了ROIAlign。(3.3会提到)
三、Mask RCNN网络概述
3.1 架构
两阶段
- 第一阶段:区域提案网络(RPN),提议候选对象边界框。每个区域提案都将经过第二阶段。
- 第二阶段:对于每个区域提议,第一阶段提出的特征图根据区域进行RoI池化,并通过剩余的网络,输出类别、边界框以及二进制掩码。(在 ROI 池化之后,作者又添加 2 个卷积层来构建掩码。)
细节
- RoI Align 网络输出多个边界框,而不是一个确定的边界框,并将它们扭曲成一个固定的维度(利用SSP net)。
- 然后将扭曲的特征输入全连接层,使用 softmax 进行分类,并使用回归模型进一步细化边界框预测。
-
扭曲的特征也被输入到 Mask 分类器中,该分类器由两个 CNN 组成,为每个 RoI 输出一个二进制掩码。掩码分类器允许网络为每个类生成掩码,而不会在类之间进行竞争。
3.2 Loss Function(损失函数)
多任务损失函数:
- L c l s Lcls Lcls:分类损失,与Faster R-CNN相同。
- L b o x Lbox Lbox:边界框损失,与Faster R-CNN相同。
- L m a s k Lmask Lmask:二进制掩码损失。这个掩码分支为每个 RoI 输出 K m 2 Km² Km2,它们是 m × m m × m m×m 分辨率的 K K K 个二进制掩码,代表 K K K 个类。
3.3 ROI Align
原理
Mask R-CNN 的另一个主要贡献是对 ROI pooling的改进。在 ROI 中,卷积图被数字化(上图左上图):目标特征图的单元边界被迫与输入特征图的边界重新对齐。因此,每个目标单元格的大小可能不同(左下图),而这使得物体的预测边框与真实边框存在一个差距,这个差距在大物体检测时,误差可以接受,但在小物体检测时,误差就显得尤为难以接受。Mask R-CNN 使用ROI Align,它不会取整单元格的边界(右上)并使每个目标单元具有相同的大小(右下)。它还应用插值来更好地计算单元格内的特征图值。例如,通过应用插值,现在左上角的最大特征值从 0.8 变为 0.88。
Roi Pooling vs Roi Align
- 首先,我们经过一些卷积层得到了如图左侧的输入特征图。
- 然后根据region proposal(区域提议),我们使用一个 7×5 的区域作为 RoI Pooling 的输入,以输出 2×2 的特征图。
- 每个黑色矩形都经过四舍五入以具有整数长度以供以后进行池化。
- 对于输出特征图的每个值,它们只选取每个黑色矩形的最大值,称为最大池化(Max Pooling)。
- 不是将黑色矩形四舍五入以获得整数长度,而是使用相同大小的黑色矩形。
- 基于特征图值重叠的区域,取各单元格中心位置,使用双线性插值得到中间池化特征图,如图右下角所示。
- 然后在这个中间池化特征图上执行最大池化(Max pooling)。
效果
四、Mask RCNN的可视化
参考Image segmentation with Mask R-CNN
可视化 Mask R-CNN/Faster R-CNN 中的一些主要步骤。使用Region proposal network(区域提议网络),我们提出 ROI proposals。下面的虚线矩形是那些提案,但为了演示目的,我们决定只显示那些最终得分高的proposal。
这是我们进行最终分类和定位预测时边界框细化后的框。边界框更好地包围了ground truth内的物体。
就像 Faster R-CNN 一样,它是基于 RPN (region proposal network)的 ROI(虚线)执行目标分类。实线是最终预测中的边界框细化后的结果。
然后,采用非极大值抑制(non-maximum suppression),它对同一类高度重叠的框进行分组,并仅选择置信度最高的预测。这避免了同一目标的重复框选。
文章来源:https://www.toymoban.com/news/detail-469462.html
以下是 RPN 使用的输入图片和一些特征图。第一个特征图显示了汽车排队位置的高激活率,也就是说,特征图学到了汽车的部分特征。
边界框的一些边角位置:
以及锚点偏移量的分布:
由上图看出,此次训练主要以x,y方向上的偏移量为主。
以下是根据top类别的,Mask R-CNN的最终预测:
文章来源地址https://www.toymoban.com/news/detail-469462.html
到了这里,关于Mask RCNN 超详细图文入门(含代码+原文)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!