本博客系本人阅读该论文,结合个人理解所写,非逐句翻译,欲知文章详情,请参阅论文原文。
论文标题:Attention Bottlenecks for Multimodal Fusion;
作者:Arsha Nagrani, Shan Yang, Anurag Arnab, Aren Jansen, Cordelia Schmid, Chen Sun,
{anagrani, shanyang, aarnab, arenjansen, cordelias, chensun}@google.com
Google Research;
出处:NIPS 202
代码地址:
paperwithcode:Attention Bottlenecks for Multimodal Fusion | Papers With Code
github:https://github.com/google-research/scenic/tree/main/scenic/projects/mbt
人们对世界的认知,对信息的处理是多模态的,而大多的机器学习模型却是仅针对单模态的。同时,处理多模态问题的模型,大多还是使用late-stage的fusion方法,先分别处理单个模态数据之后fusion为多模态结果。本文提出一种基于transformer的多层fusion方法,借助于“fusion bottlenecks”。本文让不同模态的信息穿过许多小的bottlenecks,迫使模型collate和share不同模态中最重要的信息。作者发现通过这种方式,模型的fusion性能更好,且计算消耗降低。本文做了完整的消融实验,在多个音视频分类基准数据集上取得了SOTA的性能,包括Audioset, Epic-Kitchens and VGGSound。代码和模型已公开。
同时的多模态感觉是人类感知学习的关键推动因素。然而对于人工学习系统而言,设计一个unified模型能够处理同时处理多个模态的数据,进行fusion是有难度的:(1)不同模态间学习动态的不同;(2)不同模态内的噪声结构不同,比如某个模态中信息可能对当前任务更有用,而其他模态信息对当前任务可能不太有用;(3)不同的输入数据的表示。音频和视觉的输入表示之间的差距尤其大 --- 许多最先进的音频分类方法依赖于短期傅立叶分析来生成对数梅尔频谱图,然后将它们输入CNN 网络中(这些CNN是专为图像处理设计的)。但是显然,音频的time-frequency表示和图像是有着完全不同的分布的。视频中视觉流一般是三个维度的(两个空间维度和一个时间维度),虽然图像不同空间的区域对应着不同的objects,但是跨帧的图像之间有很多冗余信息,这也是视频处理的一个独特挑战。因此,无论是输入数据的表示,还是神经网络的结构,对不同模态来说都是很不一样的。
本文的目标是视频分类,也就是做音频和视觉(图像)信息的fusion。由于transformer的成功(太成功了,使用场景非常多,适用模态也非常多,这里不再赘述),本文也基于transformer构建自己的模型。一个最简单的思路就是将音频数据和视觉数据先拼接成一个sequence,然后输入进标准的transformer,不需要对transformer结构作大的修改。这样的方式其实就是early-fusion。通过这种方式,transformer里面的attention能够自由、充分地接触和处理来自每个模态的每个维度的信息,但是这种自由是不必要的。因为不同模态间的信息会有冗余,视频的图像帧之间也会有信息冗余。另一方面,这样的attention无法很好进行扩展,对于长时间的视频处理,计算量太大。
针对上述问题,本文设计了两种方式来解决原始transformer中attention的问题。1.如同多数多模态fusion模型一样,将fusion部分往后推移,先让模型单独处理单个模态的信息,然后再做fusion(做mid fusion,而不是early fusion)。这样能够充分提取单模态内部的信息,毕竟不同模态的数据结构和分布差距很大,使用一样的处理方式是不合理的。2.在layer内的不同模态的tokens之间做跨模态的attention。单模态内部仍然是原始的self-attention,但是跨模态的fusion使用每个模态的部分tokens信息来做cross-attention。这样就能降低计算量并且处理部分冗余信息(问题:单模态内部直接使用self-attention,那么其冗余信息就没有处理?或者说在提取单模态信息做 fusion的时候,避开冗余的信息,只提取有效的,这样也算是成功避免了单模态内部冗余信息的影响?毕竟最终的目的是做 fusion)。

本节介绍作者提出的Multimodal Bottleneck Transformer (MBT)结构。首先对最近提出的视觉分类模型Vision Transformer (ViT) 和 音频分类模型Audio Spectrogram Transformer (AST) 做一个总结。然后介绍本文对transformer改进以使之处理音视频分类问题。
ViT(AST)将图像(音频)数据转换为transformer可接受的一维表示,并且尽可能少修改原始transformer结构,以达到处理视觉(音频)数据的目的。Vit中先将图像分割为N个patches,每个patch可以表示为,(实际上,这里的h和w不是三维图像(H * W* C)的这个意义。这里xi的维度是
,其中P是patches的大小,C是图像通道数,具体过程看ViT论文中的解释)。通过线性映射矩阵E,ViT将每个patches映射为一维(维度为d)向量
并和类别向量
进行拼接,最后再加上位置编码
,就将一张图像转换为了标准transformer可接受的输入形式。

然后这些patches(也就是transformer的tokens)被送入后续L个transformer层。每一个transformer层包含使用残差连接的多头自注意力模块 Multi-Headed Self-Attention (MSA), 层正则化模块 Layer Normalisation (LN) 和多层感知机模块 Multilayer Perceptron (MLP) 。将一个transformer层表示为 ,那么其过程可表示为:

其中,MSA进行点积的注意力操作,其querys,keys 和 values 是同一个向量经过不同的线性映射得到的,可表示为。本文稍后定义的在两个不同向量X,Y之间进行的cross-attention操作,其中querys来自X,而keys和values来自Y,可以表示为:
。
本文先提出三种处理音频和视觉信息的多模态transformer的不同的fusion设计方式。

最直接的处理多模态信息的方式就是将视觉和音频信息拼接为一个sequence,然后输入原始的不更改任何结构的transformer中处理。该模型对长 t 秒的视频采样出 F 帧图像,并将音频波形转换为单个频谱图。然后使用ViT中的方式对图像和音频分别进行编码,最后将视觉和音频表示拼接在一起作为一个单独的sequence。
假设从 F 帧图像中一共提取出 个RGB pathces,每个patches表示为
,以及
个频谱图patches,记为
,那么最终得到的 sequence表示是(将图像和频谱图的一个个patch视为一个个token) :

其中 || 代表拼接操作,视觉和音频的映射矩阵 是不同的,他们的类别标签
也是每个模态特有的。
然后使用原始的transformer对上述sequence进行处理:。
该模型下,transformer中的self-attention模块能够自由地提取和处理来自不同模态的所有信息(视觉patches和音频patches)。
作者将3.2.1的模型改为每种模态各自训练自己的参数(即modality-specific),然后使用cross-attention来做信息交换。因此,作者定义了一个cross-transformer层:

其中是
的拼接(论文中没提,但是我感觉应该是拼接的结果), corss-transformer的输入是不完全一样的两个输入(不同于原始transformer),它的过程与原始transformer的差距在于公式(2)变为下面的公式(6),用cross-attention替换了原始attention。当参数
一样时,本节的方法和3.2.1就是一样的。

为了降低原始attention的计算复杂性,作者在transformer的输入sequence中引入了B个 fusion bottleneck tokens ,记为
如图2所示。那么现在的输入就变成了:

然后作者将跨模态的attention限制在这些bottlenecks内,对于层layer而言,计算过程变为:

因此,视觉和音频的向量更新只能通过bottleneck tokens来进行,作者通过限制bottleneck tokens的数量远小于原始tokens的数量,来降低计算复杂度。并且通过较少的bottleneck传递跨模态信息时,模型迫使每个模态浓缩自己的信息,且仅传递最重要的信息给另一个模态(避免了模态中冗余信息的传递和计算)。该公式中,bottleneck tokens的向量更新了两次,先用visual信息更新一次(公式8),再用audio信息更新一次(公式9)。(问题:这样的话,模型两个模态的处理过程就成了串行的,先处理visual,再处理audio,会不会影响模型的计算速度呢?)后续实验证明,该模型在保持甚至超越其他模型性能的情况下,降低了计算量。
上一节介绍的是一个transformer layer 内的计算方式,大多数基于transformer的工作堆叠的多个 transformer layer都使用相同的操作(比如ViT)。然而在多模态transformer中,一个共识是在前期先让各个模态分别学习自己的特征,后期再进行多模态的融合。因为我们通常认为前面的层用来学low-level的特征,后面的层学习high-level的特征,而low-level的不同模态特征之间可能还没有出现明显的关联关系,所以融合要放在后面层进行。
本文采用这样的方式实现对fuse位置的控制:在模型的前层transformer先做简单的单模态内的self-attention,然后将两个模态的向量拼接起来,作为后面的
层fusion transformer的输入(后面这些层的fusion方法使用3.2中的方式)。这样的话,当
就是early fusion,
就是late fusion,
就是mid fusion。也就是下面这样:

(3.2节介绍的不同layer内fusion方法,在这一节的应用其实只在后面层。因为后面这些才是fusion层,前面的
层是单独处理每个模态信息的部分,不做fusion。一个错误的理解是前面
层不是很像3.2.1的计算方式吗?其实概念完全不同。)
对本文中所有模型及其变体,都使用CLS token作为分类器的输入。作者将输入相同的线性分类器,然后得到pre-softmax logits的均值。
实验任务:视频分类;
数据集:AudioSet, Epic-Kitchens-100 and VGGSound(附录中还有数据集Moments in
Time and Kinetics上的结果);
数据集详情见论文,包括样本数量和处理方式。
本文使用ViT-Base作为backbone,bottleneck tokens的数目设置为B=4。
4.3 消融分析
本节对不同的模型结构做了消融实验。
本文对3.2中的三种fusion方式分别进行了实验:
(1)最直接的self-attention:层内的attention可以不受限制地访问所有隐式单元(也就是视觉和音频的单模态表示拼接之后直接输入后面原始的transformer层做fusion);
(2)使用不同参数的简单cross-attention:不同模态的transformer层参数不同,每种模态的表示的更新都会访问到所有模态的信息(理解主要看3.2.2的公式),也就是attention依然是面向所有模态信息的;
(3)bottleneck fusion:此方式下的每种模态的表示的更新只能通过访问bottleneck tokens进行,也就是attention只在单模态信息和bottleneck tokens之间进行。
上面的(2)(3)的fusion方式只是单layer内的,为了测试early,mid,late fusion方式对模型的影响,本文还对的值进行实验。
本文还对不同模态(策略(1)和(2)中)之间是否share weights的影响进行了实验。结果在附录的图7中,如下图7所示。当fusion的层数较早时,使用separate的参数效果更好。当late fusion时,是否share weights差距不大。(这是否说明模型的前面层所捕获的信息更modal-specfic,后面的更multimodal了)

本文对3.2.2和3.2.3两种fusion方法做了不同融合层选择的实验,。从下图3左可以看出,mid fusion比early fusion(
)和late fusion(
)好。这意味着将融合层放在later的位置,前面的层用来提取模态各自的特征,是有效果的。

在上图3左中可以看出,使用attention bottleneck的模型在所有fusion层数选择下结果都比简单的cross-attention模型好。本文还对模型的计算量进行了实验,使用GFLOPs指标,如上图3右。从中可以看出只用很少的bottleneck tokens数目(B=4),本文的模型计算量(红色线条)就比cross-attention(蓝色线条)低很多,且不随着Lf的变化而变化。
本文还对B=4,36,64,256,1024进行了实验。发现实验结果差距不大(少于0.5mPA),所以本文后续实验均设置B=4。只用4个bottleneck tokens就可以实现多模态融合的性能提升,以及大大降低模型计算量,说明本文的设计很有用。
本节探讨了不同模态上采样策略的影响,同时和单模态模型baselines--仅作用于RGB图像上的纯视觉的transformer和仅作用于音频上的纯音频的transformer进行了对比。
采样窗口大小t:本文transformer模型的一个优势就是可以处理变长的输入长度(为什么?我不懂,transformer的输入tokens数目是固定的吧,不足长的补全)。本文对视频的不同采样窗口t值2,4,6,8进行了实验,结果如下图4所示。在推理时,作者统一采样多个窗口以便能覆盖整个视频。当音频的频谱图 patches数目随着t变化时,作者保持RGB patches的数目
不变而改变采样帧的步长(避免内存溢出)。从图4中可以看出,随着输入的增多,audio-only和audio-visual的模型性能跟着增加,但是纯视觉的模型visual-only性能却在降低(作者猜测,可能是增大的步长导致采样出的帧数目减少,训练数据少了)。后文实验中设置t=8s。

同步与异步采样:因为视频中音频和视频(图像)并不一定是完全对齐的,这里实验了不同模态中异步采样带来的影响。结果与分析详见附录。作者发现采样方式对结果影响不大,所以最终选择了同步采样。
模态混合:在将 Mixup rerularization 应用于训练时,有两种不同的方法可以将其应用于多模态输入——标准方法是使用概率参数 α 对一组混合权重进行采样,并使用它来生成所有虚拟模态 -标签对。 此外,本文还探索了一个称之为模态混合的修改版本,它为每个模态采样一个独立的权重。 模态混合比标准混合施加更强的增强,带来 AudioSet 上的性能略有提高。
数据集规模的影响:图5中体现了训练样本规模不同的差距。

与单模态性能对比:见下表1,2,3.
与SOTA模型对比:见下表1,2,3.



attention maps的可视化:

本文提出了一个新的基于transformer的音视频融合结构,探讨了一些列使用cross-attention进行模态融合的策略。
未来可以考虑将MBT应用于更多模态,比如文本和光流。
进一步的影响:
本文任务是视频分类,方法是多模态视觉(图像)和音频融合。
主要思路是:原始transformer里面的attention层能够freely接触和处理每个token之间的关系,这样对于模态内的冗余信息会造成计算量浪费。所以本文将原始transformer中attention层修改为模态内attention(保持self-attention结构不变)+ 模态间attention(设计cross-attention只在每个模态的部分token之间做attention,避免过度计算冗余信息,降低计算量。并且选择了mid fusion,探讨了fusion层在模型early,mid,late部分的影响。
动漫制作技巧是很多新人想了解的问题,今天小编就来解答与大家分享一下动漫制作流程,为了帮助有兴趣的同学理解,大多数人会选择动漫培训机构,那么今天小编就带大家来看看动漫制作要掌握哪些技巧?一、动漫作品首先完成草图设计和原型制作。设计草图要有目的、有对象、有步骤、要形象、要简单、符合实际。设计图要一致性,以保证制作的顺利进行。二、原型制作是根据设计图纸和制作材料,可以是手绘也可以是3d软件创建。在此步骤中,要注意的问题是色彩和平面布局。三、动漫制作制作完成后,加工成型。完成不同的表现形式后,就要对设计稿进行加工处理,使加工的难易度降低,并得到一些基本准确的概念,以便于后续的大样、准确的尺寸制定。四、
2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p
Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图
目前我正在使用这个正则表达式从YoutubeURL中提取视频ID:url.match(/v=([^&]*)/)[1]我怎样才能改变它,以便它也可以从这个没有v参数的YoutubeURL获取视频ID:http://www.youtube.com/user/SHAYTARDS#p/u/9/Xc81AajGUMU感谢阅读。编辑:我正在使用ruby1.8.7 最佳答案 对于Ruby1.8.7,这就可以了。url_1='http://www.youtube.com/watch?v=8WVTOUh53QY&feature=feedf'url
我正在使用RABL输出Sunspot/SOLR结果集,搜索结果对象由多种模型类型组成。目前在rablView中我有:objectfalsechild@search.results=>:resultsdoattribute:id,:resource,:upccodeattribute:display_description=>:descriptioncode:start_datedo|r|r.utc_start_date.to_iendcode:end_datedo|r|r.utc_end_date.to_iendendchild@search=>:statsdoattribute:to
一、什么是web项目ui自动化测试?通过测试工具模拟人为操控浏览器,使软件按照测试人员的预定计划自动执行测试的一种方式,可以完成许多手工测试无法完成或者不易实现的繁琐工作。正确使用自动化测试,可以更全面的对软件进行测试,从而提高软件质量进而缩短迭代周期。二、构建测试用例的“九部曲”(一)创建流程包划分功能模块日常测试活动中,都会根据功能模块进行拆分,所以在设计器中我们可以通过创建流程包的方式来拆分需要测试的功能模块,如下图中操作创建一个电脑流程包并且取名为对应的功能模块名称,如果有多个功能模块就创建多个对应的流程包,实在RPA设计器有易用的图形可视化界面,方便管理较多的功能模块。(二)在流程包
目录需求基于JavaCV跨平台执行ffmpeg命令[^1]坑一内存不足坑二多个ffmpeg进程并行导致IO负载大,进而导致ioerror?坑三使用Java操作ffmpeg时,有时会卡死坑四Process的waitFor死锁问题及解决办法需求给透明背景的视频自动叠加一张背景图片基于JavaCV跨平台执行ffmpeg命令1我测试发现的本需求的最小依赖:dependency>groupId>org.bytedecogroupId>artifactId>ffmpeg-platform-gplartifactId>version>5.0-1.5.7version>dependency>核心代码:Stri
摘要本论文主要论述了如何使用Python技术开发一个短视频智能推荐,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,作者将论述短视频智能推荐的当前背景以及系统开发的目的,后续章节将严格按照软件开发流程,对系统进行各个阶段分析设计。 短视频智能推荐的主要使用者分为管理员和用户,实现功能包括管理员:首页、个人中心、用户管理、热门视频管理、用户上传管理、系统管理,用户:首页、个人中心、用户上传管理、我的收藏管理,前台首页;首页、热门视频、用户上传、公告信息、个人中心、后台管理等功能。由于本网站的功能模块设计比较全面,所以使得整个短视频智能推荐信
我有一个连接表create_table"combine_tags",force:truedo|t|t.integer"user_id"t.integer"habit_id"t.integer"valuation_id"t.integer"goal_id"t.integer"quantified_id"end其目的是让tag_cloud为多个模型工作。我把它放在application_controllerdeftag_cloud@tags=CombineTag.tag_counts_on(:tags)end我的tag_cloud看起来像这样:css_class%>#orthisdepen
基于ffmpeg的视频处理与MPEG的压缩试验ffmpeg介绍与基础知识对提取到的图像进行处理RGB并转化为YUV对YUV进行DCT变换对每个8*8的图像块进行进行量化操作ffmpeg介绍与基础知识ffmpeg是视频和图像处理的工具包,它的下载网址是https://ffmpeg.org/download.html。页面都是英文且下载正确的包的路径笔者找的时候还费点劲,这里记录一下也方便读者。选中这个Windows下的下午files,选择第一个这里有essential和full版本的,大家根据需要自行选择版本包下载下载好之后,在官网上下载ffmpeg的full包,一共300+MB解压,然后安装b