论文题目:Learning to SegmentObject Candidates
出处:arXiv 2015
主要贡献:经典的目标检测系统主要包括两个部分:提取proposal、将每一个候选proposal输入进行目标分类。本文则提出另一种思路:基于discriminative convolutional network的方法。
该模型将两个部分进行合并:输入图像patch,输出一个segmentation mask;然后第二部分判断是一个特点目标的可能性大小。在test时候,模型可以产生一系列segmentation mask,每一个mask对应是各种目标的可能性分数。
proposal和 detection两部分共享大部分网络,网络精简且效率高; 得到的proposal 数目更少,但是recall却非常的高(proposed regions最大程度包含可能存在目标的区域);文章的准确度大幅度的提高。
算法框架:
输入:训练阶段,网络的一个输入样本k是一个三元组,包括:
(1)image patch xk;
(2)与image patch对应的二值mask,标定每个像素是不是物体,取值为(1,-1);
(3)与image patch对应的标签yk,取值为(1,-1)。
注: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的输出。
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的输出,第二层把512*1*1的输出变成大小为h0(56)*w0(56)*1的mask,两层中间没有ReLU非线性。h0和w0都小于原image大小,所以还要经过上采样恢复原图大小。
Scoring:用于打分的分支由一个2*2的max-pooling层后接两个全连接层组成,两层之间带有ReLU非线性。最终的输出是一个objecness score,指示输入patch的中心是否有物体存在。
输出:输出一个mask,以及给出这个patch包含一个物体的score
细节实现:
1, Lossfunction: 包含两部分,一个是每个pixel的segmentation network,另一个是objectness score,两者都是二值逻辑回归loss的和。
在训练的时候会选择是经过segmentation这一支进行反向传播,还是经过scoring这一支进行反向传播(lamda=1/32),对于scoring这一支,数据经过采样以保证训练的时候正负样本是平衡的。 注意,第一项之前的factor表示我们只在yk=1,即patch包含物体的时候对segmentation这一支的loss进行反向传播。
2、整图推断:在整张图的推理中,我们将模型密集地用于多个位置和多个尺度,包括以16 pixel进行滑动,scale从1/4变成2,step=根2。这能够保证对于图片中的每个物体,至少有1个patch能够完全覆盖这个物体(物体在patch中间且大小合适),这一过程在每个图像位置生成一个segmentationmask和一个object score。 下图给出了在图片的单个scale下使用model的segmentation输出。patch是以16为stride在某个尺度上对图片进行滑动得到的。多个位置能够帮助得到3只猴子较好的mask。
注意到,segmentation分支的下采样因子是16,scoring分支的是32,为了获得从mask预测到object score的一对一映射,在scoring分支最后一个max-pooling层前应用了一个交织的trick来double它的空间分辨率。
3、训练时,一个输入patch被标记是包含一个典型的正样本,如果有物体在patch的正中间并且最大维度正好等于128像素。然而,给一个物体在patch中的位置一些容忍度是很关键的,因为在full image inference时多数物体都是和它的典型位置有一些偏移的。因此在训练时,随机抖动每个典型的正样本来增加模型的鲁棒性。具体来讲,在±16像素范围内进行平移,尺度变换在2的±1/4次方范围,还有水平翻转。在所有情况下都是对image patch和它的ground truth mask一起做同样的变换,每个都assign一个正的label。负样本是任何patches至少有±32像素的平移或者2的±1次方的尺度 from 任何典型正样本。