Learning to Segment Every Thing
最后更新于
最后更新于
tags: MaskX R-CNN, Mask R-CNN
首先回顾一下YOLO系列论文,YOLO9000通过半监督学习的方式将模型可检测的类别从80类扩展到了9418类,YOLO9000能成功的原因之一是物体分类和物体检测使用了共享的特征,而这些特征是由分类和检测的损失函数共同训练得到的。之所以采用半监督学习的方式训练YOLO9000,一个重要原因就是检测数据的昂贵性。所以作者采用了数据量较小的COCO的检测标签,数据量很大的ImageNet的分类标签做半监督学习的样本,分别训练多任务模型的检测分支和分类分支,进而得到了可以同时进行分类和检测的特征。
之所以在最开始回顾YOLO9000,是因为我们这里要分析的 R-CNN 和YOLO9000的动机和设计是如此的相同:
他们都是在多任务模型中使用半监督学习来完成自己的任务,YOLO9000是用来做检测, R-CNN 是用来做语义分割;
之所以使用半监督学习,因为他们想实现一个通用的模型,所以面临了数据量不够的问题:对比检测任务,语义分割的数据集更为稀缺(COCO的80类,Pascal VOC的20类),但是Visual Genome(VG)数据集却有3000类,108077张带有bounding box的样本;
它们的框架算法都是继承自另外的框架:YOLO9000继承自YOLOv2, R-CNN 继承自Mask R-CNN。
不同于YOLO9000通过构建WordTree的数据结构来使用两个数据集, R-CNN 提出了一个叫做权值迁移函数(weight transfer function)的迁移学习方法,将物体检测的特征迁移到语义分割任务中,进而实现了对VG数据集中3000类物体的语义分割。这个权值传递函数便是 R-CNN 的精华所在。
R-CNN 基于Mask R-CNN(图1)。Mask R-CNN通过向Faster R-CNN中添加了一路FPN的分支来达到同时进行语义分割和目标检测的目的。在RPN之后,FPN和Fast R-CNN是完全独立的两个模块,此时若直接采用数据集C分别训练两个分支的话是行得通的,其实这也就是YOLO9000的训练方式。
图1: Mask R-CNN 流程
图2: R-CNN 流程
图2的整个框架是搭建在Mask R-CNN之上的,除了最重要的权值迁移函数之外,还有几点需要强调一下:
然后一个更精确,更快的的权值迁移函数也是一个非常有研究前景的一个方向,毕竟现在计算机视觉方向的趋势是去掉低效的全连接。
但是 R-CNN 不会这么简单就结束的,它在检测分支(Fast R-CNN)和分割分支中间加了一条叫做权值迁移函数的线路,用于将检测的信息传到分割任务中,如图2所示。
着重强调, 的输入参数是权值(图2中的两个六边形),而非Feature Map;
虽然Mask R-CNN中解耦了检测和分割任务,但是权值迁移函数是类别无关的;
对于一个类别,表示检测任务的权值,表示分割任务的权值。权值迁移函数将看做自变量,看做因变量,学习两个权值的映射函数:
其中的是类别无关的,可学习的参数。 可以使用一个小型的MLP。可以使分类的权值,bounding box的预测权值或是两者拼接到一起。
含有掩码标签和检测标签的COCO数据集定义为,只含有检测标签的VG数据集定义为,则所有的数据集便是和的并集:。图2显示 R-CNN的损失函数由Fast R-CNN的检测任务和RPN的分类任务组成。当训练检测任务时,使用数据集C;当训练分割任务时,仅使用包括分割标签的COCO数据集,即。
训练 R-CNN时,有两种类型:
多阶段训练:首先使用数据集训练Faster R-CNN,得到;然后固定和卷积部分,在使用训练和分割任务的卷积部分。在这里可以看做分割任务的特征向量。在Fast R-CNN中就指出多阶段训练的模型不如端到端训练的效果好;
端到端联合训练:理论上是可以直接在上训练检测任务,在上训练分割任务,但是这会使模型偏向于数据集,这个问题在论文中叫做discrepency。为了解决这个问题, R-CNN在反向计算mask损失函数时停止相关的梯度更新,只更新权值迁移函数中的。
截止到日前,尚无高质量的 R-CNN源码公布,有很多论文中没有涉及的细节尚无处可考,等作者开源之后会继续补充该文章。
仿照YOLO9000的思路, R-CNN使用半监督学习的方式将分割类别扩大到3000类。采用WordTree将分类数据添加到Mask R-CNN中,将分割类别扩大到ImageNet中的类别应该是未来一个不错的研究方向,推测应该很快就有相关进展发表。