论文阅读:Instance-aware semantic segmentation via Multi-task Network Cascades (MNC)

论文信息:CVPR2016, PASCAL VOC in VGG 63.5% mAP. COCO2015 in resnet101 won first prize

这边最近在做一个关于instance segmentation的项目,所以这周的主要内容是看了一篇关于instance segmentation的文章,下面是文章的主要内容,自己也在相关数据集上训练了一下,并在这个基础上进行后续项目开发。

整体框架:对于传统的多任务方法,都是在共享特征的基础上,每个任务同时进行各不干扰,互相独立。这篇文章是在共享特征的基础上,上一个任务依赖于下一个任务,如此形成级联式的多任务结构(Multi-task Network Cascade,MNC)。



三个任务:(1)Differentiating instances;(2)Estimating masks;(3)Categorizing objects;

使用VGG16的第13层卷积层特征作为共享特征。每个阶段包含一个loss,下一阶段的loss依赖于前一阶段loss,故三个阶段的loss都不是独立的。

任务一:differentiating instance—>regressing box-level instances,该阶段的主要任务找出所有可能的物体框,即使用Faster RCNN中的RPN网络,使用NMS得到 top-ranked 300个box;
这一阶段的主要实现就是在共享特征的基础上附加一个3*3的卷积层用于降维以及1*1的卷积用于目标框定位和目标分类。因此在这一阶段的loss,作者直接使用的是RPN的loss,即:

任务二:estimating masks—>regressing mask-level instances,该阶段的主要任务是以共享特征和上一阶段的得到的bounding box作为输入,输出基于box的pixel-level 的mask,不过此时的mask是class-agnostic,即无法对mask进行类别区分。

这一阶段的主要实现是在task1 输出的不同大小的box上使用ROI warping Pooling产生固定大小的特征:14*14大小的feature map,在此基础上为每个box附加两个fc层:fc1(256)+fc2(m*m,28*28),这里的28*28是预先设定的mask的分辨 。因此这一阶段的task不仅是依赖于mask还依赖于box,所以这一阶段的loss,即:

任务三:categorizing objects—>categorizing instances,该阶段的主要任务是以共享特征,task1的box,task2的mask作为输入,输出每个instance的categories scores。

这一阶段的主要实现是,一方面,在ROI warping pooling 的基础上连接两个fc层:fc1(4096)+fc2(4096);另一方面对task2得到的mask 也连接两个fc层:fc1(4096)+fc2(4096);然后再对这两个通道进行concat,最后得到每个instance的得分。因此这一阶段的计算量比较大,也是导致整个MNC模型巨大的原因。这一阶段的loss,如下:

End-to-end training

整个MNC网络结构的loss function如下:

MNC主要的技术挑战就是对上面的loss function 如何可以应用链式法则进行反向传播,实现end-to-end training。在fast R-CNN论文中使用的RoI pooling 的预测框是经过预训练的,是固定的,它的反向传播只考虑F(Θ) ,但我们现在必须同时考虑Bi(Θ),而在这里得 的预测框确实在不断变化。但是,实际上task2中的框是由task1给出的,那么task2的loss就不只是依赖mask,还依赖框。这导致了无法对这部分以end to end的方式来训练,因为无法同时对这两部分求导。 为了解决上述问题,作者把ROI pooling分为了两部分:ROI warping 与 pooling。ROI
warping的具体实现可以看原文。

原文代码:https://github.com/daijifeng001/MNC

下面是我在PASCAL VOC上的一个子数据集SBD上训练后的测试结果

代码运行错误记录

1.cudnn相关问题

由于MNC基于faster
rcnn,而其中caffe版本较低,对cudnn版本要求较高,可能出现不兼容的问题,在编译MNC工程中的caffe-mnc时,需要把其中src/caffe/layers/目录下的关于cudnn的文件全部替换成最新版caffe中的文件。

2.编译lib文件错误

Question1.

ImportError:No module named Cython.Distutils

Solution1.

1
sudo pip install cython

Question2.

x86_64-linux-gnu-gcc: error:utils/bbox.c: No such file or directory

x86_64-linux-gnu-gcc: fatalerror: no input files

Solution2.

1
2
cd MNC/lib/utils
cython bbox.pyx

Question3.

x86_64-linux-gnu-gcc:error: nms/cpu_nms.c: No such file or directory

x86_64-linux-gnu-gcc:fatal error: no input files

Solution3.

1
2
cd MNC/lib/nms
cython cpu_nms.pyx

Question4.

AttributeError: ‘module’ object has no attribute ‘text_format’

Solution4.

在MNC/train_net.py 文件中添加 mport google.protobuf.text_format

Question5.

AttributeError: ‘module’ object has no attribute ‘text_format’

Solution5.

在MNC/train_net.py 文件中添加 mport google.protobuf.text_format

Question6.

TypeError: ‘numpy.float64’ object cannot be interpreted as an index

Solution6.

1
sudo pip install -U numpy==1.11.0