Mask RCNN学习笔记


Mask RCNN流程

1 Mask RCNN开篇前的几个问题

1.1 Mask RCNN 沿用思想&Faster RCNN中暴露的问题

Mask RCNN网络沿用了Faster RCNN的网络思想,网络整体可以分为三大部分:
(1)ResNet-FPN特征提取网络
(2)RPN建议框提取
(3)检测+分类的Faster RCNN原结构、新Mask分支分割图像

最后,Mask RCNN的网络损失函数Lmask由三部分构成:Lmask = Lcls + Lreg + Lmask

Faster RCNN 网络中暴露的问题:
(1)Faster RCNN 在RPN网络中得到的anchor坐标[x,y,w,h]一般是小数,但是anchor在proposal layer中最终都被整数化了,损失精度。

(2)RoI Pooling 层中又进行了一次整数化,做法是将每个proposal对应的feature map区域划分为7x7个大区域,之后在每个大区域中进行max pooling为7x7大小的特征图,这里举一个例子,如图所示为8x8的特征图,一个bbox坐标为[0,3,7,8],需要将它变成2x2大小的特征图:
在这里插入图片描述
可以看到,proposal的大小是5x7,是没法平均分配的,所以进行了区域取整,高被分割成为2x3,宽被分割为了3x4,最终得到了2x2的maxpooling结果:
在这里插入图片描述

如果遇到特征区域无法划分的时候,就需要四舍五入取整为7x7(别问我为啥是7x7,论文里说的是7x7)

1.2 FPN层

FPN层网络结构
FPN层的全名是特征金字塔网络(feature pyramid network)
(1)FPN解决的问题:解决了目标物体的多尺度问题,提升了小物体的检测性能。
(2)FPN中的核心关键词:上采样与下采样
(3)FPN的连接方式:自上而下(CNN)、自下而上(最邻近上采样)、横向连接(融合)

在CNN的下采样过程中,特征图中包含的细节信息随着网络深度加深而越来越少(得到的特征图结果记为Dn),之后,将下采样的结果直接使用「最邻近上采样」得到上采样结果(得到的特征图结果记为Um),最后,将Dn与Dm相融合,这样做的好处是可以让特征图同时具有强语义信息和强空间信息。

1.3 Mask分支

在这里插入图片描述
(1)如上所示为Mask RCNN的整体流程图,在ROI Align之后通过两层conv就是mask预测分割支路了,这条支路与上方的class分类、box再回归相互独立;

(2)mask支路分割的输出结果,假设图像数据集一共有K个类别,MxM是ROIAlign之后的特征图结果大小,最终的输出为KMM的二值掩码,为什么是二值掩码?是因为在proposal区域内,需要让网络区分前景与背景,所以假设了标注0为背景,1为前景目标;

(3)关于mask支路的loss计算,当分类分支完成了任务得到概率最大的类别分类之后(假设为第K个类别),之后将第K个类别的mask预测取出,作为最终的预测结果,通过sigmoid激活函数计算loss;在这之前,mask支路还是需要计算K个类别的mask分类,这部分的计算量并不能省略。

1.4 ROI Align

(1)ROI Align的目的:ROI Align 的目的是取消候选框取整操作,保留小数,解决了Faster RCNN网络中不匹配(mis-alignment)问题,如下图,为Faster RCNN的做法:
在这里插入图片描述

(2)ROI Align具体实现方式:采用双线性插值方式,求取采样点坐标(这个坐标通常包含着采样点周围四个点的权值),最后进行maxpooling操作,如下图所示
在这里插入图片描述

1.5 全卷积层(FCN)和CNN网络里的全连接层

(1)关于全联接层,大致是这样的,它把不同通道的特征图,例如3x3x5的输出,转化为1x4096的形式,怎么做呢,如下图:
在这里插入图片描述
做完多通道卷积之后,进行一个大求和,将所有通道内的图像高度浓缩为一个值,之后进行softmax分类,那它的意义到底在哪里嘛?下面看这张图:
在这里插入图片描述
卷积神经网络的神经元学习到了这是一只猫,对应的更新了神经元里的权重信息,之后,有一只猫被送入卷积神经网络后,对应识别猫的神经元就被激活了。
在这里插入图片描述
在这里插入图片描述
通过最后一层的softmax层,也是output layer 确定出很大的概率这是一只猫。

(2)全卷积FCN层是一种稀疏的全联接层,全卷积层是一种核很大的卷积层,他们最终得到的东西不同如下图,FCN得到了一张heatmap,全联接层得到了分类结果。在这里插入图片描述
可以参考这篇文章:使用全卷积代替全联接

1.6 语义分割与实例分割的区别

语义分割,如下图:在这里插入图片描述
实例分割:
在这里插入图片描述
总结:语义分割对同类物体的不同实例不需要区分,大家都是一个颜色;实例分割,对同类物体的不同实例进行分割。

1.7 Mask RCNN 数据集的标注问题

一般的目标检测直接使用标注工具labme对目标物体画出矩形,而Mask RCNN需要进行对检测物体进行多边形标注,如下图所示,和Faster RCNN并不相同:
在这里插入图片描述

2 网络整体结构

2.1 ResNet-FPN 处理流程说明

在这里插入图片描述

(1)首先,对于原始图片进行CNN常规卷积操作,在这个过程中,得到特征图尺寸不断减小(bottom-up),之后利用尺寸较小的特征图进行上采样(top-down)

(2)将bottom-up与top-down通过三种不同方式相连接(自上而下连接、自下而上连接、横向连接)得到预测[P2,P3,P4,P5]

(3)关于小尺寸图片与大尺寸图片的融合方式问题,一般会使用CNN卷积时不同尺度的特征图通过1x1卷积(用于降低通道数量)与top-down相结合,完成融合,融合结构如下图
在这里插入图片描述

(4)在融合之后通过3x3的卷积对融合特征进行处理,目的是消除混叠效应(aliasing effect)

2.2 ResNet-FPN + RPN

在这里插入图片描述
这部分的网络结构如图所示,FPN层最终得到了不同尺度的特征图,在经过RPN层之后,proposal区域经过判断函数,将选取到最适合的特征图上,这就做到了:
(1)大目标的语义信息在浓缩度高的小特征图上
(2)小目标的细节并没有丢失,出现在大特征图上
这样的好处是,自适应的解决了目标物体多尺度的问题,根据一个公式来决定ROI区域到底需要从哪张图切割,公式长这样:
在这里插入图片描述
k表示切割ROI时,最终特征图的选取编号,k0是一个常数4,表示面积为WxH=224x224的ROI所应在的层级。

2.3 ResNet-FPN + RPN + Faster RCNN + Mask分支

在这里插入图片描述
(1)在确定了ROI的提取之后,还需要将不同尺度的ROI 大小进行归一化,这里使用到的是ROI Ailgn,ROI Ailgn这种方式的栅格化,解决了Faster RCNN里直接粗暴的将小数取整的做法(毕竟Mask RCNN需要进行像素级语义分割,不把像素对齐怎么能行呢?你说是吧)

(2)经过ROI Align之后,proposal区域特征图大小变得一样了,这时候网络分为两只,「支路1」传统的Faster RCNN 检测与分类支路;「支路2」Mask网络独有的语义分割支路

(3)当分类网络将proposal区域内部的最大分类结果K传入mask分割网络后,分割网络就在所有分割好的掩膜中挑出第K个作为语义分割的结果,这时第K个sigmoid函数被激活并计算Mask分割的Loss。

2.4 以损失函数的角度观察网络

网络整体Loss分为三部分,
(1)Faster RCNN检测损失Lreg
(2)Faster RCNN分类损失Lcls
(3)Mask支路,分割损失Lmask
其中,检测损失又出现了两回,「第一次检测回归」在RPN层中初步检测回归;「第二次检测回归」在检测尾出现,是较为精细的回归。

3 总结

(1)Mask RCNN中添加了新颖的Mask支路,用于语义分割;
(2)改进了Faster RCNN网络的两次取整(第一次是proposal layer对anchor坐标进行取整,第二次是在ROI Pooling中进行的取整)
(3)Mask RCNN 在检测和回归的同时也进行了分割

4 资料参考

4.1 FCN的学习与理解

4.2 使用卷积代替全连接

4.3 Mask RCNN 知乎

4.4 CNN 入门讲解:什么是全连接层(Fully Connected Layer)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Mask RCNN 是基于Kaiming 之前的工作 FPN (Feature Pyramid Network) 很形象地说就是用FPN产生的检测结果, 后面加了一个分割的网络. 文章中用到了 Top-Down + Bottom-Up 最近很流行的多层网络, 因为最开始Faster-RCNN只是在最后一层上面检测, 很容易丢掉小目标物体, 并且对细节遮挡也很不敏感. 最近的趋势就是结合多层 特征, 答主孔涛就很早发现了这个insight, 做出了HyperNet 并中了CVPR roal!!!作者:Oh233 链接:https://www.zhihu.com/question/57403701/answer/153060743 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 Mask R-CNN 这个结果确实很强,但要同时注意它主要是加上了许多(都是很有用的)engineering techniques 。 比如说 anchor 从 12 增加到了15个,图像 size 从600变成了800,还有ROI batch size变到了512,从FPN那篇paper来看,这些 better practice 会有对性能十分明显的提升 (table 3 baseline: AP=26.3 -> 31.6)。而我们组16年的coco分割竞赛冠军 ,Fully Convolutional Instance-aware Semantic Segmentation (FCIS)的代码昨晚终于开源了。限于计算资源,我们并没有加上这些改进。这些改进应该是比较 general 的,也会适用于 FCIS。欢迎大家试用一波。FCIS 提供了一种简单高效的框架去解决 instance segmentation 的问题。跟之前 COCO 2015 的冠军 MNC 相比,它的主要不同在于 mask estimation 和 detection 是共同做的,而不是先估计 mask 再做 detection。在 FCIS 中 detection/mask estimation 之间通过 inside/outside score map 互相影响,利用了这两个紧密相连 task 之间的共性。现在 release 版本基于支持多卡训练的MXNet,msracver/FCIS。实际上大概今年一月份我们就已经写出了外面可以使用的Caffe版本,但是当时官方 Caffe 只支持单卡做复杂任务的训练,对于COCO这种大规模数据集来说用单卡训练的话一下子几周的时间就过去了。考虑到大家用起来会非常蛋疼,最后还是决定没有release这个版本。
Mask RCNN中,部分监督学习是指在训练过程中,除了使用bounding box标注的目标位置信息进行训练外,还使用了像素级别的mask标注信息。这种监督学习方法被称为instance segmentation,它可以对每个目标实例进行精确的像素级别的分割。 在Mask RCNN的训练过程中,每个目标实例都有一个对应的mask。这些mask是通过手动标注或者使用图像分割算法生成的。通过将mask与对应的目标实例进行匹配,可以使模型学习到目标的精确边界信息。这样,在测试阶段,模型就可以根据输入图像准确地分割出目标实例的轮廓。 在代码实现中,可以使用PIL库中的Image.open函数读取掩码图片,然后将其转换为P模式,并使用调色板函数将像素值映射为特定的类别颜色。这样可以可视化掩码图像,并对图像进行数据增强等处理。然后可以使用PyTorch提供的MaskRCNNPredictor类来生成Mask预测器,从而实现目标实例的像素级别分割。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [MaskRCNN的实现](https://download.csdn.net/download/weixin_38717156/14941401)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [【纯小白】动手实现MASK RCNN 实例分割(带全部源码)](https://blog.csdn.net/m0_51325463/article/details/127516052)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值