image caption—《Neural Baby Talk》学习笔记

论文:《Neural Baby Talk》
论文链接:https://arxiv.org/abs/1803.09845
代码链接:https://github.com/jiasenlu/NeuralBabyTalk

     目前大多做image caption的方法都是基于Encoder-Decoder框架。创新比如引入attention机制、采用LSTM、双层LSTM等等。文章认为现代神经网络图像描述方法产生的自然语言描述虽然比较流畅,但是都是依靠语言模型去生成句子,往往不太依赖于图像。这篇《Neural Baby Talk》产生的句子中的插槽位置(大多主语、宾语)明确与图像区域相关联,是直接依据图像特征去预测的词。下面是我总结画的本文的功能模块图:

文章同样也是基于Encoder-Decoder框架。简单来说,在编码阶段,输入一幅图像,通过Fsater-RCNN提取图像的区域特征。在产生句子的解码阶段,作为潜在变量来表示当前应该关注视觉词(大多主语或者宾语)还是关注文本词,如果当前时刻所产生的词是文本词,那么这个词就通过语言模型从文本词汇中生成;如果当前关注的是视觉词,指针网络便是用在标定区域上,指向当前的视觉词对应哪个图像区域特征,最后在生成这个视觉词的时候使用这个特征来产生,相当于为视觉词产生一个插槽最后用直接由图像特征产生的视觉词填充。文章给出的具体框架如下:

在文章给出的图中,是要根据图片和"A"预测出“cat”这个单词。$P_r^t$是在标定区域$r_I$和视觉哨兵上的概率分布,$P_{txt}^t$是在图像、所有先前的单词和视觉哨兵上调节的文本单词的概率。用以下方法计算pointing vector:

vi是区域特征,ht是t时刻的隐层状态,wh,Wv,Wz是要学习的参数。

下面是这篇文章的损失函数,其中,是t时刻来自ground truth描述的词,是指示函数,如果如果y是文字,则等于1,否则为0。和是当前target(视觉词)ground truth的单复数和细粒度分类。

补充一下,刚开始看论文的时候对“插槽这个概念比较疑惑,在跑代码的时候看到是在生成句子的时候会有三个句子序列,一个是带文本词汇和插槽(对视觉词的标记)的序列;一个是文本词为空,只有视觉词(与第一个句子插槽位置对应)的细粒度的句子;另一个是文本词为空,只有视觉词(与第一个句子插槽位置对应)的单复数的句子,在产生最终的句子时,在第一个句子碰到视觉词标记时,就结合其他两个句子来给出当前的视觉词。也正是文章中框架后面对视觉词单复数和细粒度的判断。

如有错误的地方,欢迎交流指正

猜你喜欢

转载自blog.csdn.net/weixin_42542017/article/details/87912990