论文解读:DenseCap: Fully Convolutional Localization Networks for Dense Captioning

本篇论文解读的排版主要参见原文的格式,针对原文中的每一个小节进行展开,有的是对原文的一个提炼和简单概括,有的是对原文中涉及但是又没有详细介绍的技术的补充和说明。
原文连接:https://cs.stanford.edu/people/karpathy/densecap/
作者个人主页:https://cs.stanford.edu/people/jcjohns/
PS:本篇博文不是对原文的简单翻译,论文中每一处涉及到的知识点以及论文中没有提及的技术细节,本文都会做一定的补充说明,如果还有什么看不懂的地方的话,可以留言一起讨论,我会尽量在24小时内回复。

<div align=center>

[图片上传失败...(image-f8be6-1540209330519)]

0.摘要

  这篇文章的主要工作是对图像的dense captioning。所谓dense captioning,就是要描述的对象不再是一幅简单的图片,而是要将图片中的许多局部细节都都用自然语言描述出来。这篇文章所做的工作可以说是object detection和image captioning的一般化,即当描述的语言是一个单词的时候,就可以看作是object detection,当描述的对象是整幅图片的时候,就成了普通的image captioning。
这篇文章的主要贡献在于提出了一个Fully Convolutional Localization Network(FCLN)网络结构,该网络结构可以进行端到端式的训练,无需额外的候选区域生成模型(以及整合到网络内部),只需要进行一轮优化和前馈计算就可以得到输出结果。
网络模型有三部分组成:卷积网络(Convolutional Network)、密集定位层(dense localization layer)和RNN语言模型。

1.介绍

  本小节主要介绍了dense cationing任务的定义,以及相对应的object detection和image caotioning方面的研究。大家可以自己看一下原文

2.相关工作

  这里只给出重要的2篇论文(作者主要是在这两篇论文的几处上进行模型构建的),其他的可以参见原文
Faster R-CNN
http://papers.nips.cc/paper/5638-faster-r-cnn-towards-real-time-object-detection-with-region-proposal-networks
Deep Visual-Semantic Alignments for Generating Image Descriptions
https://cs.stanford.edu/people/karpathy/deepimagesent/

3.模型

3.0总览

目标:设计一个可以标定出感兴趣区域并且用自然语言描述其中内容的网络框架模型
挑战与难点:在兼顾高效性和有效性的前提下,开发出一个可以支持端到端训练并且只需一次优化的模型

3.1模型框架

<div align=center>
[图片上传失败...(image-417379-1540209330519)]

3.1.1卷积网络(Convalutional Network)

  作者采用了基于VGG-16的网络结构,包含13层卷积核为3×3的卷积层和4层池化核为2×2的最大池化层(原本的VGG是5层池化层,这里作者做了一些小改动,改为4层),因此,对于大小为3×W×H的图片,经过卷积网络后,输出结果是C×W'×H'的特征图谱,这里C=512W’=\lfloor\frac{W}{16}\rfloorH’=\lfloor\frac{H}{16}\rfloor,该特征图谱就是下一层Fully Convolutional Localization Layer的输入。

3.1.2全卷积定位层(Fully Convolutional Localization Layer)

输入和输出

输入
: 来自卷积网络的特征图谱C×W'×H'(size任意)

输出
: 输出B个候选区域的表征向量(定长),每个特征向量都包含下面三个关键信息:

  • 候选区域的坐标:输出形式是一个B×4的矩阵,每行代表一个候选区域的坐标
  • 候选区域的置信分数:一个长度为B的一维列向量,向量内每个元素都给出了候选区域的得分。得分越高说明越可能是真实区域
  • 候选区域的特征:输出形式为B×C×X×Y的特征集合,这里B代表区域个数,X×Y表示特征图谱的大小(注意,这里的size已经是固定的),C代表特征的维度

  这里额外说明一下,在CNN阶段我们不需要指定输入图片的大小(传统CNN分类任务由于FC全连接层的限制,使得输入图片的大小是固定的),因为这里我们关心的是图片的特征,而卷积层和池化层根本不care输出尺寸的多少,它们只负责拿到前一层的特征图谱(feature map)。
  但是为什么这里的输出必须是定长的向量呢?主要是因为后面RNN模型的制约,由于RNN模型接受的数据必须的定长的,所以在全卷积定位层(FCL)阶段的最后一步,我们需要使用双线性插值的方法来使输出成为定长的特征向量。

卷积锚点(Convolutional Anchors)
  这里的工作主要参考自Faster R-CNN。主要思想是借助一系列具有平移不变性的锚点(anchors)来预测候选区域的位置和大小,具体做法如下:
  对于大小为W'×H'的特征图谱来说,将图谱中的每一个像素点都做为一个锚点(anchor)(锚点数量为W'×H'个),将该点反向映射会原始图像W*H中,然后基于该锚点,画出不同宽高比和大小的若干个“锚箱”(anchor box)。下图所示是3个具有相同大小但是不同宽高比的锚箱示例(分别为1:1,1:2,2:1)。

<div align=center>
[图片上传失败...(image-491a01-1540209330519)]
  如果采用Faster R-CNN的设置,即每个锚点对应3个不同的size取值(128^2,256^2,512^2)和3个不同的宽高比取值(1:1,1:2,2:1),因此,每个锚点对应的锚箱数量为k=9,在本文中采用的是k=12,具体对应多少个size和宽高比文中并没有给出。对于这k个锚箱,定位层(localization layer)会通过回归模型来预测相应的置信分数(score)和位置信息(scalars)。具体的计算过程是将特征图片作为输入,经过一个卷积核为3×3的卷积层(filter个数为256),然后再经过一个卷积核为1×1卷积层(filter个数为5k,这里k代表anchor box的数量),所以这一层的最终输出是5k×W'×H'的张量,包含了所有锚点对应的置信分数和位置信息。

边界回归(Box Regression)
  边界回归主要是对刚刚预测的候选区域的一次精修,进行边界回归的原因主要是当前的候选区域可能与真实区域并不是特别匹配,如下图所示:

<div align=center>
[图片上传失败...(image-151951-1540209330519)]

  图中,绿色框代表真实区域,红色框代表目前的候选区域,我们可以看到,候选区域虽然可以判断出区域内存在物体(飞机),但是它的定位并不是很准取,这时候就可以利用box regression来对边框进行微调。核心思想是利用线性回归得到关于边框的四个位移参数(t_x,t_y,t_w,t_h),然后通过下面的式子对候选区域的中点(x,y)和size(w,h)进行更新
x=x_a+t_xw_a$$$$ y=y_a+t_yh_a$$$$ w=w_aexp(t_w) $$$$h=h_aexp(h_w)
有关box regression的详细讲解可以参考这篇论文:
https://blog.csdn.net/zijin0802034/article/details/77685438
(PS:这篇论文的讲解是基于R-CNN的,其中的符号表示与本文有些出入,如t_x,t_y在R-CNN中代表的是真实区域的中心坐标,看的时候注意一下各个符号都表达了什么,不要搞混了)

区域采样
  以图像大小为W=720,H=540,锚箱(anchor box)数量为k=12的情况为例,得到的候选区域的个数应该为\lfloor\frac{720}{16}\rfloor×\lfloor\frac{540}{16}\rfloor×12=17820(文章中写的是17280,我感觉应该是写错了)。
为了降低成本,我们只取这些候选区域的子集来参与训练过程和测试过程,具体选取原则如下:

在训练阶段
: 采用Faster R-CNN的方法,采集一个大小为B=256的minibatch来进行训练,在这B个候选区域中,有至多B/2个正样本,其余均为负样本。采集时,如果所有的候选区域中(这里为17280个)正样本的数量不足B/2个,那么就由负样本补充,所以,最终的minibatch中正样本的数量B_P\le B/2,而负样本的数量B_N=B-B_P。正样本和负样本的定义如下:

  • 正样本:候选区域与一个或多个真实区域的面积相交部分大于70%
  • 负样本: 候选区域与所有真实区域的面积相交部分小于30%

在测试阶段
: 基于每个候选区域的置信分数,采用非极大抑制选取B=300个置信分数最高的候选区域

  非极大抑制:这里的抑制就是忽略的意思,非极大抑制的意思就是忽略那些与具有最高score值的候选区域的相交面积大于设定阈值的其他候选区域。这样做的目的主要是为了减少重叠区域的输出,从而更精细化的定位目标位置。

  经过以上操作,最终我们可以得到关于这B个候选区域的位置坐标和置信分数,表示为B×4和B×1的张量,这就是定位层(localization layer)的输出

双线性插值(Bilinear Interpolaion)

  在经过采样后,我们得到的各个候选区域是具有不同大小和宽高比的矩形框。为了与全连接层(主要进行识别分类)和RNN语言模型的进行建立连接,我们必须将候选区域提取成固定大小的特征表示向量。对于这一问题,Faster R-CNN提出了感兴趣区域池化层(RoI pooling layer),具体方法是大小为W'×H'的卷积特征图谱进行划分,得到具有X×Y个小网格的网格图,然后根据最大池化的原理,将小网格内的像素最大值作为代表该网格的特征像素,最终可以得到定长为X×Y的特征向量。划分示意图如下所示。

<div align=center>
[图片上传失败...(image-b55193-1540209330519)]

  RoI pooling layer需要两个输入:卷积特征图谱和候选区域坐标。但是在应用梯度下降时,该方法只能对特征图谱采用反向传播(BP)算法,而不能对候选区域坐标使用BP算法,为了克服这个缺点,在本文中,作者采用了双线性插值。
  具体来说,就是对于任意的特征图谱U(C×W'×H')和候选区域,我们要将其放缩成大小为(C×X×Y)的特征图谱V,放缩过程按照如下步骤进行:

  1. 计算VU的反向投影坐标值,例如对于特征图谱V中的任意一点坐标(x_{i,j}^V,y_{i,j}^V),投影到U中的坐标值为x_{i,j}=x_{i,j}^V*\frac{W'}{X},y_{i,j}=y_{i,j}^V*\frac{H'}{Y}很容易看出,这里x_{i,j}和y_{i,j}的值均为浮点数,然而图像的像素坐标在计算机中必须为整数,所以这里坐标(x_{i,j},y_{i,j})对应的像素点是虚拟像素点,并不是U中实际存在的点。
  2. 按照双线性插值法,得到U(x_{i,j}^U,y_{i,j}^U)坐标点的像素值,该像素值就是V中对应点的像素值V_{c,i,j},计算公式如下V_{c,i,j}=\sum_{i'=1}^{W’}\sum_{j'=1}^{H'}U_{c,j',j'}k(i'-x_{i,j})k(j'-y_{i,j}),其中 ,k(d)=max(0,1-|d|)
  3. 利用上面的方法,计算V中所有像素点的坐标值,得到C×X×Y的特征图谱

  对于上面的步骤可能理解起来不太直观,下面我们利用一个例子来帮助理解,我们假定源图谱U的大小为4×4,目的图谱V的大小为3×3,如下图所示
<div align=center>
[图片上传失败...(image-fb0cea-1540209330519)]

如果我们想要知道V中某点的坐标值,以V的中心点为例,我们先计算出V反向投影到U的坐标值(x_{i,j},y_{i,j})
<div align=center>
[图片上传失败...(image-764299-1540209330519)]
x_{i,j}=1*\frac{4}{3}=1.333,y_{i,j}=1*\frac{4}{3}=1.333

然后,利用上面的公式计算V_{c,i,j}的值
V_{c,i,j}=95*0.667*0.667+32*0.667*0.333+156*0.333*0.667+84*0.333*0.333=93.336\approx 93

<div align=center>
[图片上传失败...(image-f21ef2-1540209330519)]

最终,对于B个候选区域,我们会得到形式为B×C×X×Y的一个张量,这就是localization layer的最终输出。

3.1.3识别网络(Recognition Network)

  识别网络以一个全连接的神经网络,它接受的是来自定位层的候选区域的特征矩阵(定长)。将每个候选区域的特征拉伸成一个一维列向量,令其经过两层全连接层,每次都使用ReLU激活函数和Dropout优化原则。最终,对于每一个候选区域,都会生成一个长度为D=4096的一维向量。
  将所有的正样本的存储起来,形成一个B×D形状的矩阵,将该矩阵传送到RNN语言模型中。
另外,我们允许识别网络对候选区域的置信分数和位置信息进行二次精修,从而生成每个候选区域最终的置信分数和位置信息,这一次的精修与之前的box regression基本是一样的,只不过是针对这个长度D的向量又进行了一次box regression而已(在R-CNN论文中已经指出,理论上是可以通过迭代使用box regression来不断让候选区域无限逼近真实区域的,不过实现表明,对最终的结果提升并不大)。

3.1.4 RNN语言模型(RNN Language Model)

  将图片的特征图谱输入到RNN语言模型当中,从而获得基于图片内容的自然语言序列。基本方法是将识别网络的输出结果进行编码(每一个候选区域到对应一个编码),记为x_{-1}=CNN(I),然后将该区域对应的真实描述s_1,...,s_T也进行编码,记为x_1,...x_T,这里,x_i就是对应的s_i的向量编码。于是,我们就得到了长度为T+2的单词向量序列x_{-1},x_0,x_1,...,x_T,其中x_{-1}代表这候选区域的图像信息,x_0是特殊的开始标志,x_1,...x_T代表每一个单词的向量编码,将这T+2长度的向量序列feed到RNN中,训练出一个预测模型。
接着,在预测阶段,训练好的RNN语言模型的输入是x_{-1}x_0(START token),然后根据公式h_t,y_t=f(h_{t-1},x_t)分别计算出隐藏状态h_0和单词向量y_0。这里,y_t是一个长度为|V|+1的向量,V代表词库的size,多出来的1是一个特殊的END标志,根据y_0预测出第一个word,然后将该word再作为下一层LSTM网络(RNN中的语言模型网络)的输入,预测出第二个word,一直递归的重复这个过程,直到输出的word是END标志为止。该预测过程可以用下面的公式和两张示意图表示。
x_{-1}=CNN(I)$$$$x_t=W_eS_t,t\in \{ 0...N-1 \} $$$$p_{t+1}=LSTM(x_t),t\in \{ 0...N-1\}

  上式中,x_{-1}代表CNN生成的D维图像特征向量,并且它将作为整个RNN语言模型的初始输入,S_t代表RNN模型生成的一个个单词(word),其中S_0是一个特殊的开始标志,p_{t+1}代表第t+1个单词在整个单词表中的分布率,它是p(S_{t+1}|I,S_0,...,S_t)的简写形式,之后,选取p_t概率最大的元素作为句子中第t个单词的输出,如果概率最大的元素对应的是END标识符,则句子生成结束,迭代终止。

<div align=center>
[图片上传失败...(image-a2b94f-1540209330519)]

<div align=center>
[图片上传失败...(image-dbbb53-1540209330519)]

有关RNN模型生成图片描述的详细介绍可以参考下面两篇论文:
Show and Tell: A Neural Image Caption Generator
https://arxiv.org/abs/1411.4555
Deep Visual-Semantic Alignments for Generating Image Descriptions
https://arxiv.org/abs/1412.2306

3.2损失函数(Loss function)

  这篇文章训练时的损失函数有五个,如下图所示,首先是lacalization layer定位层的边框位置回归和置信分数两处损失函数,前者使用smooth L1 loss,后者使用binary logistic loss。损失函数的数学定义可以参考Fast R-CNN和Faster R-CNN里面的损失函数。
  接下来是Recognition Network的两处损失函数,该层和localization layer一样,也是边框位置和置信分数两个损失函数,最后是语言模型的损失函数,采用的取交叉熵(cross-entropy)损失函数。
  作者利用bathch size和sequence length对所有的损失函数都进行了归一化。经过不断测试,作者发现将后续区域边框的初始权重设为0.1,将图片描述的置信权重设为1.0,是比较高效率的初始化设置。
文中并没有对损失函数给出详细定义,通过查阅相关论文后,得到了各个损失函数的详细定义如下:

置信度损失函数(binary logistic loss)
: l(w,b)=-\sum_{i=1}^{m}lnP(y_i|x_i;w,b)$$$$P(y=1|x)=\frac{e^{w^Tx+b}}{1+e^{w^Tx+b}}$$$$P(y=0|x)=\frac{1}{1+e^{w^Tx+b}}这里,w为矩阵,b为向量,x_i是输入的图像区域的特征图谱,y_i为期望的真实输出(is or not object)

边框位置回归损失函数(smooth L1 loss)
: L_{loc}(t^u,v)=\sum_{i\in \{x,y,w,h\}}smooth_{L_1}(t_i^u-v_i)
smooth_{L_1}(x)=\begin{cases} 0.5x^2& \text{if |x|<1} \\|x|-0.5& \text{otherwise} \end{cases}
公式中,t^u=(t_x^u,t_y^u,t_w^u,t_h^u)代表了预测边框的位置信息,v=(v_x,v_y,v_w,v_h)代表了真实边框的位置信息

交叉熵损失函数
: L(I,S)=-\frac {1}{T} \sum_{t=1}^{T}logp_t(x_t)这里,I代表image,S代表sentence,S_t代表sentence中的第t个word,p_t代表第t个word的预测分布,因为要使损失函数最小,所以每次我们都选择概率最大的word。注意到这里的交叉熵损失函数比起完整的定义来说,缺少了真实分布P,这是因为在自然语言模型中,我们无法获取语句的真实分布,因此,需要用交叉熵的估计值进行代替。

<div align=center>
[图片上传失败...(image-3a025-1540209330519)]

3.2训练和优化

  我们用预训练ImageNet的权重来初始化CNN,其他权重的取值来源于标准差为0.01的高斯分布。CNN中权重的训练使用了momentum为0.9的SGD,其他的权重使用了Adam算法。学习速率分别为\beta _1=0.9\beta _2=0.99。CNN的fune-tuning在迭代一轮后就开始了,但是不包含CNN中的前四个卷积层的微调。
  训练时的batches由一张长边为720像素的图片构成(在该图片中选取B个候选区域组成mini-batch)。源码实现采用的是Torch7,在Titan X GPU上面一次mini batch的运行时间是300ms。训练模型直到收敛的运行时间总共花费了3天
源码地址:https://github.com/jcjohnson/densecap
源码实现教程(中文):https://github.com/jcjohnson/densecap

4.实验

程序运行示例:

<div align=center>
[图片上传失败...(image-4bbc49-1540209330519)]

图片描述精确度以及程序运行时间

<div align=center>
[图片上传失败...(image-8dbafc-1540209330519)]

bonus task:根据语言图片检索图片
<div align=center>
[图片上传失败...(image-36bc9d-1540209330519)]

5.总结

这篇论文的亮点在于提出了一个FCLN结构,并且利用双线性插值使得localization layer可导,从而可以支持从图片区域到自然语言描述之间的端到端训练,并且实验结果表现,当前的网络结构相较于以前的网络结构,不论是在生成的图片描述的质量上,还是在生成速度上,都有一定的提升。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,657评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,889评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,057评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,509评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,562评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,443评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,251评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,129评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,561评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,779评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,902评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,621评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,220评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,838评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,971评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,025评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,843评论 2 354

推荐阅读更多精彩内容