本文为稀土技术社区首发签约文章,14天内制止转载,14天后未获授权制止转载,侵权必究!

作者简介:秃头小苏,致力于用最浅显的语言描绘问题

专栏引荐:深度学习网络原理与实战

近期方针:写好专栏的每一篇文章

支撑小苏:点赞、保藏⭐、留言

深度学习实例切割篇——Mask RCNN原理详解篇

写在前面

Hello,咱们好,我是小苏

在前面的文章中,我已经为咱们介绍过深度学习中的物体分类、方针检测和语义切割,感兴趣的可以进入我的主页了解概况。我尽量浅显的为咱们介绍各种网络结构原理,并配合代码协助咱们深入了解,感兴趣的快来和我一起学习吧,让咱们共同进步。


一个人可以走的很快,一群人可以走的更远


今日为咱们解说Mask RCNN的原理,在阅读本教程之前,有些常识你是必须把握的,如下:

  • [1] 方针检测系列——开山之作RCNN原理详解
  • [2] 方针检测系列——Fast R-CNN原理详解
  • [3] 方针检测系列——Faster R-CNN原理详解
  • [4] 还不了解方针检测嘛?一起来看看Faster R-CNN源码解读
  • [5] 深度学习语义切割篇——FCN原理详解篇
  • [6]深度学习语义切割篇——FCN源码解析篇

Mask RCNN是在Faster RCNN的根底上提出的,因而你需求对Faster RCNN的结构适当了解,不清楚的可以参阅上述的[1]-[4]。一起Mask RCNN中又嵌入了FCN语义切割模块,因而你也要对此有充沛认知,不清楚的可以参阅[5]和[6]。

那么现在我就当咱们已经有了以上的先验常识,快来和我一起学学Mask RCNN吧!

Mask RCNN总体框架

​  Mask RCNN的网络结构如下图所示,咱们先从宏观上认识一下Mask RCNN的整体结构。其主要分为两个部分,下图中黄框框住的部分为Faster RCNN结构,绿框框住的是一个FCN结构。也便是说,Mask RCNN是在Faster RCNN的根底上增加了一个FCN结构!!!

深度学习实例分割篇——Mask RCNN原理详解篇

              图1 Mask RCNN整体框架图

​  是的,Mask RCNN的结构便是这么简略,却能起到非常好的效果。而且可扩展行非常好,比方咱们还增加一个可以检测人体关键点信息的网络。在介绍Mask RCNN的一些细节前,让咱们先来看看Mask RCNN的效果吧。

深度学习实例分割篇——Mask RCNN原理详解篇

              图2 实例切割效果图

深度学习实例分割篇——Mask RCNN原理详解篇

              图3 关键点检测效果图

Mask RCNN细节梳理

​  咱们先以下图来介绍一下Mask RCNN的整体流程。首要关于一张输入图片,咱们先将其通过特征提取骨干网络得到特征图,然后将特征图送入RPN网络得到一系列候选框,接着运用刚刚得到的候选框,取舍出候选框对应特征图的部分,然后送入ROI Align层【咱们先当成ROI Pooling即可,后文详细介绍】 取得尺寸一致的特征图,然后别离送入分支①(class、box分支)和分支②(Mask分支),分支①用于获取图画中物体的方位和类别信息,分支②用于获取图画中物体的切割信息。

深度学习实例分割篇——Mask RCNN原理详解篇

              图4 Mask RCNN收拾流程

​  关于上述所述的流程咱们能否看懂呢,我觉得分支①和分支②之前的部分咱们应该很熟悉才是,彻底和Faster RCNN一样,不清楚的咱们先点击[3]、[4]补充补充常识。关于分支①,其是Faster RCNN中的分类头和回归头,不知道的咱们自行充能喔,这儿就不介绍了。关于分支②,其便是一个FCN结构,其详细结构如下图所示:

深度学习实例分割篇——Mask RCNN原理详解篇

              图5 Mask分支结构

​  我想这个结构对咱们来说没有什么难度吧,都是一些根底的卷积和转置卷积操作,最终的输出Mask尺寸为2828numcls2828num_{cls},关于coco数据集来说,numcls=80num_{cls}=80【留意:这儿所说的80没有包括背景哦,在一些代码中或许会包括背景】关于RoIAlign的效果便是将输入一致到指定巨细,上图将原始输入HW256HW256一致至14142561414256巨细。RoIAlign的效果和RoIPool的效果是一致的,不过RoIAlign相比RoIPool做了一些优化,详细内容可看本篇附录—>RoIAlign详解部分。

​  其实我感觉介绍到这儿Mask RCNN的主体部分就都讲完了,剩余的便是一些细节部分,让咱们一起来看看吧。



​  首要来看一下论文的立异点,上文提到关于咱们图5中的Mask分支,其实便是一个FCN结构。咱们知道,FCN结构会对每个像素的每个类别猜测一个分数,最终通过softmax得到每个类别的概率,关于这个不知道的可以去阅读我对FCN的相关介绍,我也在这儿放一张介绍FCN时的图片,希望协助咱们了解。

深度学习实例分割篇——Mask RCNN原理详解篇

              图6 FCN猜测类别

​  当咱们运用softmax时,分数高的会按捺分数低的,由于一切类别的猜测概率要满足和为1的条件 。作者以为这使得不同类别之间存在相互竞赛,这被称为是一种耦合联系,是不利于最终的结果的。于是作者希望消除这种耦合,即解耦。由于在Mask RCNN中咱们还有一个分类和回归分支来猜测类别和鸿沟框,因而咱们可以运用分类分支的猜测类别直接提取出对应的Mask,这样就消除了不同类别间的竞赛联系。作者也通过试验证明了这种解耦的方法可以提高检测精度,如下图所示:

深度学习实例分割篇——Mask RCNN原理详解篇

              图7 解耦前后精度对比

​  这儿不知道咱们听懂了没有,没听懂也不要紧,在下文介绍丢失函数的时分我也会为咱们再次介绍。


​  其实啊,关于图4给出的Mask RCNN收拾流程,图中的分支①和分支②部分论文给出了两种结构,如下图所示:

深度学习实例分割篇——Mask RCNN原理详解篇

              图8 Mask分支两种结构

​  可以看出咱们图4中的结构选用的是图8的结构2,这种结构要求Mask RCNN的backbone运用FPN网络(特征金字塔网络),可以看出结构2中class、box分支和Mask分支不共用一个ROI层,这是为了保证mask分支具有更多的细节信息。图8的结构1要求Maks RCNN的backbone选用resnet结构,也即不运用FPN结构。其实我却是以为这两种结构差的不多,或许是作者在试验时发现选用不同backbone不同结构效果不一样吧,目前来说,我觉得咱们无脑用结构2就好,选用FPN对检测小方针的效果会有较大的提高。


​  这部分来谈谈Mask RCNN的丢失,咱们知道Mask RCNN就在Faster RCNN的根底上加上了一个Mask分支,那么Mask RCNN的丢失即为Faster RCNN丢失加上Mask分支的丢失,如下:

​     Loss=Lfaster_rcnn+Lmask=Lrpn+Lfast_rcnn+LmaskLoss=L_{faster\_rcnn}+L_{mask}=L_{rpn}+L_{fast\_rcnn}+L_{mask}

​  Faster RCNN的丢失就不必我介绍了吧,不了解的去看一下写在前面提到的几篇文章,相信你读完后就了解了。这儿重点说一下Mask丢失,其便是一个穿插熵丢失,关于穿插熵丢失可以看看这篇FCN文章的附录部分。那么在Mask RCNN中是怎样核算穿插熵丢失的呢?咱们先来看下图:

深度学习实例分割篇——Mask RCNN原理详解篇

              图9 图片来自B站响雷吧啦Wz

​  首要输入RoIAlign的是一个个候选框,输出的是1414c1414c巨细的特征图,然后通过一系列的卷积、转置等操作得到logits,其是标准为2828numcls2828num_{cls}的特征图,这个进程对应图5。上图描绘的是Mask分支的结构,咱们可以考虑一下运用现在的logits能不能完成切割使命呢?我想这彻底是可行的,由于FCN便是这么做的呀!!!这就回到了上文所述的本论文的立异点上,这儿论文不选用传统FCN的方法完成切割,由于这样会让不同类别之前存在竞赛联系,会导致最终的切割精度下降。这儿咱们会运用class、box分支中的类别信息,比方咱们通过class、box分支会知道当时的候选框的GT类别是cat(猫),于是咱们就提取出logits中对应类别为猫的mask,此刻这个mask是单通道的2828巨细的图画,这样就得到了Mask分支的猜测输出,那么只要和GT核算穿插熵丢失即可。那么GT是什么呢?相同的道理,咱们通过class、box分支知道了候选框的类别是cat,那么咱们将这个候选框在原图对应的GT【注:原图对应的GT是单通道的喔,方针区域为1,背景区域为0】上进行裁剪并将裁剪后图片缩放到2828巨细得到GT Mask,此刻核算GT Mask和Mask分支的丢失即可。

​  还有一点咱们需求留意,图9所述的丢失核算是练习进程中的,其输入RoIALign的候选框是由RPN网络供给的,至于为什么这样做呢?我供给B站响雷吧啦Wz的一个了解,我觉得非常有道理。咱们知道RPN网络供给的候选框是不精确的,一个方针或许会有好多个鸿沟框,如下图所示,非常类似于对方针做随机裁剪,这样起到扩大数据集的效果。

深度学习实例分割篇——Mask RCNN原理详解篇

​  上一部分谈了谈练习进程中的丢失核算,这部分为咱们介绍介绍Mask RCNN的猜测进程,如下图所示:

深度学习实例分割篇——Mask RCNN原理详解篇

              图10 图片来自B站响雷吧啦Wz

​  看了图10,你或许会觉得和图9差不多,但你仔细调查调查就会发现有一些不一样了喔。首要咱们来看看此刻输入Mask分支的候选框来自哪里,通过图10你会发现,其不再和练习阶段一样由RPN网络供给,而是由Fast RCNN网络供给。我想这一部分也非常好了解,在猜测阶段咱们只需求一个最精确的候选框就好了,不再像练习阶段一样需求数据增强,所以直接从Fast RCNN网络中取得候选框即可,FPN中得到的候选框没有通过一系列微调,不精确。通过RoIAlign后,和练习阶段一样咱们会得到一个2828的单通道图片,然后将其缩放到猜测方针候选框相同巨细,接着将其放到原图对应的区域,得到Mask。最终还会设置一个阈值,比方0.5,将刚刚得到的Mask转换为二值图画,详细操作为将猜测值大于0.5的区域设置为前景剩余区域都设置为背景。最终咱们就可以在一张图画上展示出类别信息,鸿沟框信息和Mask信息。

小结

​  Mask RCNN的原理部分就为咱们介绍到这儿了喔,更多细节将在下一篇Mask RCNN源码解析中为咱们介绍,敬请期待吧。

参阅衔接

Mask R-CNN论文

Mask R-CNN网络详解

附录

RoIAlign详解

​  这部分咱们来看看RoIAlign的完成原理,在介绍RoIAlign之前,咱们必需求谈的是咱们为什么不运用传统的RoIPool,也即RoIAlign相较RoIPool有什么优势。【注:RoIAlign和RoIPool的意图是相同的】

​  RoIPool的意图是将原图缩放到一致的巨细,比方原图巨细为88,咱们希望通过RoIPool层后输出22巨细的特征图,咱们只需将原图等分成4份,别离为1、2、3、4,然后对1、2、3、4应用maxPool即可得到22巨细的特征图,大致进程如下图所示:

深度学习实例分割篇——Mask RCNN原理详解篇

              图11 RoIPool

​  现在考虑假如原图的巨细是99,希望通过RoIPool层后的输出相同为22巨细的特征图,此刻2不能被9整除,咱们需求进行量化操作(取整操作),如下图所示:

深度学习实例分割篇——Mask RCNN原理详解篇

              图12 RoIPool量化操作

​  这种量化操作会导致最终的22的特征图的每个像素对应的信息量不同,有点是由16个像素MaxPool得到,有点是由20个像素得到……作者以为这种操作是对切割影响很大的。


​  通过上文的简略描绘,我想你或许了解了RoIPool是怎样运行的了,也知道了RoIPool的量化操作是不利于切割的。其实啊,运用RoIPool总共运用了两次量化操作,如下图所示:

深度学习实例分割篇——Mask RCNN原理详解篇

              图13 RoIPool两次量化

​  首要,咱们输入网络的原图巨细为800800,通过VGG16网络得到特征图。【注:这儿运用VGG16做示范,此网络将原图下采样32倍】此刻特征图长和宽都为80032=25\frac{800}{32}=25。原图中狗的bbox尺寸为665665,通过VGG16相同下采样32倍。可是你会发现66532=20.78\frac{665}{32}=20.78,无法整除,而像素点都是整数,因而咱们需求进行第一次量化操作,取20.78的下界20作为bbox的长和宽。得到2020的bbox后,咱们将其输入RoIPool中,希望输出为77巨细,明显此刻207=2.86\frac{20}{7}=2.86,其仍然是一个小数,此刻需求进行第2次量化操作,相同向下取整,即取2。【注:不知道咱们发现没有,这儿的第2次量化操作和我图12中所描绘的是有一定差异的,这儿直接舍去了一些像素,在我用代码验证进程中,发现运用的是图12的方法,当然了,或许会有一些参数来操控RoIPool完成的方式,感兴趣的可以去搜搜看喔。】

​  介绍完了RoIPool,下面就来为咱们介绍介绍RoIAlign,其没有像RoIPool一样选用量化操作,RoIAlign进程如下图所示:

深度学习实例分割篇——Mask RCNN原理详解篇

              图14 RoIAlign操作

​  从上图可以看出,RoIAlign在RoIPool两次量化时都没有量化,而是保留了小数,这种方法可以较大的提高网络切割效果,至于提高多大,咱们直接来看论文中给的表吧。

深度学习实例分割篇——Mask RCNN原理详解篇

​  这个提高是不是满足震惊的,足足增加了好几个点。提到这儿,我想咱们就知道了RoIAlign是优于RoIPool的,可是好像仍是不太了解这个RoIAlign详细是怎样操作的。这儿我不准备码字为咱们介绍了,引荐咱们去看此视频,咱们可直接跳转到5分50秒观看喔。

如若文章对你有所协助,那就

        

深度学习实例分割篇——Mask RCNN原理详解篇