Facebook的物体分割新框架研究2——DeepMask

来源:互联网 发布:落跑甜心 知乎 编辑:程序博客网 时间:2024/06/11 06:17

一、DeepMask【Learning to Segment Object Candidates.2015 NIPS


一句话,DeepMask是干啥的:产生region proposal的!


纳尼?不知道region proposal是什么?来复习一下最近的物体检测系统,如Faster R-CNN(参考博主的相关笔记),都是两个步骤:先产生一系列的object proposal(Faster R-CNN里的RPN网络干的就是这活儿),然后送入一个object classifers进行分类(Fast R-CNN)。


整体来讲,给定一个image patch作为输入,DeepMask会输出一个与类别无关的mask和一个相关的score估计这个patch完全包含一个物体的概率。它最大的特点是不依赖于边缘、超像素或者其他任何形式的low-level分割,是首个直接从原始图像数据学习产生分割候选的工作。还有一个与其他分割工作巨大的不同是,DeepMask输出的是segmentation masks而不是bounding box。【masks其实就是每个像素都要标定这个像素属不属于一个物体,bounding box是比较粗略的】


1.网络结构

首先搞清楚网络输入,训练阶段,网络的一个输入样本k是一个三元组,包括:(1)image patch xk;(2)与image patch对应的二值mask,标定每个像素是不是物体;(3)与image patch对应的标签yk,yk=1需要满足两个条件:一是这个patch包含一个大致在中间位置的物体,二是物体在一定尺度范围内是全部包含在这个patch里的。否则yk=-1,包括patch只包含一个物体的一部分的情况。注意只有yk=1的时候,mask才用,yk=-1时不使用mask。


网络结构图:


显然,本文用了ImageNet上预训练好的VGG-A模型来初始化网络,包含8个3*3的卷积层、5个2*2的max-pooling层和3个全连接层。做的改动是去掉VGG-A最后的3个全连接层以及最后的1个pooling层,那么剩下8个卷积层和4个pooling层。由于卷积层保持空间分辨率不变,只有pooling层会造成空间分辨率减半,所以4个pooling层就会使得图像的分辨率缩小16倍。所以原来是h*w*3的输入,会变成(h/16)*(w/16)*512的输出(h=w=224的时候就是上图中14*14*512的输出啦)。好让我们继续往下走,刚才说网络需要完成两个任务:输出一个mask,以及给出这个patch包含一个物体的score,所以后面会接两个并列的网络(multi-task learning一般都是这样的结构):segmentation和scoring。


  • Segmentation
         用于分割的分支由一个1*1的卷积层后接一个分类层组成。

         分类层希望有h*w个pixel分类器,每个分类器都负责判断某个像素是否属于位于patch中心的那个物体。但是原图太大啦,所以缩小成h0*w0,那么就有h0*w0个pixel分类器啦。注意:我们希望输出平面上的每一个pixel分类器都能够利用整个512*14*14大小的feature map的信息,这样就能够“看到”整个物体,这一点很重要,因为即使存在着好几个物体,网络输出的也只是对一个物体的mask。

         分类层怎么实现的呢?把分类层分解为两个线性层,第一层把512*14*14的feature map变为512*1*1的输出【博主猜是14*14*512的卷积层,或者是像Fast R-CNN里RoI pooling层那样的映射,每个通道映射为1个值,一共512个输入通道所以输出就是512*1*1啦】,第二层把512*1*1的输出变成大小为h0(56)*w0(56)*1的mask【一个FC层就可以,可以看做是1*1*3136的输出嘛~】,两层中间没有ReLU非线性。h0和w0都小于原image大小,所以还要经过上采样恢复原图大小。
  • Scoring
         用于打分的分支由一个2*2的max-pooling层后接两个全连接层【博主注意到上面的结构图里第一个所谓的全连接层是将512*7*7的输入变成512*1*1的输出,而且看这意思好像是输出的每个通道只和输入的相应通道的14*14个神经元连接,每个通道独立进行的,跟传统意义上全连接似乎不太一样呢~但它和segmentation的第一个线性层画得一样,这就印证了博主的想法:这两个网络的第一个由512*14*14或者512*7*7映射到512*1*1的应该是每个通道独立进行的FC层,和Fast R-CNN里RoI pooling层一样】组成,两层之间带有ReLU非线性。最终的输出是一个objecness score,指示输入patch的中心是否有物体存在。

       

2.联合学习

由于有两个优化任务,所以loss function肯定是两项啦:


反向传播在segmentation分支和scoring分支交替进行就好了~


3.整图推断

整张图时,在图像的各种位置和尺寸上密集地应用这个模型,stride是16像素,缩放尺度在1/4到2(步长根号2),那么在每个图像位置都会给出一个分割mask和object score。

注意到,segmentation分支的下采样因子是16,scoring分支的是32(因为多了一个max pooling),为了获得从mask预测到object score的一对一映射,在scoring分支最后一个max-pooling层前应用了一个交织的trick来double它的空间分辨率。

4.其他细节

训练时,一个输入patch被标记是包含一个典型的正样本,如果有物体在patch的正中间并且最大维度正好等于128像素。然而,给一个物体在patch中的位置一些容忍度是很关键的,因为在full image inference时多数物体都是和它的典型位置有一些偏移的。因此在训练时,随机抖动每个典型的正样本来增加模型的鲁棒性。具体来讲,在±16像素范围内进行平移,尺度变换在2的±1/4次方范围,还有水平翻转。在所有情况下都是对image patch和它的ground truth mask一起做同样的变换了啦,每个都assign一个正的label。负样本是任何patches至少有±32像素的平移或者2的±1次方的尺度 from 任何典型正样本。

结构设计和超参数选择使用MS COCO验证数据的子集,和evaluation阶段的数据不重叠。

学习率设为0.001,随机梯度下降的batch size是32个样本,momentum设为0.9,weight decay设为0.00005。

0 0
原创粉丝点击