【论文笔记】物体检测与分割系列 DeepMask

来源:互联网 发布:东方永夜抄 mac 编辑:程序博客网 时间:2024/05/19 22:05

paper: Learning to Segment Object Candidates. FAIR, 2015 NIPS.
code:https://github.com/facebookresearch/deepmask

DeepMask是以分割的思想来做检测,这种方式近来很流行,multi-task的效果通常也比较乐观。
给定一个图片patch,DeepMask做两件事:
(1)生成一个mask,表示patch上每个pixel是否属于物体
(2)得到一个objectness score,表示这个patch的中心是否包含物体的置信度。
DeepMask的关键是同时预测mask和objectness score。这两个任务的大部分参数是共享的,只有最后几层单独使用。模型是基于multi-task的cost function,在COCO上训练得到。

1. 网络结构

训练阶段,网络的一个输入样本k是一个三元组,包括:
(1)image patch xk;
(2)与image patch对应的二值mask,标定每个像素是不是物体,取值为(1,-1);
(3)与image patch对应的标签yk,取值为(1,-1)。

yk=1满足两个条件:
(a)这个patch包含一个大致在中间位置的物体;
(b)物体在一定尺度范围内是全部包含在这个patch里的。
否则yk=-1,包括patch只包含一个物体的一部分的情况。注意只有yk=1的时候,mask才用,yk=-1时不使用mask。

本文使用在ImageNet上预训练的VGG-A模型来初始化网络,包含8个3*3的卷积层、5个2*2的max-pooling层和3个全连接层。由于对分割来说,conv feat map中的空间信息很重要,因此将VGG_A模型中最后所有的FC层都去掉,另外也丢弃了最后一个max pooling层,那么剩下8个卷积层和4个pooling层。
由于卷积层保持空间分辨率不变,只有pooling层会造成空间分辨率减半,所以4个pooling层就会使得图像的分辨率缩小16倍。例如,输入image patch的大小为3*h*w,输出feat map会变成512*(h/16)*(w/16)的输出。
整个网络的前半部分是共享参数的,后半部分网络需要完成两个任务:输出image patch对应的一个mask,以及给出这个patch包含一个物体的score,所以后面会接两个并列的网络(multi-task learning一般都是这样的结构):segmentation和scoring。
这里写图片描述

Segmentation

用于分割的这一支由1个1*1的conv layer接着一个classification layer组成。classification layer用于判断一个pixel是否属于patch中心的物体,它是由两个fc层组成的。
需要注意的是如上图所示,为了减少模型的大小,第二个fc层的输出设为h0w0,(h0<h,w0<w),然后再上采样到h*w大小,以得到h*w每个pixel是否属于物体。

Scoring

用于打分的一支是用来预测一个image patch是否在中心位置包含物体,并且物体的大小合适(最长边小于等于128pixels)。这一支是由1个2*2的max pooling层接着两个fc层构成。最后的输出一个objectness score。
另外,对于中心位置的偏移有一些容忍很关键,因此我们在训练的时候把positive example做一些随机的jitter,来增加模型的鲁棒性。具体的操作是,对于一个“权威”的正样本,即物体位于patch中央,我们给它随机±16像素范围内进行平移,尺度变换在2±1/4范围,还有水平翻转。jitter后的example及其对应的gt mask要发生对应变化,设置其yk=1。
yk=-1的样本表示至少±32pixel偏移或2±1 尺度偏离“权威”的正样本。

2.联合学习

loss function包含两部分,一个是每个pixel的segmentation network,另一个是objectness score,两者都是二值逻辑回归loss的和。
在训练的时候会选择是经过segmentation这一支进行反向传播,还是经过scoring这一支进行反向传播(lamda=1/32),对于scoring这一支,数据经过采样以保证训练的时候正负样本是平衡的。
注意,第一项之前的factor表示我们只在yk=1,即patch包含物体的时候对segmentation这一支的loss进行反向传播。当然我们也可以选择对负样本也进行反向传播(此时把mijk都设为0),但是我们发现只用正样本进行训练有利于泛化到训练时没有见过的物体类别,并且有利于实现high recall。
这里写图片描述

3.整图推断

在整张图的推理中,我们将模型密集地用于多个位置和多个尺度,包括以16 pixel进行滑动,scale从1/4变成2,step=21/2。这是必要的,能够保证对于图片中的每个物体,至少有1个patch能够完全覆盖这个物体(物体在patch中间且大小合适),这一过程在每个图像位置生成一个segmentation mask和一个object score。
下图给出了在图片的单个scale下使用model的segmentation输出。patch是以16为stride在某个尺度上对图片进行滑动得到的。多个位置能够帮助得到3只猴子较好的mask。【最下面一行的猴子mask没有头了哈哈哈】。
这里写图片描述

阅读全文
0 0
原创粉丝点击