一、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
- Scoring
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。