[SS]语义分割_Mask R-CNN

本文详细解析了MaskR-CNN,一种结合物体检测和语义分割的深度学习模型,重点介绍了其结构、RoIAlign的改进以及如何通过FPN进行特征融合。文章阐述了Mask分支、损失函数和预测流程,强调了RoIAlign在提高定位精度方面的作用。
摘要由CSDN通过智能技术生成

Mask R-CNN网络详解视频 

Mask R-CNN源码解析 

Mask R-CNN网络详解 

目录

一、介绍

1、引言

2、定义

二、结构详解

1、Mask R-CNN

2、RoIAlign

1)、RoIPooling实验

2)、RoIAlign实验

3、Mask分支(FPN)

4、Mask R-CNN损失

5、Mask分支损失

6、Mask分支预测使用


一、介绍

1、引言

        Mask R-CNN是一种用于物体检测和语义分割任务的深度学习模型。它是在Faster R-CNN的基础上进行改进的,通过增加一个分割分支,实现了物体检测和像素级别的语义分割。

        Mask R-CNN通过在RPN(Region Proposal Network)的基础上,增加了一个全连接层来生成每个候选框的分类概率和边界框回归信息。同时,它还为每个候选框添加了一个全卷积网络来生成候选框的mask分割。

        在训练过程中,Mask R-CNN除了进行物体分类和边界框回归的损失计算,还加入了语义分割的损失计算。语义分割损失计算的目标是通过将生成的像素级别的分割mask与真实分割mask进行比较,计算两者之间的差异。这样,模型就可以在训练过程中学习到更准确的物体边界和像素级别的分割。

        在预测过程中,Mask R-CNN可以同时输出物体检测框和分割mask。这样,我们既可以知道物体的位置,也可以了解每个像素属于哪个物体。

        总的来说,Mask R-CNN通过增加一个分割分支,实现了物体检测和语义分割的任务。它在很多计算机视觉领域的应用中取得了很好的效果,比如图像分割、实例分割等任务。

2、定义

        语义分割旨在将图像中的每个像素分配给特定的语义类别,即将图像分成几个不同的类别区域。它的目标是对图像进行全面的像素级别的分类,不考虑物体之间的区分。而实例分割则更进一步,不仅要对图像进行像素级别的分类,还要将每个像素分配给特定的语义类别和特定的物体实例。实例分割的目标是在图像中准确地分割出每个物体的边界,实现每个物体的像素级别分割。这种分割方法能够区分不同物体的实例,使得它们在像素级别上被分配不同的标签。因此,实例分割可以提供更精细的物体定位和分割效果。Mask R-CNN主要用于实例分割任务。

二、结构详解

1、Mask R-CNN

        Mask R-CNN是在Faster R-CNN基础上,在RoI Align层之后并联了一个分支,这个分支对应Mask分支,通过这个分支可以对检测的目标生成Mask蒙板。 

        原论文中提到关于Mask分支与FCN模型十分类似,上图中左边形式并不带FPN特征金字塔网络结构模块,而右边是带有FPN结构的,并且在使用中更多是右边带有FPN结构的Mask分支。

        对于带有FPN结构的Mask R-CNN它的class、box分支和Mask分支并不是共用一个RoIAlign。在训练过程中,对于class, box分支RoIAlign将RPN(Region Proposal Network)得到的Proposals池化到7x7大小,而对于Mask分支RoIAlign将Proposals池化到14x14大小。

2、RoIAlign

        在Mask R-CNN中将之前的RoIPool层替换成了RoIAlign层。在RoIPool层中涉及两次取整操作,会导致定位产生偏差,论文中称之为Misalignment问题。

        上表中右边部分针对目标检测任务,采用之前RoIPool层得到的AP值为28.2,改为RoIAlign得到的AP值为34.0,提升了5.8个点。左边部分的数据对应实例分割任务的结果,采用RoIPool得到的AP值为23.6,采用RoIAlign之后AP值为30.9,提升了7.3个点。

        通过实验数据表明,使用RoIAlign之后定位会变得更加准确。

1)、RoIPooling实验

        假设目标在原图上的左上角坐标为[10,10],右下角点为[124,124],此时将其映射到特征层上。假设特征层相对原图的步距为32,则需要将坐标都缩放32倍,即除以32。10除以32不能被整除,在RoIPooling中进行四舍五入取整操作\left [ \frac{10}{32} \right ]=0,得到映射特征层的坐标[0,0],同样用124除以32,经由四舍五入取整处理后\left [ \frac{124}{32} \right ]=4,得到右下角点坐标[4,4]。此时在特征层上将第0行到第4行,第0列到第4列,共[5x5]大小的区域选中,这就是目标映射到特征层上的位置。

        假设要通过RoIPooling得到一个[2x2]大小的输出,需要将该区域划分为[2x2]大小,对每个区域进行MaxPooling操作,但因为该区域为[5x5]大小,并不能被等分为[2x2]大小,则需要进行第二次取整操作,划分得到的区域大小都不相同,[3x3]、[3x2]、[2x3]、[2x2]。此时在每个小区域求最大值,就可以得到RoIPooling的输出。

2)、RoIAlign实验

        在RoIAlign层中,并不会进行取整操作,对应特征层上的左上角点[10,10]映射到特征层上为[0.3125,0.3125],右下角点[124,124]映射到特征层上为[3.875,3.875]。上图将特征层上的元素抽象为一个黑色原点,最左上角的黑色点坐标为[0,0]。刚已经求得目标映射到特征层上的坐标[0.3125,0.3125]和[3.875,3.875],对应在图中为蓝色方框位置。

        假设要求输出的大小为[2x2],此时将蓝色矩形框均分为[2x2]的区域,再对每个小区域求输出。在划分[2x2]区域时是均分操作,没有进行取整操作,对于求小区域的输出此时受到一个参数限制,[sampling ratio]的平方代表在小区域内有多少个采样点,如sampling ratio=1,则在每个小区域内只有1个采样点,若sampling ratio=2,则每个小区域内有2^{2}=4个采样点。

双线性插值 

        假设sampling ratio=1,需要在每个小区域有一个采样点,即小区域中心点坐标所对应的数值。离采样点最近的四个值对应的数值分别为[-1.6091]、[-0.7121]、[1.6871]、[0.2284],通过双线性插值的方法计算采样点对应的值。(原论文为每个小区域四个采样点,最后进行一个MaxPooling操作)。

        RoIAlign在计算过程中没有进行任何取整操作,则定位要更加准确。最后作者提到,关于最终的采样结果对采样点位置,以及采样点个数并不敏感。通常使用sampling ratio=2。

3、Mask分支(FPN)

        Mask分支具有两种结构,右边是常用的采用了FPN结构的Mask分支,灰色部分为Faster R-CNN预测器的分支,采用的RoIAlign与Mask分支采用的RoIAlign并不相同,对于分割任务而言,要求的分割结果精度要更高,所以保留的细节信息要更多,所以池化到了[14x14]大小而不是[7x7]。

图源自-太阳花的小绿豆 

        FCN中对每个像素对每个类别都会预测一个概率分数,之后针对每个像素沿着通道方向进行一个Softmax处理,通过Softmax处理过后,就能得到每个像素归于每个类别的概率分数,这样不同类别之间存在竞争关系,通过Softmax处理之后,每个像素在通道方向之间的概率分数之和等于一,有一个类别的概率分数变大就意味着别的概率分数要变小,则Mask与Class是耦合的状态。

        在Mask R-CNN中,对预测Mask以及类别class进行解耦。在Mask分支中针对每一个类别都会生成一个蒙板,但是不会针对每个像素沿着通道方向进行Softmax处理,而是根据Faster R-CNN分支预测针对该目标的类别信息,将这个Mask分支中针对该类别的蒙板提取出来拿去使用。这样类别与类别之间不存在竞争关系,利用了Faster R-CNN分支预测的目标类别信息。

训练网络时候输入Mask分支的目标是由RPN提供的,即Proposals,且是正样本,但在预测的时候输入Mask分支的目标是由Faster R-CNN提供的。

        正样本是在Faster R-CNN分支进行正负样本匹配的时候得到的,将Proposals输入Faster R-CNN分支,可以得知是正样本还是负样本,以及对应的Ground Truth标签是什么。但是在预测时是由Faster R-CNN提供的。

        RPN提供的Proposals并不是十分准确,可能对于一个目标,RPN提供了多个目标边界框,输入给Mask分支的都是正样本,所以必定目标边界框与目标有交集,这些Proposals都可以提供给Mask分支进行训练,这样相当于扩充了Mask分支训练样本个数,类似裁剪的数据增强方式。

        在预测时,直接使用Faster R-CNN的输出,对于最终预测时,只需要最准确的目标预测边界框,就能得到更加精准的分割。且在Faster R-CNN中,最终预测的目标通过NMS之后是可以过滤掉很多重合在一起的边界框,输入给Mask分支的目标边界框也就更少,计算量就更少。

4、Mask R-CNN损失

Loss=L_{rpn}+L_{fastRCNN}+L_{mask}

        Mask分支上的损失计算通过二值交叉熵损失(Binary Cross Entropy)。 

5、Mask分支损失

图源自-太阳花的小绿豆 

        首先将图片输入网络,通过Backbone和FPN得到不同下采样率的特征层,再通过RPN就能生成一系列Proposals,将Proposals输入RoIAlign,通过Proposals大小就可以在对应的尺度的特征层上进行裁剪得到对应的特征图[14x14x通道数],再将特征图输入给Mask分支,就可以针对每一个类别都去预测一个Mask,每个类别Mask堆叠再一起就是Mask分支得到的logits。训练时输入Mask分支的Proposals都是由RPN提供,并且都是正样本,正样本是在Faster R-CNN正负匹配过程中知道的,如对于当前Proposal通过Faster R-CNN分支,在正负样本匹配时得到Ground Truth为cat,此时就单独将cat类别的[28x28x1]Mask拿出来。此时虽然没有在logits上进行Softmax处理,但是使用了sigmoid激活,将每个预测值映射到[0-1]之间,预测针对cat这个类别的Mask,然后由Proposal的具体位置,在原图对应的Ground Truth Mask上裁剪对应区域,然后将其缩放到[28x28x1]大小,得到这里的GT Mask,在GT Mask中目标区域数值为1,背景区域数值为0,最后将预测值和GT值一起计算二值交叉熵损失。

6、Mask分支预测使用

图源自-太阳花的小绿豆

        RPN将预测的Proposals输入到Faster R-CNN对应的分支,该分支的RoIAlign将Proposal对应的特征图池化到[7x7]大小,通过Faster R-CNN检测器获得最终的目标边界框和所属类别,将预测的最终边界框信息传递到Mask分支,通过Mask分支的RoIAlign将传入的边界框对应的特征图池化到[14x14]大小,对于每个类别都去预测一个Mask,得到logits,因为由于Faster R-CNN的预测信息已经知道该目标对应的类别是cat,将对应cat的Mask拿出来,然后对该Mask进行双线性插值上采样到预测框predict box一样大小,之后通过一个阈值(默认0.5)转换成二值图,大于阈值为目标,其他位置为背景,然后将其放到原图对应的区域,这样就可以得到针对某一个目标的分割图了,最后将Mask分支的结果与Faster R-CNN分支结果合并到一起。

  • 19
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IAz-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值