项目:https://cs.stanford.edu/people/karpathy/densecap/

论文:https://arxiv.org/abs/1511.07571

代码:https://github.com/jcjohnson/densecap


    李飞飞组的文章,是一篇很有意思的文章,主要介绍了一种CNN解决密集字幕任务的方法。密集字幕任务主要含两个方面: 


(1)单个单词描述的目标检测任务;

(2)对整个图像的一个预测区域的字幕标注任务。具体任务需求如下:

图像标注:DenseCap: Fully Convolutional Localization Networks for Dense Captioning

文章主要提出了全卷积定位网络(FCLN)架构,无需外部区域的建议,并可以用单轮优化进行端对端的训练。该架构包含一个卷积网络,一个新的密集定位层,一个生成标签序列的递归神经网络的语言模型。 采用的数据集还是李飞飞组的,含94000图像和4,100,000个区域字幕。


先看看denesecap的效果, 

图像标注:DenseCap: Fully Convolutional Localization Networks for Dense Captioning 
对比之前的Image Caption 
图像标注:DenseCap: Fully Convolutional Localization Networks for Dense Captioning
由单目标变成了多目标。就好比之前的Image Classfication 发展到 Object Detection,其实Image Caption发展到densecap本质上也是借鉴了Faster RCNN进行Object Detection的手法。在一个前向运算中就完成了 Proposal 和 Caption的工作。来看下Image Caption的结构 

图像标注:DenseCap: Fully Convolutional Localization Networks for Dense Captioning 
本质上是将Image经过卷积后得到的向量作为LSTM的输入,最后得到一个词的序列。

图像标注:DenseCap: Fully Convolutional Localization Networks for Dense Captioning
而RPN网络便是将单目标任务变成多目标任务的大杀器。

Image Caption + Faster RCNN = densecap 

文章的目标是设计一种网络结构使得感兴趣区域定位和自然语言的描述相结合,做到端到端的训练使得单一步骤优化的支持。方法主要基于Faster R-CNN,将其RoI pooling部分改成了双线性插值。其网络结构示意图如下

图像标注:DenseCap: Fully Convolutional Localization Networks for Dense Captioning
本文主要讲解紫色框图Localisation Layer的工作机理。

Localisation Layer接收原始图像经过VGG16处理以后的C x W’ x H’特征向量,最终目标是处理成B x C x X x Y大小的区域特征,经过几个全连接层后处理成B x D大小的可供LSTM处理的向量,最终生成语句。其中B是proposal的数量,C、D、X、Y、W’、H’都是固定大小的数值,由网络结构确定。

其中工作的难点集中在两个,其一是如何去筛选合格的proposal来提交给LSTM,滑动窗口千千万,最后我只要三百。其二是将大小不同的proposal映射到相同大小的X x Y窗口,毕竟LSTM只接受固定大小的输入,而且要保证该过程使误差可反向传播。

1.筛选proposal

该部分的讲解与RPN网络讲解类似,首先在W’ x H’个位置上生成k个大小形状不同的anchor,anchor的位置偏移x,y、形状偏移w,h加上score评分最终生成5k x W’ x H’个参数,在这么多anchor中,与groudtruth计算重合度,超过0.7就认为是前景positive,低于0.3就认为是背景negative,并以此训练,score就能被训练成判断前景还是背景的一个分值。

最终海选pk,选出最牛逼的B个proposal参加最后的决赛。

2.双线性插值

proposal出来了以后,形状不一大小不一,如何映射到相同的框框X x Y呢,在Faster RCNN中,采用的办法叫做ROI Pooling Layer,它呢就是根据proposal的大小,选取不同大小的pooling窗口,最后的结果都是X x Y。

那在这里呢,作者采用了一个名为双线性插值法的映射方法来替代ROI Pooling layer, 原因是ROI pooling Layer确实可以反向传播误差,但只能训练原有的特征,不能训练特征的坐标。这下牛逼了,连映射函数都能训练了。原话是Gradients can be propagated backward from the output features to the 
input features, but not to the input proposal coordinates.

在图中的粉色框框右上角,可以看到有个叫Sampling Grid的东东,大小是B x X x Y x 2,那么也就是说每个proposal都单独享有一组映射参数X x Y x 2,这组参数就能将W’ x H’映射到X x Y。其实非常容易理解,看paper的公式是这么写的, 

图像标注:DenseCap: Fully Convolutional Localization Networks for Dense Captioning 
一脸懵逼.jpg。其实说白了就是在X x Y位置上都存了一个W’ x H’的x,y坐标,然后就有X x Y x 2个参数了,映射的时候,就在X x Y对应位置上去找那个坐标就完事了,简单粗暴。

那么这个映射坐标是怎么来的呢,这个叫做双线性插值法,自行百度,十分容易理解,在这里就不花大篇幅粘贴别人的东西了。

最后把这些proposal特征输送个全连接层,再把锅甩给LSTM,就能生成十分naive的句子啦。

相关文章: