实例分割,是将物体检测和语义分割两者结合的任务,目的是在语义分割的同时,即便同一个类的物体之间,也会区别不同的个体。比如道路上两辆车,语义分割会将这两辆车划分为同一个颜色,也就是同一类;而实例分割则会将这两辆车划分为两个颜色,区别出这两辆车。
这篇文章便给出了一个很简单、可扩展,并且稳定性高的模型——Mask RCNN,来进行实例分割,这个模型还是以Faster RCNN为基础的(手动佩服Kaiming大神,刷引用的最好的方式就是自己引用自己,各个都是神作)。下面具体来看一下:
直观上来看,Mask RCNN就是扩展自Faster RCNN,然后添加了一个mask的分支。在Mask RCNN的模型里面,确实也是沿用了绝大部分的Faster RCNN的网络结构,输出的是物体的类别,以及Bbox的位置。但是为了去做实例分割,Mask RCNN还需要一个像素级别的分割输出,因此文章在Faster RCNN的基础上增加了第三个输出mask的分支。这个新增的分支,需要pixel level的信息,特别是图片中的空间信息,而原本的Faster RCNN是弱化了空间的相关信息(ROI polling的时候格外明显),所以文章提出了本文最大的一个创新点,ROI align,这一机制直接将原本ROI polling过程中忽略,或者放弃的信息,有效地利用了起来,每一个像素的信息都会发生作用(具体的ROI pollig和ROI align的区别可以自行查阅,划重点,面试必考,送分题!)。
对每个ROI都会输出一个mask的二值图,这个二值图是K×m×m的,其中K是总的类别(每个类别都会输出一个mask),m×m是ROI的大小,在mask的loss中,只有gt的那一类会起效(cross entropy)。文章表示,这个loss是获得如此好结果的关键。
文章提出,将mask和prediction分离(解耦)很重要,也就是对每一个像素,针对所有类别,分别做一个mask的二分类,然后再用ROI的方式来做类别的预测,这样的话,类别之间就不会产生互相的影响和竞争机制;但FCN模型就将mask和class prediction放在了一起进行处理,也就是说直接对每一个像素进行分类。(个人理解:毕竟FCN初衷是做语义分割,并不去要区分具体的类内物体,所以这样做会效率更高一些)
文章提到,Mask RCNN是一个instance first,也就是首先去做实例相关的网络,而不像之前的一些工作,是segmentation first,也就是先做语义分割,再去做实例分割。因为我并不是搞分割的,所以文章里面提到的一些分割的related work我并不是太懂,后面有机会再来了解一下。
具体的结果,还有模型的结构,文章里写的都比较清晰,结构也很简单,这些就不贴了。