赞
踩
前一篇文章整理了多模态融合Multimodal Fusion,最近看到一篇很好的跨模态检索的文章,这篇博客就来整理几篇博主认为idea还不错的跨模态检索。另,如果有其他idea很好的跨模态论文,希望你在文章后面留言!
Cross-modal Retrieval
其实图像/视频检索都可以按上面这张图做细分等等,早期一般会使用一些手工特征进行检索,但慢慢已经被深度学习方法统治,开始偏向度量学习,如上图里面的CNN,AE,GAN,attNet,RL等等,实际上涉及到很多具体任务又有很多的trick。一般一个跨模态检索过程可以既包括模态表征,模态转换,模态对齐和联合学习(唯独没有模态融合,基本上不需要融合)。废话不多说,直接开始整理一下重要的,和有意思的文章吧。
Adversarial Cross-Modal Retrieval
这篇似乎是MM2017最佳学生论文(而且是本科生)。出发点是为了把不同模型映射到一个跨模态的子空间,所以引入GAN的对抗思想,主体是让图片和文本相互对抗以达到混淆的目的,那么此时的跨模态空间就是很好的空间了,这篇文章的对抗思路也被之后的很多工作所沿用。
这篇比较经典的论文,直接看一下作者的实现代码:
class AdvCrossModalSimple(BaseModel): def __init__(self, model_params): BaseModel.__init__(self, model_params) self.data_iter = DataIter(self.model_params.batch_size) #Triple版本会有正例和负例 self.tar_img = tf.placeholder(tf.float32, [None, self.model_params.visual_feat_dim]) self.tar_txt = tf.placeholder(tf.float32, [None, self.model_params.word_vec_dim]) self.pos_img = tf.placeholder(tf.float32, [None, self.model_params.visual_feat_dim]) self.neg_img = tf.placeholder(tf.float32, [None, self.model_params.visual_feat_dim]) self.pos_txt = tf.placeholder(tf.float32, [None, self.model_params.word_vec_dim]) self.neg_txt = tf.placeholder(tf.float32, [None, self.model_params.word_vec_dim]) self.y = tf.placeholder(tf.int32, [self.model_params.batch_size,10]) self.y_single = tf.placeholder(tf.int32, [self.model_params.batch_size,1]) self.l = tf.placeholder(tf.float32, []) self.emb_v = self.visual_feature_embed(self.tar_img) #语义嵌入维度 self.emb_w = self.label_embed(self.tar_txt) self.emb_v_pos = self.visual_feature_embed(self.pos_img,reuse=True) self.emb_v_neg = self.visual_feature_embed(self.neg_img,reuse=True) self.emb_w_pos = self.label_embed(self.pos_txt,reuse=True) self.emb_w_neg = self.label_embed(self.neg_txt,reuse=True) # 按照论文一共会计算2种loss,emb和adv loss,其中emb由两部分组成。以下一一注释。 # triplet loss形式的emb loss margin = self.model_params.margin alpha = self.model_params.alpha v_loss_pos = tf.reduce_sum(tf.nn.l2_loss(self.emb_v-self.emb_w_pos)) v_loss_neg = tf.reduce_sum(tf.nn.l2_loss(self.emb_v-self.emb_w_neg)) w_loss_pos = tf.reduce_sum(tf.nn.l2_loss(self.emb_w-self.emb_v_pos)) w_loss_neg = tf.reduce_sum(tf.nn.l2_loss(self.emb_w-self.emb_v_neg)) self.triplet_loss = tf.maximum(0.,margin+alpha*v_loss_pos-v_loss_neg) + tf.maximum(0.,margin+alpha*w_loss_pos-w_loss_neg) # lable loss是多分类交叉熵损失 logits_v = self.label_classifier(self.emb_v) logits_w = self.label_classifier(self.emb_w, reuse=True) self.label_loss = tf.nn.softmax_cross_entropy_with_logits(labels=self.y, logits=logits_v) + \ tf.nn.softmax_cross_entropy_with_logits(labels=self.y, logits=logits_w) self.label_loss = tf.reduce_mean(self.label_loss) self.emb_loss = 100*self.label_loss + self.triplet_loss # emb loss由以上2种得到 # 模态分类对应论文的adv loss,使模型无法分清文本or图像 self.emb_v_class = self.domain_classifier(self.emb_v, self.l)#先预测lable self.emb_w_class = self.domain_classifier(self.emb_w, self.l, reuse=True) all_emb_v = tf.concat([tf.ones([self.model_params.batch_size, 1]), tf.zeros([self.model_params.batch_size, 1])], 1)#拼接lable方便一起计算 all_emb_w = tf.concat([tf.zeros([self.model_params.batch_size, 1]), tf.ones([self.model_params.batch_size, 1])], 1) self.domain_class_loss = tf.nn.softmax_cross_entropy_with_logits(logits=self.emb_v_class, labels=all_emb_w) + \ tf.nn.softmax_cross_entropy_with_logits(logits=self.emb_w_class, labels=all_emb_v) self.domain_class_loss = tf.reduce_mean(self.domain_class_loss)#得到adv loss self.t_vars = tf.trainable_variables()#因为adv和emb的计算方向不一样,所以需要分别优化 self.vf_vars = [v for v in self.t_vars if 'vf_' in v.name] #vf和le是训练emb的,对应投影器 self.le_vars = [v for v in self.t_vars if 'le_' in v.name] self.dc_vars = [v for v in self.t_vars if 'dc_' in v.name] #dc和lc是训练adv的,对应分类器 self.lc_vars = [v for v in self.t_vars if 'lc_' in v.name] def visual_feature_embed(self, X, is_training=True, reuse=False):#即论文中的视觉特征投影器 with slim.arg_scope([slim.fully_connected], activation_fn=None, reuse=reuse): net = tf.nn.tanh(slim.fully_connected(X, 512, scope='vf_fc_0')) net = tf.nn.tanh(slim.fully_connected(net, 100, scope='vf_fc_1')) net = tf.nn.tanh(slim.fully_connected(net, self.model_params.semantic_emb_dim, scope='vf_fc_2')) return net def label_embed(self, L, is_training=True, reuse=False):#即论文中的文本特征投影器 with slim.arg_scope([slim.fully_connected], activation_fn=None, reuse=reuse): net = tf.nn.tanh(slim.fully_connected(L, self.model_params.semantic_emb_dim, scope='le_fc_0')) net = tf.nn.tanh(slim.fully_connected(net, 100, scope='le_fc_1')) net = tf.nn.tanh(slim.fully_connected(net, self.model_params.semantic_emb_dim, scope='le_fc_2')) return net def label_classifier(self, X, reuse=False):#标签预测 with slim.arg_scope([slim.fully_connected], activation_fn=None, reuse=reuse): net = slim.fully_connected(X, 10, scope='lc_fc_0') return net def domain_classifier(self, E, l, is_training=True, reuse=False):#二分类是文本/图像 with slim.arg_scope([slim.fully_connected], activation_fn=None, reuse=reuse): E = flip_gradient(E, l) net = slim.fully_connected(E, self.model_params.semantic_emb_dim/2, scope='dc_fc_0') net = slim.fully_connected(net, self.model_params.semantic_emb_dim/4, scope='dc_fc_1') net = slim.fully_connected(net, 2, scope='dc_fc_2') return net
完整代码的中文注释在:https://github.com/nakaizura/Source-Code-Notebook/tree/master/ACMR
其实这篇文章借鉴领域自适应挺多的,但是确实跨模态的东西与领域自适应是很像的,都是解决不同域分布的特征表示问题,有兴趣可以看下Domain Adaptation(领域自适应,MMD,DANN)。
Look, Imagine and Match: Improving Textual-Visual Cross-Modal Retrieval with Generative Models
CVPR2018,这篇是我个人很喜欢的一篇文章。也是利用Generative Models的思想,但是其本质是rank loss+双向的autoencoder(这可以学习到更好的公共特征)。具体如上图模型结构,这个图虽然一开始看不知道画的什么…但是很厉害,把RL和GAN结合在了同一个框架中。
重点:
1 multi-modal feature embedding。每个模态的特征抽取都会得到两个特征。图像是CNN不同层的特征(如图像左上的蓝色部分CNN由 v h , v l v_h,v_l vh,vl组成,这两个特征从 ImageNet不同层抽取),文本是双向rnn(如右上角的小绿部分由 R N N E N C h , R N N E N C l RNN^h_{ENC},RNN^l_{ENC} RNNENCh,RNNENCl组成,是双向的RNN两个特征)。即图像和文本都抽取高级和低级的特征high-level abstract features and detailed grounded features,然后给图像和文本的特征算一个约束loss(正上方的 L R + L_R+ LR+)。
2 image-to-text。模型图的上半部分是Encoder,下半部分就是Decoder。首先从图片到句子的解码,使用RL,即从左上到右下的蓝色线, R N N D e c RNN_{Dec} RNNDec是用RL的方式从图像得到句子。与真实的句子计算loss L X E + R L L_{XE+RL} LXE+RL。其中这个XE是word-level cost。根据RNN的decoder来predict word,使概率尽可能大。而RL是sentence-level cost。将decoder出来的句子与原句子通过metric(BLEU or CIDEr)计算score,根据score给reward。
3 text-to-image。再从句子到图像的重建使用GAN,即从右上到左下的绿色线,使用GAN重构图像。与真实的图像计算loss D D D。使用KL divergence衡量距离。
code:https://github.com/ujiuxiang/NLP_Practice.PyTorch/tree/master/cross_modal_retrieval
Self-Supervised Adversarial Hashing Networks for Cross-Modal Retrieval
CVPR2018,用于跨模态检索的自监督对抗哈希网络。这篇文章的亮点就是自监督+哈希。
具体来说,模型如上图,有三个部分,一个自监督语义生成网络(LabNet)和两个分别用于图像和文本的对抗网络(ImgNet 和 TexNet)。然后使用两个对抗网络来联合学习高维特征和它们在不同模态下的对应哈希编码(有监督地最大化不同模态之间语义关联和特征分布一致性)。其中,这个自监督语义生成网络(LabNet)是用来来发现多标签标注中的语义信息,然后监督两个模态的语义空间。
paper:https://arxiv.org/abs/1804.01223
Modal-adversarial Semantic Learning Network for Extendable Cross-modal Retrieval
ICMR2018。从图可以看到,先文本和图像各自得到特征后,分类标签得到对抗损失+自监督语义学习(跨模态重建)。
Embedding Network
TPAMI2018,这篇文章的思路没有很新奇,只是是很典型的两种方法:嵌入之后求距离(Embedding Network)和模态之间匹配的概率(Similarity Network)。
code:https://github.com/lwwang/Two_branch_network
Deep Supervised Cross-modal Retrieval
CVPR2019。这篇论文的目的是找到一个关于模态的共同表示空间,以便可以直接比较来自不同模态。即减少标签空间和公共表示空间的识别损失,并利用权值共享策略消除多媒体数据在公共表示空间中的交叉模态差异,学习模态不变特征。
Video-Based Cross-Modal Recipe Retrieval
MM2019,使用Attention做跨模态检索的文章也有不少,调了这一篇放到博客上,主要是因为这份工作有两个Attention,一个Parallel Attention和Co-Attention。
code:https://acmmm2019.wixsite.com/pcan
A Proposal-based Approach for Activity Image-to-Video Retrieval
AAAI2020,基于图像查询的视频检索,主要的不同是将基于图的多示例学习模块(Graph Multi-Instance Learning)整合到跨模态检索框架中,用以解决检索过程中视频信息包中存在的信息冗余问题。
paper:https://arxiv.org/pdf/1911.10531.pdf
code:https://github.com/bcmi/Cross-modal-retrieval
[CVPR2020] Fine-grained Video-Text Retrieval with Hierarchical Graph Reasoning
沿着上一篇文章,继续细化所有细节。作者认为现有嵌入到同一空间的技术无法体现细节,如scenes, objects, actions或者其他组件,所以文章细化了这些组件。主要是将文本分解为包含三个层次的事件、动作、实体的层次语义图,并通过基于注意的图推理生成层次文本嵌入,最后与视频的这三个层次做match。
[NIPS2020] COOT: Cooperative Hierarchical Transformer for Video-Text Representation Learning
博主又来补文了,来自NIPS做video-text检索的任务,基于Transformer的重结构。其他大部分基于BERT结构的文章博主在另一篇文章归纳了 传送门,这篇不是基于BERT范式只是Transformer所以放到这里。整体架构如上图,仍然是两路分支,其中每路都会做:
虽然模型复杂比较重,但也确实是从各个层级学习了表示,frames/words, clip/sentences,videos/paragraphs等等,提供了很多丰富的实验。
[CVPR2021] HiT: Hierarchical Transformer with Momentum Contrast for Video-Text Retrieval
继续补文,最近较火的对比学习终于也开始在各个领域泛用了,这篇文章就是结合Transformer-based和MoCo到视频检索的文章,motivation来自两点:
所以模型架构如上图,Video和Text Encoder都是Transformer,而low-level和high-level则是一前一后。然后拿到这些特征了做两个层面的对比学习,其中会对Video和Text都用memory back的形式来更新(这里和MoCo区别只在于会有不同模态的交互),最后在Feature和Semantic两个层面上计算matching loss来更新就好。
Progressive Semantic Matching for Video-Text Retrieval
继续补补文,今天是ACM MM21的文章。关键点是渐进语义匹配从粗到细的渐进学习过程来缩小语义差距而不是直接学对齐空间,两者的对比如上图a和b。
具体地说,作者构造了一些辅助公共空间,并在每个辅助空间中添加一个边际损失以强制每个层次对多层次模型中的下一个编码器的鉴别特征进行编码,从而使融合公共空间更加有效。而在测试阶段,只利用融合公共空间进行推理即可。详细的模型图如下图:
从上到下来看,输入是视频和句子。然后设计了三个层次的辅助空间和一个融合空间来匹配视频和文本。其中可以看到三个层次分别用了CNN模块、biGRU和Conv 1D对视频进行编码,而且分别使用注意力、均值和最大池化方法将其聚合为声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/739166
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。