仰止

V1

2023/05/14阅读:32主题:默认主题

图像描述生成(image caption))

之前做毕业设计时,苦于没有高质量的图文数据对,了解到可以由图片生成文本,但也就体验了下模型效果,并没有进行这方面的学习,现在借此机会了解了解。

前言

image caption的目标就是根据提供的图像,输出对应的文字描述。如下图所示:

对于图片描述任务,应该尽可能写实,即不需要华丽的语句,只需要陈述图片所展现的事实即可。根据常识,可以知道该任务一般分为两个部分,一是图片编码,二是文本生成,基于此后续的模型也都是encoder-decoder的结构。

人类可以将图像中的视觉信息自动建立关系,进而感知图像的高层语义信息,但是计算机只能提取图像的特征信息,无法向人类大脑一样生成高层语义信息,这就是“语义鸿沟问题”。图像描述技术可以将视觉信息转化为语义信息,有利于解决“语义鸿沟”。

方法

1 传统image caption方法

1.1 基于模板的方法

生成的句子有固定的模板,检测图像中物体、场景和动作等相关元素,在模板中填充相关的词语,组合成句子

基于模板的图像描述
基于模板的图像描述

该方法虽然可以生成对图像的准确描述,但是缺点也十分明显,生成的内容单一且较为固定,并且人工参与程度较高。

1.2 基于检索的方法

通过图片匹配的方式实现。先将大量的(图像,图像描述)存入数据库,之后将输入图像与数据库中的图像进行对比,找出相似的图像,将对应的图像描述作为作为候选描述,再对这些描述进行合理的组织,生成输入图像的描述。

这种方法的性能依赖于标注数据集的大小和检索算法,并且受限于相似度计算的准确程度,生成的描述也相对局限,不一定能满足要求。

2 基于深度学习的image caption方法

基于深度学习的方法,概括起来就是有编码器实现对图像的编码,再由解码器生成对应的文字,结合了图像处理和自然语言生成两个方向。

2.1 NIC
论文:Show and Tell: A Neural Image Caption Generator

链接:https://arxiv.org/abs/1411.4555

“show and tell”这篇论文,于2015年提出,首次将深度学习引入image caption任务,提出了encoder-decoder的框架。

作者使用CNN提取图像特征,使用LSTM作为解码器生成对应的图像描述

根据上图,有如下计算流程:

式中, 表示图像编码, 表示将单词进行向量化的参数矩阵, 表示图像对应的描述句子,其中 表示句子的起始字符, 表示句子的结束字符,也就是说,如果有句子there are two books and one pen,那么其应该被处理为<start> there are two books and one pen <end>的形式,当解码器生成<end>时,表示句子生成结束。

使用极大似然估计计算损失函数:

2.2 注意力机制
论文:Show, Attend and Tell: Neural Image Caption Generation with Visual Attention

链接:https://arxiv.org/abs/1502.03044

这篇文章于2015年发布,在NIC的基础上引入了注意力机制,主要对解码器的结构进行改变,其示意图如下:

文中,作者一共实验了三种注意力机制,分别为additive attentionstochastic hard attentiondeterministic soft attention

2.2.1 additive attention

注意力权重的计算方式为:

式中, 表示注意力权重; 表示时间步; 表示图像的区域 表示图像区域 的向量表示; 为LSTM上一个时间步的隐藏层的输出; 是注意力模型,由多层MLP实现; 表示上下文向量; 为一个功能函数,返回单个向量

这里需要注意力得是,前面式子中,注意力模型以多层MLP实现,这是一种叫做“additive attention”的注意力机制。这种方法可以直接看作加权平均,在形式上,给定两组向量:输入向量 和隐向量 ,则 之间的附加注意力计算方式为:

式中, 表示激活函数,其代码实现如下:
class Attention(nn.Module):
    """
    Attention Network.
    """


    def __init__(self, encoder_dim, decoder_dim, attention_dim):
        """
        :param encoder_dim: feature size of encoded images
        :param decoder_dim: size of decoder's RNN
        :param attention_dim: size of the attention network
        """

        super(Attention, self).__init__()
        self.encoder_att = nn.Linear(encoder_dim, attention_dim)  # linear layer to transform encoded image
        self.decoder_att = nn.Linear(decoder_dim, attention_dim)  # linear layer to transform decoder's output
        self.full_att = nn.Linear(attention_dim, 1)  # linear layer to calculate values to be softmax-ed
        self.relu = nn.ReLU()
        self.softmax = nn.Softmax(dim=1)  # softmax layer to calculate weights

    def forward(self, encoder_out, decoder_hidden):
        """
        Forward propagation.
        :param encoder_out: encoded images, a tensor of dimension (batch_size, num_pixels, encoder_dim)
        :param decoder_hidden: previous decoder output, a tensor of dimension (batch_size, decoder_dim)
        :return: attention weighted encoding, weights
        """

        att1 = self.encoder_att(encoder_out)  # (batch_size, num_pixels, attention_dim)
        att2 = self.decoder_att(decoder_hidden)  # (batch_size, attention_dim)
        att = self.full_att(self.relu(att1 + att2.unsqueeze(1))).squeeze(2)  # (batch_size, num_pixels)
        alpha = self.softmax(att)  # (batch_size, num_pixels)
        attention_weighted_encoding = (encoder_out * alpha.unsqueeze(2)).sum(dim=1)  # (batch_size, encoder_dim)

        return attention_weighted_encoding, alpha
2.2.2 stochastic hard attention

对于随机注意力机制有:

式中, 表示在生成第 个单词时,模型会集中注意力的位置变量; 表示一种one-hot形式,当区域 用于提取视觉特征时置1,否则置0。

模型的目标函数为:

在此注意力机制下, 的功能就是,基于由 参数化的分布(伯努利)中,在每个时间点采样一个

2.2.3 deterministic soft attention

hard attention需要在每个时间步采样 ,而soft attention直接使用上下文向量 的期望:

接着通过对注释向量 加权来确定注意力模型:

这样得到的模型是平滑可微的。

下图为使用soft attention和hard attention的效果对比图:

2.3 其他深度学习网络
2.3.1 review networks
论文:Review Networks for Caption Generation

链接:https://arxiv.org/abs/1605.07912

源码:https://github.com/kimiyoung/review_net

模型结构如下所示:

模型的编码器使用的是VGG,解码器使用的是LSTM,比较特别的是,该模型定义了review结构,该结构利用注意力网络对解码器的输入与输出进行了改变。

review包括attentive input reviewerattentive output reviewer

(1)attentive input reviewer

在每个时间步,使用注意力对隐藏层进行处理,接着用注意力的结果作为解码器中LSTM的输入。有如下公式:

式中, 表示注意力输出; 表示第 个隐层的权重。 可以用点积计算,也可以使用多层MLP; 表示LSTM单元。

(2)attentive output reviewer

有如下计算公式:

可以看到,与attentive input reviewer的输入不同

(3)Discriminative Supervision

在传统的编码器-解码器模型中,模型的目标是最大化生成序列的条件概率,然而,作者使用了判别性的监督方法,对目标进行预测,如上图蓝色部分所示。简单来说,作者添加了一个损失函数,这个函数有别于生成式模型的损失函数,(或者说,这个损失函数属于判别式模型)。该函数的计算公式如下:

式中, 表示归一化因子, 表示出现在 中所有单词的集合, 表示输出, 表示单词 经过最大池化层后的得分。

模型最后的损失为负的条件对数似然与判别性损失的加权和:

式中, 表示输出序列 的长度; 表示reviewer输出的thought vectors向量集合; 表示经过softmax层后的单词 的概率; 表示第 个解码的字符; 表示 的word embedding。

2.3.2 SCA-CNN
论文:SCA-CNN: Spatial and Channel-wise Attention in Convolutional Networks for Image Captioning

链接:https://arxiv.org/abs/1611.05594

源码:https://github.com/zjuchenlong/sca-cnn.cvpr17

作者认为已有的研究通常使用的是空间注意力(注意力被建模为空间概率,也就是重新加权CNN编码器的最后一个卷积层),这种注意力并不是真正的注意力机制,因此,在CNN中结合了空间和通道注意力。简单来说,作者认为之前使用的注意力不够全面,所以自己在多个不同的地方使用了注意力。

SCA-CNN模型结构图
SCA-CNN模型结构图

模型的计算流程如下:

式中, 表示第 层网络层; 表示注意力权重; 表示注意力函数; 表示线性加权函数; 表示卷积层的总数。其中注意力权重 由空间注意力 和通道级注意力 组成:

这篇文章的核心为spatial attentionchannel wise attention

(1)spatial attention

空间注意力,也是已有的模型使用的注意力。在已有模型中,仅对编码器最后一个卷积层的feature map使用该注意力机制。在SCA-CNN中,利用了多层卷积提取特征不同的特点,在多层上使用该注意力机制。作者认为,最后一层卷积层的输出已经是后期的输出,也就是说特征基本已经提取完毕,各个像素点之间的差异变小了,注意力机制的效果可能无法有效发挥,而前面网络层的输出,各像素点之间的差异较大,可以更好的发挥注意力机制的效果。

其计算方式为:

式中, 表示矩阵与向量相加。

(2)channel wise attention

与空间注意力不同,通道级注意力作用于feature map之间,给每个channel进行加权,所以权重值为向量。作者在编码器网络中,嵌入了这两种注意力机制,并且在多个网络层上进行该操作。

其计算方式为:

式中, 表示向量的外积

(3)两种注意力机制的结合方式

作者给出了两种结合方式,channel-spatialspatial-channel

channel-spatial

通道级注意力在前,空间注意力在后:

spatial-channel

空间注意力在前,通道级注意力在后:

2.3.3 Graph encoder

(1)spatial and semantic graphs

论文:Exploring Visual Relationship for Image Captioning

链接:https://arxiv.org/abs/1809.07041

论文提出了GCN-LSTM模型,使用图卷积网络GCN整合目标之间的语义和空间关系,并将之用于图片编码。

首先使用Faster R-CNN对图像的显著区域进行提取,并构建区域语义有向图(语义图的顶点代表每个区域,边表示每对区域之间的关系)和空间有向图(空间图的顶点表述区域,边表示区域之间的位置关系),以GCN获取embedding输出,再通过带有注意力机制的双层LSTM生成对应的描述。

编码器

原始的GCN使用的是无向图,其计算方式为:

式中, 表示激活函数, 表示 的邻居节点(包括它自己)。

为了使GCN可以融合有向图,并能处理图的标签信息,作者对上式进行了修改:

式中, 表示根据每条边的方向选择变换矩阵,如 表示 表示 表示 表示每条边的标签。并且,作者给图的每条边加上了门控:

式中, 就表示门控。

解码器

解码器使用的注意力机制+双层LSTM的结构。其中,第一层LSTM的参数更新方式为:

式中, 表示第二层LSTM的上一个时间步的输出, 表示输入单词, 表示输入单词对应的转换矩阵, 表示经过平均池化后的图像特征。接着根据输出 计算注意力权重:

根据注意力得分对图像特征进行加权:

接着合并 ,将其作为第二层LSTM的输入:

最后,以 作为 层的输入,预测下一个单词。

(2)hierarchical trees

论文:Hierarchy Parsing for Image Captioning

链接:https://arxiv.org/abs/1909.03918

该文主要是对编码器进行改进。将图像表示为树形的层次结构,以整体图像作为根节点,中层表示图像的区域,叶节点表示图像区域中的实例对象,接着,将图像树送入TreeLSTM获取图像编码,以提取图像的多层次特征。

图像树结构
图像树结构

接着,根据图像的层次结构,构建有向图,图的顶点为每个区域或者实例,边表示每对区域或实例之间的关系。

HIP结构
HIP结构

上图为作者提出的层次解析架构(HIP),使用Faster R-CNN检测目标区域,使用Mask R-CNN分割实例集,接着搭建三层的层次树结构,并使用Tree-LSTM自下而上执行,以增强区域和实例特征,并以LSTM实现文本的生成。图的右半部分为作者将HIP结构接入GCN-LSTM模型的示意图。

Tree-LSTM

Tree-LSTM的主要作用就是提取图像的层级特征,其结构如下:

Tree-LSTM
Tree-LSTM

与原始的LSTM不同,Tree-LSTM的状态更新依赖子节点的多个隐藏状态。其状态更新公式如下:

式中, 表示当前节点的子集; 表示两个向量点积。Tree-LSTM的输入为:

式中, 表示区域特征编码, 表示实例特征编码

2.3.4 self-attention encoder

(1)Self-Attention

论文:Learning to Collocate Neural Modules for Image Captioning

链接:https://arxiv.org/abs/1904.08608

这篇文章的核心就是使用多个网络模块并行(CNM,Collocate Neural Modules)的方式,增强编码器的特征提取能力。不过,值得注意的是,在其中一个模块中,作者使用了多头自注意力。

模型的简要结构如下:

CNM
CNM

编码器

图中的四个模块分别为object moduleattribute modulerelation modulefunction module

  • object module专注于对象类别
  • attribute module侧重于视觉属性
  • relation module使用了多头自注意力网络,用以学习两个对象之间的交互。其输入为Faster R-CNN提取的ROI特征
  • function module用来生成一个功能词,如“a”和“and”

可以结合下图对上述四个模块进行理解:

caption生成示例
caption生成示例

解码器

解码器使用的了Controller,其结构如下:

controller结构
controller结构

可以看到,该结构包括三个注意力网络和一个LSTM,Controller的输出将会作为后接LSTM的输入,用以生成下一个单词。

其计算流程如下:

1)引入加性注意力机制,将三个视觉模块的输出进行加权

object att: