MASK-RCNN网络介绍
创始人
2024-06-01 16:01:05
0

目录

  • 前言
  • 一.MASK R-CNN网络
    • 1.1.RoIPool和RoIAlign
    • 1.2.MASK分支
  • 二.损失函数
  • 三.Mask分支预测

前言

  在介绍MASK R-CNN之前,建议先看下FPN网络,Faster-CNNFCN的介绍:下面附上链接:

  • R-CNN、Fast RCNN和Faster RCNN网络介绍
  • FCN网络介绍
  • FPN网络介绍

  在之前介绍数据集的时候我们讲过图像分割分为语义分割和实例分割,看下面两幅动图展示:
语义分割:
在这里插入图片描述
实例分割:
在这里插入图片描述
  今天介绍的MASK R-CNN是针对实例分割这种情况的,我们主要从以下几个部分进行讲解:

  • MASK R-CNN网络
  • RoiAlign
  • Mask分支(FCN)
  • 损失函数
  • Mask分支预测

一.MASK R-CNN网络

  先来看下MASK R-CNN网络结构:
在这里插入图片描述
  从上面的网络结构可以看出,前面的RolAlign+CNN就是前面的Faster-RCNN结构(实际中Faster-RCNN使员的也是RoIAlign,并不是RoIPool)。后面一个卷积层就是自己可以并联的的网络结构用于分割,关键点检测都行。
在这里插入图片描述

  下面我们来看下MASK分支的结构,跟FCN非常像,主要有两种结构:不带FPN特征金字塔结构和带有FPN的,我们经常使用的也是右边这个带有FPN的。
在这里插入图片描述

1.1.RoIPool和RoIAlign

  上面讲到在MASK R-CNN中吧之前Faster R-CNN中的RoIPool替换成了RoIAlign层,为什么呢?因为在RoIPool中涉及两次取整的操作,会导致定位产生偏差。
这里我们再来看下RoIPool操作:
在这里插入图片描述
  从上面的图中可以看出,RoIPool可能会涉及两次取整操作,我们以目标检测的标注框为例解释,第一次是在标注框大小投影到最终网络输出特征层进行了一次四舍五入;第二次是在maxpooling的时候,因为投影后的框不能保证能够均分,还会涉及到一次四舍五入。
在这里插入图片描述
  相比于RoIPool,通过上面的图可以看到,第一次投影的时候RoIAlign并不会涉及到四舍五入的操作,最终计算的值是多少就是多少;第二次池化的时候直接均分第一次投影得到的特征矩阵,找到中心点坐标和周围最近的几个点(也可以采用几个采样点计算均值,这里以一个为例),直接计算双线性差值,也不会涉及到四舍五入的操作。
  通过上面的对比可以看出RoIAlign并不会涉及到任何的取整操作,所以他的定位也更加的准确。

1.2.MASK分支

  上面我们讲MASK分支有两种,带FPN和不带FPN,我们最常用的是下面这个带有FPN的结构:

在这里插入图片描述
注意1:
  上图中有两个RoI,上面一个对应的是Faster R-CNN的预测器的分支,他所用的RoIAlignMASK分支采用的RoIAlign并不一样,即两者不共用一个RoIAlign,一个输出的大小是7×77\times 77×7,一个是13×1313\times1313×13。因为分割要求保留更多的信息,池化比较大的话会损失比较多的信息。下面一个MASK分支的最后输出28×28×8028\times28\times8028×28×80的意思是对每一个类别(COCO通常使用的都时候80个类别的)都预测一个28×2828\times2828×28大小的蒙版。

  在MASK R-CNN中对预测的Maskclass进行解耦,什么意思?FCN对每个像素,每个类别都会预测一个类别概率分数,最后会对每个像素沿着channel方向进行softmax处理,处理之后就能能得到每个像素归属每个类别的概率分数,所以不同类别之间是存在竞争关系的。通过sofmax之后,每个像素在channel方向概率只和等于1,对于某个类别的概率分数大的话,那么其他类别的概率分数就会小。所以他们之间存在竞争关系,即AMSKclass是耦合的状态。那么在MASK R-CNN中是怎么对maskclass进行解耦的呢?刚才说了在mask分支中对每个预测类别都会预测一个蒙版,但是不会针对每一个数据沿着他的channel方向做softmax处理,而是根据faster r-cnn分支预测针对该目标的类别信息将mask分支中针对该类别的蒙版信息提取出来使用。这段话听起来有点绕,晦涩难懂,多理解一下。核心就是mask分支现在不用自己的分类信息了,把faster r-cnn的分类信息拿过来当做自己的。

注意2:
  训练网络的时候输入MASK分支的目标是由RPN提供的,即proposals,需要注意的是输入给mask分支的proposals全都是正样本,正样本是在Faster R-cnn分支进行正负样本匹配的时候得到的,即将proposals输入到faster r-cnn分支,在fasterr-cnn分支中会进行正负样本的匹配就会得到每个proposal到底是正样本还是负样本以及这个proposal他所对应的GT类别是什么,将得到的所有正样本传递给Mask分支。
  预测的时候输入mask分支的目标是由faster-cnn提供,即最后预测的目标边界框。RPN提供的目标边界框可能并不准确,对于一个目标,RPN可能提供了多个目标边界框,我们刚说了提供给mask分支的proposals都是正样本,所以一定会存在交集,这些proposals都可以提供给mask分支进行训练,但是在最终预测的时候是直接使用的Faster R-CNN分支的输出,因为预测的时候只需要最准确的目标边界框即可,可能就一个目标,将这个目标提供给MASK分支即可,并且在Faster RCNN中,通过NMS处理之后是能过滤掉很多重合在一起的目标,最终送入mask分支的目标也就少一些,目标少一些计算量就会下降。

二.损失函数

损失函数总共三项,就是在Faster R-cnn的基础上加上了mask分支所对应的损失。
Loss=Lrpn+Lfastrcnn+LmaskLoss =L_{r p n}+L_{fast_rcnn }+L_{mask } Loss=Lrpn​+Lfastr​cnn​+Lmask​

在这里插入图片描述
  如何计算mask分支的损失,这里我们借用一篇博主画的图,如上图所示,输入一张图片,经过backbonefpn得到不同采样率的特征层,接着通过RPN就能生成一系列的proposals,假设通过RPN得到了一个Proposal(图中黑色的矩形框),将proposal输入给RoIAlign,就能根据proposal的大小在对应特征层上进行裁剪得到对应的特征(shape为14×14×C14\times14\times C14×14×C),接着通过Mask Branch预测每个类别的Mask信息得到图中的logitslogits通过sigmoid激活函数后,所有值都被映射到0至1之间)。上面讲了训练的时候输入mask的分支的proposal是由RPN提供的,并且这些proposal都是正样本,这些正样本是通过Fast R-CNN分支正负样本匹配过程知道的,对应图上的proposal通过faster rcnn时,在正负样本匹配的时候可以得到对应的GT是猫,所以将logits中对应类别猫的预测mask(shape为28×2828\times2828×28)提取出来。需要注意的是这里的logits虽然没有在通道上做softmax处理,但是会进行sigmoid激活,也就是会将每个预测值映射到0-1之间。然后根据Proposal在原图对应的GT上裁剪并缩放到28×2828\times2828×28大小,得到图中的GT mask(对应目标区域为1,背景区域为0)。最后计算logits中预测类别为猫的maskGT maskBCELoss(BinaryCrossEntropyLoss)即可。以上仅仅是以一个proposal为例的,实际中会有很多。

三.Mask分支预测

在这里插入图片描述
  在真正预测推理的时候,输入Mask分支的目标是由Fast R-CNN分支提供的。如上图所示,前面的backbon+fpn,RPN跟上面介绍的都是一样的,不再介绍。RPN输出的proposals通过Fast R-CNN分支(注意这里的RoIAlign跟上面的mask的不一样),我们能够得到最终预测的目标边界框信息以及类别信息。接着将目标边界框信息提供给Mask分支通过RoIAlign得到对应的特征,对于每个类别都预测一个mask,就能预测得到该目标的logits信息,再根据Fast R-CNN分支提供的类别信息将logits中对应该类别的Mask信息提取出来,即针对该目标预测的Mask信息(shape为28×2828\times2828×28,由于通过sigmoid激活函数,数值都在0在这里插入代码片1之间)。然后利用双线性插值将Mask缩放到预测目标边界框大小,并放到原图对应区域。接着通过设置的阈值(默认为0.5)将Mask转换成一张二值图,比如预测值大于0.5的区域设置为前景剩下区域都为背景。现在对于预测的每个目标我们就可以在原图中绘制出边界框信息,类别信息以及目标Mask信息。

相关内容

热门资讯

安卓7.0系统速度咋样,速度与... 你有没有发现,自从手机更新到安卓7.0系统后,感觉整个手机都焕然一新了呢?今天,就让我来给你详细聊聊...
安卓文件系统隔离,Androi... 你知道吗?在安卓的世界里,有一个神奇的小秘密,那就是安卓文件系统隔离。听起来是不是有点高大上?别急,...
电脑板安卓系统下载,轻松实现多... 你有没有想过,你的电脑板突然间变得如此强大,竟然能运行安卓系统?没错,这就是科技的魅力!今天,就让我...
安卓系统双开app排行,热门双... 安卓系统双开App排行大揭秘在数字化时代,手机已经成为我们生活中不可或缺的一部分。而安卓系统,作为全...
安卓原生系统谁在开发,谷歌主导... 你有没有想过,那个陪伴你每天刷抖音、玩游戏、办公的安卓系统,究竟是谁在背后默默开发呢?今天,就让我带...
vive属于安卓系统吗,揭秘V... 你有没有想过,那个让人眼前一亮的VR设备Vive,它到底是不是安卓系统的呢?这个问题,估计不少对VR...
ios系统和安卓系统传递文件,... 你有没有想过,当你把一张照片或者一个文件从你的手机传给朋友时,背后其实是一个复杂的系统在默默工作呢?...
安卓刷鸿蒙系统工具,一招解锁全... 你有没有想过,让你的安卓手机也来一场华丽的变身?没错,就是那种从安卓系统切换到鸿蒙系统的神奇之旅。今...
安卓系统看不到系统文件,为何无... 你是不是也遇到了这样的烦恼?手机里明明有好多文件,可就是找不到它们的小身影,安卓系统竟然看不到系统文...
安卓系统升级模式,迭代创新与用... 你知道吗?安卓系统升级模式,这可是个让人又爱又恨的话题。每次手机收到升级通知,心里既期待又紧张,就像...
安装安卓虚拟系统教程,安卓虚拟... 你有没有想过在电脑上也能体验安卓系统的乐趣呢?没错,就是那种随时随地都能玩手机游戏、刷抖音的感觉,现...
叶茂然安卓系统下载,畅享智能生... 你有没有听说最近叶茂然安卓系统下载成了热门话题?没错,就是那个叶茂然安卓系统!今天,我就要带你全方位...
安卓子系统下载地址,深度解析下... 你有没有想过,你的安卓手机里那些神秘的子系统其实也可以下载下来,自己动手安装呢?没错,今天就要来给你...
安卓手机系统铃声替换,唤醒你的... 你有没有发现,每次手机响个不停,是不是总想给它换个铃声,让它听起来更个性、更有范儿?没错,安卓手机系...
登陆系统和安卓系统区别,差异解... 你有没有想过,为什么你的手机里装了那么多应用,却还是觉得登陆系统有点儿麻烦呢?今天,就让我带你一起探...
安卓系统手表壁纸华为,科技美学... 你有没有发现,最近安卓系统手表的江湖风头正劲呢?尤其是华为家的那些宝贝,简直让人爱不释手。今天,就让...
安卓系统闹钟组件设置,轻松打造... 你有没有发现,每天早上闹钟响起的时候,是不是总感觉时间过得飞快,一转眼又是一个新的一天呢?今天,就让...
安卓系统的几大组件,组件架构与... 你有没有发现,你的安卓手机里藏着许多神奇的“小精灵”呢?它们默默无闻地工作,让你的手机变得如此强大和...
安卓系统关闭app流量,轻松关... 手机里的APP们是不是有时候让你觉得流量消耗得有点儿太快了呢?别急,今天就来教你几招,让你的安卓手机...
安卓系统无尽之海,安卓系统中的... 安卓系统,无尽之海中的航行者想象你正站在一望无际的海洋边,海风轻拂,波光粼粼。这片海洋,深邃而神秘,...