【学习日记week1】跨模态信息理解_Unpaired Image Captioning via Scene Graph

图像信息捕捉Unpaired Image Captioning via Scene Graph(ICCV 19’)

在这里插入图片描述

What is “Image Captioning”

基本任务:

将图像输入,然后生成自然语言,内容为图像内容的描述。下面是paperwithcode对image captioning的描述。

Image Captioning is the task of describing the content of an image in words. This task lies at the intersection of computer vision and natural language processing. Most image captioning systems use an encoder-decoder framework, where an input image is encoded into an intermediate representation of the information in the image, and then decoded into a descriptive text sequence. The most popular benchmarks are nocaps and COCO, and models are typically evaluated according to a BLEU or CIDER metric.

因为我的工作不是完全的在图像描述上,所以仅简要调研了一下发展过程(在深度方法范围内)
参考了推文 图像描述(image caption)历年突破性论文总结
Show and Tell: A Neural Image Caption Generator方法是第一个提出深度学习来进行图像描述的工作,通过CNN和LSTM的串接,实现了图像的语义解析以及文本的生成。再往后出现了基于图像注意力机制的Show, Attend and Tell: Neural Image Caption Generation with Visual Attention,然后又有了基于Sentinel机制来对单词进行划分在计算总体特征的方法。再往后还有基于目标检测,Transformer等的方法。但这些与这个工作无关

评价指标

这部分内容主要参照图像描述(Image Captioning)的评价指标理论理解
因为图像描述的任务其实是没有那么好直接具体来判断的,所以评估标准也是较为抽象的(对我而言)。
主要先调研了本文出现的四个评价指标,从paperwithcode上来看,很多的方法采取的评价指标都是带有这些的,其他的有些仅部分实验有用到。

1. BLEU
转自BLEU详解
这是机器翻译的评价指标,在2002年提出,体思想就是准确率,假如给定标准译文reference,神经网络生成的句子是candidate,句子长度为n,candidate中有m个单词出现在reference,m/n就是bleu的1-gram的计算公式。
BLEU还有许多变种。根据n-gram可以划分成多种评价指标,常见的指标有BLEU-1、BLEU-2、BLEU-3、BLEU-4四种,其中n-gram指的是连续的单词个数为n。
BLEU-1衡量的是单词级别的准确性,更高阶的bleu可以衡量句子的流畅性。公式如下:
BLEU _ n = ∑ c ∈ c a n d i d a t e s ∑ n _ g r a m ∈ c count c l i p ( n _ g r a m ) ∑ c ′ ∈ c a n d i d a t e s ∑ n _ g r a m ′ ∈ c ′ count ( n _ g r a m ′ ) \text {BLEU}\_n=\frac{\sum_{c\in candidates}\sum_{n\_gram\in c}\text {count}_{clip}(n\_gram)}{\sum_{c'\in candidates}\sum_{n\_gram'\in c'}\text {count}(n\_gram')} BLEU_n=ccandidatesn_gramccount(n_gram)ccandidatesn_gramccountclip(n_gram)
这里几个声明需要我重新整理一下:

candidate:生成的句子
reference:数据集中的标准译文(ground truth)
clip:指的是某个n gram在reference中的词频
分子表示给定的candidate中有多少个n-gram词语出现在reference中;分母是获得所有的candidate中n-gram的个数。

看不懂的时候可以参考这个,可以将分子和分母理解为两个滑动窗口,然后对窗口做匹配,用匹配的n gram数除以所有窗口出现的n gram数实现
BLEU示例

2. METEOR
BLEU的问题其实很显而易见,从上面的示例就可以很自觉的提出来:比如对于上述句子,我写的是 a kitty is sitting on the mat。虽然翻译任务中词义是不同的,但是我们要做的是图像描述,对于图像中的语义的自然语言描述,很多时候 是较为模糊的,也是没有时态的,所以就有了METEOR的评估。
现在可以用python来做METEOR评估(原推文说必须依靠java),一个简单的例子如下

from nltk.translate.meteor_score import meteor_score
import nltk
#nltk.download('wordnet')
reference3 = 'who are you guys'.split()
reference2 = 'who is him'.split()
hypothesis2 = 'who are you'.split()
# reference3:参考译文
# hypothesis2:生成的文本
res = round(meteor_score([reference3, reference2], hypothesis2), 4)
print(res)

3. CIDEr
CIDEr的设计就更加有针对性了,来评价一个候选句和一组图像描述的一致性。本质上,CIDEr是BLEU和向量空间模型的结合,将句子当做文档来计算TF-IDF向量的余弦夹角

TF-IDF词向量表示:term frequency(词频), inverse document frequency(逆文件频率)。是一个权重,用于度量字词在语句中的重要性。核心思想是字词的重要性随着在文件中出现的次数增加成正比,随着在语料库中出现的频率增加成反比
基于此就可以计算有词频 T F = 在某类词条中某词出现的次数 文章总词数 TF = \frac{在某类词条中某词出现的次数}{文章总词数} TF=文章总词数在某类词条中某词出现的次数以及逆文件频率 I D F = log ⁡ ( 语料库的文档总数 包含某词的文档数 + 1 ) IDF=\log(\frac{语料库的文档总数}{包含某词的文档数+1}) IDF=log(包含某词的文档数+1语料库的文档总数)并计算 T F × I D F TF\times IDF TF×IDF

最后有
CIDE r n ( c i , S i ) = 1 M ∑ j = 1 M g n ( c i ) ⋅ g n ( s i j ) ∥ g n ( c i ) ∥ ∥ g n ( s i j ) ∥ \text {CIDE}r_n (c_i,S_i)=\frac 1M \sum_{j=1}^M\frac{g^n(c_{i})\cdot g^n(s_{ij})}{\Vert g^n(c_{i})\Vert\Vert g^n(s_{ij})\Vert} CIDErn(ci,Si)=M1j=1Mgn(ci)∥∥gn(sij)gn(ci)gn(sij)
其中 g n ( c i ) g^n(c_i) gn(ci)由所有 g k ( c i ) g_k(c_i) gk(ci)组成,是一个向量,n代表n-grams,k表示位置,每个位置可以算出一个TF-IDF。然后用所有位置组成的词向量计算一个余弦相似度,也就是右边的分式,最后就可以得到一个评估值求和,这个求和之和是归一化的,值和N有关,N越大,理论最大值越大

4. SPICE.
这也是一个专门做图像捕获任务的评价指标。基于图的语义表示来编码描述,然后通过概率上下文无关文法将评价的caption和参考captions,构建句法依赖树。然后再基于语法规则变换成场景图,最后计算objects, attributes和relationship的F-score。
这个更多的是利用了句法信息,但是没有对语法信息有较多的考量。
SPICE图例

Conclusion:每种评价指标都有其专门的作用
CODES(python): https://github.com/salaniz/pycocoevalcap


Abstract

这一篇文章虽然是有关image caption的任务,但是解决的是一个Unpaired的问题。获取成对的跨模态数据是十分困难的,所以本文提出了基于场景图的两个生成器(做为Encoder)和两个模态对应的解码器(两个Decoder),以及一个无监督的特征对齐方法来实现图片模态和文本描述的对齐;具体的,是依靠将场景图来实现,先用场景图通过Encoder结构变为特征f,再用Feature Mapping实现不同模态的对齐。
Graph Align


Motivation & Contribution

对于传统的image captioning任务深度方法,大部分都是基于Encoder-Decoder结构,其中通过CNN来对图像进行编码,然后基于RNN/LSTM来生成文本序列。但是这些方法很多都是对于成对的数据进行训练,然而成对的数据需要标注,所以会有unpaired的问题。

Unpaired解决方案

有些对于非成对数据集训练的尝试,比如有pivot-based的半监督学习方法(Unpaired image
captioning by language pivoting ECCV18),采用了中介语言(中文)和平行语料库来进行过渡(个人不是很清楚具体是如何做的,先不管);然后有做完全无监督的方法(Unsupervised image captioning)。对于这个任务,无监督的意义等同于Unpaired,因为监督信息就是文本模态的描述,如果没有文本模态的内容就是无监督的。对于不成对的数据,Encoders处理后的内容无法直接的进行对齐,所以也不能够直接放到此前的encoder-decoder结构中。

作者的启发来自于场景图的构建,通过场景图来构建目标和目标之间的联系,让图像的语义信息提取更加方便,场景图的方法也被用到过paired image captioning的问题中。上图是一个很简单的作者提出的框架示例,来通过CycleGAN来构建两个模态之间的数据关系

首先使用在句子语料库中训练的场景图编码器对其进行图像编码。
然后采用CycleGAN来无监督的跨模态映射来做特征层面的对齐,从而让生成的特征能够和文本模态的特征更接近,被decode成更接近的自然语言的description。

Contribution

  1. 基于场景图的、非成对的图像描述框架
  2. 无监督的特征对齐(即半监督场景)

对比现有工作

现有工作大部分还是在paired的基础上去做的,本篇也是主要围绕CVPR19的《Auto-Encoding Scene Graphs for Image Captioning》做的非成对版本。对于这一类工作已经论述了问题所在,即不能处理非成对数据;而对于Unpaired方法,文章称其还“非常不成熟”,而本文用了场景图的方法就更具有优势。


方法——Overall

朴素方法:paired Image Captioning

一切方法都要从朴素方法来入手。对于成对的方法,目标是根据图像 S S S生成描述 I I I,中间的特征为 V V V,则传统的encoder-decoder结构就可以表示为 P ( S ∣ I ) = P ( V ∣ I ) P ( S ∣ V ) P(S|I)=P(V|I)P(S|V) P(SI)=P(VI)P(SV)右边公式的第一个P是编码器,而第二个是解码器。而目标就是一个似然函数: arg max ⁡ S t ∑ t log ⁡ p θ I → S ( S t ∣ S 0 : t − 1 , I ) \argmax_{S_t}\sum_t \log p_{\theta_{I\rightarrow S}}(S_t|S_{0:t-1},I) argmaxSttlogpθIS(StS0:t1,I)。从而在字典中生成合适的 S t S_t St

不对称场景下的问题定义

这里再放一下图来进行参考,这里对图中的内容进行重新定义。
Graph Align
图像和文本分别对应 I , S I,S I,S,而在非对称场景下,数据集会被表示为 I = { I 1 , … , I N I } , S = { S 1 , … , S N S } \mathcal I=\{I_1,\dots,I_{N_I}\},\mathcal S=\{S_1,\dots,S_{N_S}\} I={I1,,INI},S={S1,,SNS},两个N分别表示为两个模态的样本数量。不同模态根据原始数据生成场景图(即图中黄绿蓝+箭头部分)是 G I , G S \mathcal G^I,\mathcal G^S GI,GS。这个部分基本参考之前基于场景图的方法,采用GCN来进行实现。然后通过一个encoder G E n c S G_{Enc}^S GEncS和一个基于attention机制的decoder G D e c S G_{Dec}^S GDecS来计算最终生成的 S S S
本文的方法步骤如下:

  1. 首先根据原本的输入图像,可以通过一个场景图生成器获得场景图
  2. 将图像的场景图投影到文本的场景图
  3. 根据文本的场景图和一个RNN的decoder生成语句

文本模态公式化表述为
  I → G I P ( S ∣ I ) = P ( G S ∣ G I ) P ( S ∣ G S ) \space I\rightarrow \mathcal G^I\\P(S|I)=P(\mathcal G^S|\mathcal G^I)P(S|\mathcal G^S)  IGIP(SI)=P(GSGI)P(SGS)

但很显然的,场景图的相互映射的实现是非常困难的,所以简化的方法是将其投影到一个特征空间中对特征向量进行对齐。于是引入了f,改写为 P ( S ∣ I ) = P ( G S ∣ G I ) P ( S ∣ G S ) ≈ P ( f I ∣ G I ) P ( f S ∣ f I ) P ( S ∣ f S ) \begin{aligned}P(S|I)&=P(\mathcal G^S|\mathcal G^I)P(S|\mathcal G^S)\\&\approx P(\boldsymbol f^I|\mathcal G^I)P(\boldsymbol f^S|\boldsymbol f^I)P(S|\boldsymbol f^S)\end{aligned} P(SI)=P(GSGI)P(SGS)P(fIGI)P(fSfI)P(SfS)

即将G–>S变为G–>f–>S。然后对齐不再在图上做而是在生成的特征空间上做,基于此可进行设计:
P ( f I ∣ G I ) P(\boldsymbol f^I|\mathcal G^I) P(fIGI)是graph encoder,用于生成特征; P ( f I ∣ G I ) P(\boldsymbol f^I|\mathcal G^I) P(fIGI)是基于RNN的一个解码器; P ( f S ∣ f I ) P(\boldsymbol f^S|\boldsymbol f^I) P(fSfI)是一个跨模态的相互映射
对于这部分的训练,本工作的设计并非同步的。(这是为什么?)具体体现在:首先先学graph encoder和生成目标句子的decoder,即上式中的第一项和第三项,然后再学习第二项。有个疑惑:到底在哪一步开始才对unpaired的数据进行训练?

对于文本模态有 S → G S S ^ = arg max ⁡ S P ( S ∣ f S ) P ( f S ∣ G S ) S\rightarrow \mathcal G^S\\\hat S=\argmax_SP(S|\boldsymbol f^S)P(\boldsymbol f^S|\mathcal G^S) SGSS^=SargmaxP(SfS)P(fSGS)

而这里的 S ^ \hat S S^根据原始的Ground truth来生成的句子,为了使我们的encoder-decoder系统对于reconstruction的能力足够强,需要让 S ^ \hat S S^ S S S相拟合。


具体设计

场景图生成

本文对场景图(scene graph)生成的算法描述较少,基本是基于之前工作的。但由于有可能后续工作会需要学习场景图的相关内容,所以这里占个坑先,后续可能会补
在补充前线讲一下本文的场景图生成是如何实现的。首先场景图有 G = ( V , E ) \mathcal{G=(V,E)} G=(V,E),由节点集合和关系/边集组成。根据现实的关系和自然语言可以将节点分为三类:目标节点(物体),属性节点(附加在物体上),关系节点(依赖关系存在,连接两个物体)。根据三类节点,利用Faster-RCNN进行目标检测(产生object),MOTIFS来计算目标之间的关系(产生relationship),然后用一个classifier去产生attribute。生成文本场景图的方法通过先构建语法树,然后将语法树根据一个基于规则的方法转化为一个场景图。

场景图到特征的Encoder

因为场景图不是一个简单数据结构,所以对场景图的解析和基于场景图如何生成Feature向量不是一个简单任务。而本文采用了基于时空图卷积网络的方法来实现,通过近邻信息来对场景图进行特征提取。场景图是有向图,而一个描述的主体和客体是由边的方向决定的。关系是由三元组组成 < o i , o j , r i , j > <o_i,o_j,r_{i,j}> <oi,oj,ri,j>,i和j分别表示主体和客体。encoder的任务可以被如下描述:
x o i = 1 N r i ∑ o j g s ( e o i , e o j , e r i , j ) + 1 N r i ∑ o k g o ( e o i , e o j , e r i , j ) \begin{aligned}\boldsymbol x_{o_i} &=\frac1{N_{r_i}}\sum_{o_j} g_s(\boldsymbol e_{o_i},\boldsymbol e_{o_j},\boldsymbol e_{r_{i,j}})\\&+\frac1{N_{r_i}}\sum_{o_k} g_o(\boldsymbol e_{o_i},\boldsymbol e_{o_j},\boldsymbol e_{r_{i,j}})\end{aligned} xoi=Nri1ojgs(eoi,eoj,eri,j)+Nri1okgo(eoi,eoj,eri,j)

其中的e表示的是embeddings,是关于其角标的embedding。而 g s ( ⋅ ) , g o ( ⋅ ) g_s(\cdot),g_o(\cdot) gs(),go()表示的则是两个空间图卷积网络(spatial GCN,NIP 20’)。注意,关系的主体和客体分别对应有一个空间图卷积网络,所以对于对象的encoding考虑了主客体的关系。而对于属性和关系的encoding计算直接由目标的属性编码输入到属性SGCN的均值和关系输入到关系SGCN分别生成。有
x a i = 1 N a i ∑ l g a ( e o i , e a i l ) x r i , j = g r ( e o i , e o j , e r i , j ) \boldsymbol x_{a_i}=\frac1{N_{a_i}}\sum_lg_a(\boldsymbol e_{o_i},\boldsymbol e_{a_i^l}) \\x_{r_{i,j}}=g_r(\boldsymbol e_{o_i},\boldsymbol e_{o_j},\boldsymbol e_{r_{i,j}}) xai=Nai1lga(eoi,eail)xri,j=gr(eoi,eoj,eri,j)

对于每个模态,场景图的维度并不一定一致,所以编码后会获得每个模态上的不同的经过SGCN的新特征:

AFTERENCODING

编码过程可由下图表示:
graph-->x

解码为自然语言

注意到之前的编码集中 X o k , X r k , X a k \mathcal X_o^k, X_r^k, X_a^k Xok,Xrk,Xak其实代表着六个不同维度,不同语义信息的embeddings。将其按照o,r,a分类后单独处理可以更好的综合这些信息,所以采用了三个不同的attention模块来将其处理到 f \boldsymbol f f空间上。
三个attention module都可以用类似下式来定义:
attention

然后首先用一个神经网络 g o r a g_{ora} gora来将三个不同的Feature编码到同一个sequence f o r a k \boldsymbol f_{ora}^k forak中,然后用RNN计算出每一个step的output,最后再用一个权重和矩阵和softmax层来筛选出候选词。

训练和损失

首先,在模态对齐方面,本文采用了在特征层面的对齐,而特征的对齐运用了CycleGAN的结构,具体的就是添加两头的对抗损失,最后再添加一个L1norm的正则化项,CycleGAN结构在后文,这里直接给出原文的loss:
cyclegan1
cyclegan2
cyclegan3
cycleganall

知识笔记本

GCN

图卷积网络(Graph Convolutional Network,GCN)的图卷积层的前向传播规则可以表示如下:

假设我们有一个图 G = ( V , E ) G=(V, E) G=(V,E),其中 V V V 表示节点集合, E E E 表示边集合。每个节点 v i ∈ V v_i \in V viV 都具有一个特征表示 X i \mathbf{X}_i Xi,这些特征表示可以组成一个特征矩阵 X \mathbf{X} X,其中 X i \mathbf{X}_i Xi X \mathbf{X} X 的第 i i i 列。

GCN 的前向传播规则如下:

  1. 初始化权重矩阵:首先,初始化一个权重矩阵 W \mathbf{W} W,它将用于计算节点之间的信息传递。

  2. 聚合邻居信息:对于每个节点 v i v_i vi,GCN 聚合其邻居节点的信息。假设 N ( v i ) N(v_i) N(vi) 表示节点 v i v_i vi 的邻居节点集合,那么节点 v i v_i vi 的邻居信息聚合可以表示为:

    h i = ∑ v j ∈ N ( v i ) 1 ∣ N ( v i ) ∣ ⋅ ∣ N ( v j ) ∣ ⋅ X j ⋅ W \mathbf{h}_i = \sum_{v_j \in N(v_i)} \frac{1}{\sqrt{|N(v_i)| \cdot |N(v_j)|}} \cdot \mathbf{X}_j \cdot \mathbf{W} hi=vjN(vi)N(vi)N(vj) 1XjW

    其中, h i \mathbf{h}_i hi 表示节点 v i v_i vi 的新特征表示, X j \mathbf{X}_j Xj 表示邻居节点 v j v_j vj 的特征表示, W \mathbf{W} W 是权重矩阵, ∣ N ( v i ) ∣ |N(v_i)| N(vi) ∣ N ( v j ) ∣ |N(v_j)| N(vj) 分别表示节点 v i v_i vi v j v_j vj 的邻居数量。

  3. 应用激活函数:通常,在聚合邻居信息后,会应用一个非线性激活函数,例如 ReLU(Rectified Linear Unit),以引入非线性性质:

    h i = ReLU ( h i ) \mathbf{h}_i = \text{ReLU}(\mathbf{h}_i) hi=ReLU(hi)

  4. 输出结果:最后,我们可以得到所有节点的新特征表示,形成一个新的特征矩阵 H \mathbf{H} H,其中 H i \mathbf{H}_i Hi 表示节点 v i v_i vi 的新特征表示。

这个过程可以一次性应用于整个图,以得到整个图的新特征表示 H \mathbf{H} H。GCN 层的输出通常用于后续的任务,例如节点分类、图分类等。

需要注意的是,上述规则是 GCN 的一个简化版本,实际中还可以考虑更多的变种和正则化方法,以提高性能和鲁棒性。

CycleGAN

CycleGAN(Cycle-Consistent Generative Adversarial Network)是一种深度学习模型,用于图像生成和转换任务。它的目标是学习两个域之间的映射,而无需成对的训练数据。CycleGAN 最常用于图像转换任务,其中两个域之间的转换是相互对应的,例如,将马的图像转换为斑马的图像,将夏天的景色转换为冬天的景色。

以下是 CycleGAN 的主要概念和公式表示:

  1. 生成对抗网络 (GAN):CycleGAN 由两个生成器网络(Generator)和两个判别器网络(Discriminator)组成。生成器的目标是学习如何将输入图像从一个域转换为另一个域,而判别器的目标是尽量区分生成器生成的图像和真实图像。

  2. 对抗损失 (Adversarial Loss):CycleGAN 使用对抗损失来训练生成器和判别器。生成器试图生成足够逼真的图像以愚弄判别器,而判别器试图区分生成的图像和真实图像。对抗损失可以表示为以下公式:

    对抗损失

    这里, ( G 1 ) (G_1) (G1) 是从域 X X X 到域 Y 的生成器, D 1 D_1 D1 是判别器, x x x 表示域 X X X 的真实图像, y y y 表示域 Y Y Y 的真实图像。

  3. 循环一致性损失 (Cycle-Consistency Loss):CycleGAN 引入了循环一致性损失,以确保图像转换是相互对应的。它的目标是,如果将图像从域 X X X 转换为域 Y Y Y,然后再从域 Y Y Y 转换回域 X X X,最终结果应该与原始图像 x x x 非常接近,反之亦然。循环一致性损失可以表示为以下公式:

    循环一致性损失

    这里, G 1 G_1 G1 是从域 X X X 到域 Y Y Y 的生成器, G 2 G_2 G2 是从域 Y Y Y 到域 X X X 的生成器。

  4. 总体损失函数:CycleGAN 的总体损失函数将对抗损失和循环一致性损失相结合,通常还包括一些正则化项,以平衡不同的损失组成部分。总体损失可以表示为:

    总体损失

    其中, λ \lambda λ 是循环一致性损失的权重参数。

CycleGAN 的核心思想是,通过对抗训练和循环一致性损失,可以实现不需要成对数据的图像域之间的转换,使生成图像逼真且相互对应。这使得 CycleGAN 在图像翻译、风格迁移等任务中非常有用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值