何恺明团队:从特征金字塔网络、Mask R-CNN到学习分割一切

图来自learning to segment everything
来源:skrish13.github.io
作者:krish 编译:肖琴
【新智元导读】这篇文章介绍了fair何恺明、tsung-yi lin等人的团队在计算机视觉领域最新的一些创新,包括特征金字塔网络、retinanet、mask r-cnn以及用于实例分割的弱半监督方法。
特征金字塔网络(feature pyramid networks)
让我们以现在著名的feature pyramid networks(fpn)[1]开始,这是在cvpr 2017发表的论文,作者tsung-yi lin,何恺明等人。fpn的论文真的很棒。构建一个每个人都可以在各种任务、子主题和应用领域中建立的基准模型并不容易。在详细讨论之前,我们需要了解的一点是:fpn是resnet或densenet等通用特征提取网络的附加组件。你可以从你喜欢的dl库中得到想要的预训练fpn模型,然后像其他预训练模型一样使用它们。
物体是以不同的的scale和size出现的。数据集无法捕获所有这些数据。因此,可以使用图像金字塔(图像的多种缩小比例),以使cnn更易处理。但这太慢了。所以人们只使用一个单个scale的预测,也可以从中间层进行预测。这跟前一种方法有点像,但这是在特征空间上进行的。例如,在几个resnet块之后放一个deconv,并获得分割输出(分类也类似,可以是1x1 conv和globalpool)。
fpn的作者找到了一种改进上述方法的聪明方法。不是仅仅具有横向连接,而是将自上而下的pathway也放在上面。这非常合理!他们使用一个简单的mergelayer(mode ='addition')来组合两者。这个想法的一个关键点是,较低层(比如初始的conv层)的特征语义信息比较少,不足以用来进行分类。但是更深层的特征可以用于理解。在这里,你还可以利用所有自上而下的pathway fmaps(特征地图)来理解它,就像最深的层一样。这是由于横向连接和自上而下的连接相结合形成的。
fpn论文的一些细节
金字塔(pyramid):即属于一个stage的所有大小相同的输出图。最后一层的输出是金字塔的参考fmaps。例如:resnet - 第2,3,4,5个block的输出。根据内存的可用性和特定任务,你可以根据需要改变金字塔。横向连接(lateral connection):1x1 conv和top-down pathway是2x的上采样。这个想法来自于顶部特征,同时向下产生粗糙的特征,而横向连接则增加了从下往上的路径中更精细的细节。如下图所示。这篇论文只描述了一个简单的demo。它只是展现了这个想法在简单的设计选择中表现非常好,你可以做得更大、更复杂。
正如我前面所说,这是一个基础网络,可以在任何任务上使用,包括目标检测,分割,姿态估计,人脸检测等等。论文发布后几个月的时间,已经得到100多个引用!论文的标题是fpns for object detection,因此作者继续将fpn用作rpn(region proposal network)和faster-rcnn网络的baseline。更多关键细节在论文中有更全面的解释,这里只列出一部分。
实验的一些要点:
用于rpn的fpn:用fpn替换单一尺度的fmap。它们对每个级都有一个单一尺度的anchor(不需要多级作为其fpn)。它们还表明,金字塔的所有层级都有相似的语义层级。faster rcnn:他们以类似于图像金字塔输出的方式观察金字塔。因此,使用下面这个公式将roi分配到特定level。
是w,h=224,224时映射的level。其中w,h分别表示宽度和高度。k是分配roi的level。k0是w,h=224,224时映射的level。他们对每个模块的工作进行消融实验,以证实论文开头的宣称。他们还基于deepmask和sharpmask这两篇论文展示了如何将fpn用于segmentation proposal生成。请阅读原论文了解实现细节和实验设置等。
代码
61 官方caffe2 - https://github/facebookresearch/detectron/tree/master/configs/12_2017_baselines
61caffe - https://github/unsky/fpn
61pytorch - https://github/kuangliu/pytorch-fpn (just the network)
61mxnet - https://github/unsky/fpn-mxnet
61tensorflow - https://github/yangxue0827/fpn_tensorflow
retinanet——密集对象检测的focal loss函数
retinanet跟上面的fpn来自同一团队,第一作者也都是tsung-yi lin。这篇论文发表于iccv 2017,并且获得当年的最佳学生论文。
这篇论文有两个关键想法——称为焦点损失(focal loss,fl)的损失函数和称为retinanet的single stage物体检测网络。该网络在coco物体检测任务上表现非常出色,同时也击败了前面的fpn benchmark。
focal loss
focal loss是很聪明的想法,而且很简单!如果你已经熟悉加权损失,这个与加权损失基本相同,但具有更聪明的权重,将更多的注意力集中在对困难的样本进行分类。公式如下:
其中γ是一个可以改变的超参数。
是来自分类器的样本的概率。如果设γ比0大,将减小分类号的样本的权重。
是正常加权损失函数中类的权重。在论文中它被表示为α-balanced loss。需要注意的是,这是分类损失,并与retinanet中物体检测任务的平滑l1损失相结合。
retinanet
fair发布这个single stage的检测网络,很是令人惊讶。直到现在,在 single stage 的目标检测中,占据主导地位的仍是yolov2和ssd。但正如作者指出的那样,这两个网络都没有能够非常接近sota方法。retinanet做到了这一点,同时它是one stage而且快速的。作者认为,最好的结果是由于新的损失,而不是由于一个简单的网络(它后端是一个fpn)。 one stage的检测器将在背景与positive classes之间存在很多不平衡(而非positive classes内部的不平衡)。他们认为,加权损失函数只是针对平衡,但fl则针对简单/困难的样本,同时也表明两者可以结合起来。
代码
61official caffe2 - https://github/facebookresearch/detectron/tree/master/configs/12_2017_baselines
61pytorch - https://github/kuangliu/pytorch-retinanet
61keras - https://github/fizyr/keras-retinanet
61mxnet - https://github/unsky/retinanet
mask r-cnn
再次,mask r-cnn也来自fair何恺明团队,论文发表在iccv 2017。mask r-cnn用于目标实例分割。简单来说,目标实例分割基本上就是对象检测,但不是使用边界框,它的任务是给出对象的精确分割图!
tl;dr :如果你已经了解faster r-cnn,那么mask r-cnn就很好理解了,就是为分割增加另一个head(branch)。所以它有3个branch,分别用于分类、bounding box regression和分割。
下面的解释假设你已经对faster r-cnn有一定了解:
mask r-cnn与faster r-cnn相似,faster r-cnn是two-stage的,其中第一个stage是rpn。添加一个预测分割mask的并行分支——这是一个fcn。loss是
的和roilign layer而不是roipool。这就不会像roipool那样将(x / spatial_scale)分数舍入为整数,相反,它执行双线性插值来找出那些浮点值处的像素。例如:想象一下,roi的高度和宽度分别为54,167。空间尺度基本上是图像大学/ fmap大学(h / h),在这种情况下它也被称为步幅(stride)。通常224/14 = 16(h = 224,h = 14)。71roipool: 54/16, 167/16 = 3,10
71roialign: 54/16, 167/16 = 3.375, 10.4375
71现在我们可以使用双线性插值来进行上采样。
71根据roialign输出形状(例如7x7),类似的逻辑将相应的区域分成适当的bins。
71感兴趣的话可以看看chainer的roipooling的python实现,并尝试自己实现roialign
71roialign代码可以在不同的库中使用,请查看下面提供的代码库。
它的主干是resnet-fpn代码
61官方 caffe2 - https://github/facebookresearch/detectron/tree/master/configs/12_2017_baselines
61keras - https://github/matterport/mask_rcnn/
61pytorch - https://github/soeaver/pytorch_mask_rcnn/
61mxnet - https://github/tusimple/mx-maskrcnn
学习分割一切(learning to segment everything)
文如其名,这篇论文是关于分割的。更具体的说,是关于实例分割的。计算机视觉中用于分割的标准数据集非常小,对现实世界的问题不足以有效。即便到了2018年,创建于2015年的coco数据集仍然是最流行、最丰富的数据集,尽管它只有80个物体类别。
相比之下,对象识别和检测的数据集(例如openimages [8])具有用于分类任务的6000个类别和用于检测的545个类别。话虽如此,斯坦福大学还有另一个名为visual genome的数据集,其中包含3000个物体类别!那么,为什么不使用这个数据集呢?因为每个类别中的图像数量太少,因此dnn在这个数据集上并不会真正起作用,所以即使它更丰富,人们也不会使用这个数据集。而且,这个数据集没有任何分割注释,只有3000个类别的对象检测的边界框(bounding boxes)标签可用。
让我们回到learning to segment everything这篇论文。实际上,边界框(bounding box)和分割注释(segmentation annotation)对于域来说并没有太大的区别,仅仅是后者比前者更精确。因此,因为visual genome数据集有3000个类,为什么不利用这个数据集来做实例分割呢?fair何恺明团队正是这样做的。这可以被称为弱监督(或弱半监督?)学习,也就是说你没法完全监督你想要实现的任务。它还可以与半监督相关联,因为它们都使用coco + visual genome数据集。这篇论文是迄今为止最酷的。
它是建立在mask-rcnn之上的同时在有mask标注和无mask标注的输入上训练在mask和bbox mask之间添加一个weight transfer函数当无mask标注的输入通过时,wseg 预测将于马萨卡 features相乘的权重;当有mask标注的输入通过时,不使用这个函数,代而使用一个简单的mlp。如下图所示。a是coco数据集,b是vg。注意不同输入的两个不同路径。
由于没有注释可用,作者无法在vg数据集上显示精确度,因此他们把这个想法应用到可以证明结果的数据集上。pascal-voc有20个类别,而且这些类别在coco中都很常见。因此,他们使用voc分类标签进行训练,并且只使用来自coco的bbox标签对这20个类别进行训练。结果显示在coco数据集中20个类的实例分割任务上。反之亦然,因为这两个数据集都有ground-truth。结果如下表所示:
references:
[1] lin, tsung-yi, piotr dollár, ross b. girshick, kaiming he, bharath hariharan and serge j. belongie. “feature pyramid networks for object detection.” *2017 ieee conference on computer vision and pattern recognition (cvpr)* (2017): 936-944.
[2] lin, tsung-yi, priya goyal, ross b. girshick, kaiming he and piotr dollár. “focal loss for dense object detection.” *2017 ieee international conference on computer vision (iccv)* (2017): 2999-3007.
[3] he, kaiming, georgia gkioxari, piotr dollár and ross b. girshick. “mask r-cnn.” *2017 ieee international conference on computer vision (iccv)* (2017): 2980-2988.
[4] hu, ronghang, piotr dollár, kaiming he, trevor darrell and ross b. girshick. “learning to segment every thing.” *corr*abs/1711.10370 (2017): n. pag.
[5] ren, shaoqing, kaiming he, ross b. girshick and jian sun. “faster r-cnn: towards real-time object detection with region proposal networks.” *ieee transactions on pattern analysis and machine intelligence* 39 (2015): 1137-1149.
[6] chollet, fran04ois. “xception: deep learning with depthwise separable convolutions.” 2017 ieee conference on computer vision and pattern recognition (cvpr) (2017): 1800-1807.
[7] lin, tsung-yi, michael maire, serge j. belongie, james hays, pietro perona, deva ramanan, piotr dollár and c. lawrence zitnick. “microsoft coco: common objects in context.” eccv (2014).
[8] krasin, ivan and duerig, tom and alldrin, neil and ferrari, vittorio et al. openimages: a public dataset for large-scale multi-label and multi-class image classification. dataset available from https://github/openimages
[9] krishna, ranjay, congcong li, oliver groth, justin johnson, kenji hata, joshua kravitz, stephanie chen, yannis kalantidis, david a. shamma, michael s. bernstein and li fei-fei. “visual genome: connecting language and vision using crowdsourced dense image annotations.” international journal of computer vision 123 (2016): 32-73.
原文:https://skrish13.github.io/articles/2018-03/fair-cv-saga