现阶段视频分类算法,主要聚焦于视频整体的内容理解,给视频整体打上标签,粒度较粗。较少的文章关注时序片段的细粒度理解,同时也从多模态角度分析视频。本文将分享使用多模态网络提高视频理解精度的解决方案,并在youtube-8m 数据集中取得较大提升。
在视频分类人物中,NeXtVLAD[1] 被证明是一种高效、快速的视频分类方法。受ResNeXt方法的启发,作者成功地将高维的视频特征向量分解为一组低维向量。该网络显着降低了之前 NetVLAD 网络的参数,但在特征聚合和大规模视频分类方面仍然取得了显着的性能。
RNN[2] 已被证明在对序列数据进行建模时表现出色。研究人员通常使用 RNN 对 CNN 网络难以捕获的视频中的时间信息进行建模。GRU[3] 是 RNN 架构的重要组成部分,可以避免梯度消失的问题。 Attention-GRU[4] 指的是具有注意机制,有助于区分不同特征对当前预测的影响。
为了结合视频任务的空间特征和时间特征,后来又提出了双流CNN[5]、3D-CNN[6]、以及slowfast[7]和ViViT[8]等。虽然这些模型在视频理解任务上也取得良好的表现,但还有提升的空间。比如,很多方法只针对单个模态,或者只对整个视频进行处理,没有输出细粒度的标签。
本技术方案是旨在充分学习视频多模态(文本、音频、图像)的语义特征,同时克服 youtube-8m数据集样本极不均衡和半监督的问题。
如Figure 1所示,整个网络主要由前面混合多模态网络(mix-Multmodal Network)和后面的图卷积网络(GCN[9])组成。mix-Multmodal Network 由三个差异化的多模态分类网络构成,具体差异化参数在Table1中。

Figure 1. 整体网络结构

Table 1. 三个差异化的 Multimodal Net 的参数
如图Figure 2所示,多模态网络主要理解三个模态(文本、视频、音频),每个模态都包含三个过程:基础语义理解、时序特征理解、模态融合。其中,视频和音频的语义理解模型分别使用的是EfficientNet[10]和VGGish,时序特征理解模型是NextVLAD。而文本的时序特征理解模型为Bert[11]。
多模态特征融合,我们采用的是SENet[12]。SENet网络的前处理需要将各个模态的特征长度强行压缩对齐,这样会导致信息丢失。为了克服这个问题,我们采用了多Group的SENet的网络结构。实验表明,多个group的SENet网络相较于单个SENet 学习能力更强。

Figure 2. 多模态网络结构
由于Youtube-8M粗粒度标签全部标注,细粒度标签只标注了部分数据。因此,引入 GCN来进行半监督分类任务。基本思想是通过在节点之间传播信息来更新节点表示。对于多标签视频分类任务,标签依赖关系是一个重要信息。
我们使用标签之间的条件概率将标签相关信息引入我们的建模。基于Youtube-8M 数据集粗粒度标签,我们首先统计每个标签的出现次数,得到一个矩阵 N∈Rᶜ 。C 是所有类别的数量。然后我们统计所有标签对的并发次数,这样就可以得到并发矩阵 M∈Rᶜ﹡ᶜ 。最终得到条件概率矩阵 P∈Rᶜ﹡ᶜ :

Pᵢⱼ 表示标签 i 出现时标签 j 的出现概率。
但是,来自训练和测试数据集的共现矩阵可能并不完全一致,数据集标签也不是 100% 正确。另一方面,一些罕见的共现对我们来说可能不是真正的关系,可能只是噪音。因此,我们可以使用阈值 λ 将 Pᵢⱼ 过滤到 Pᵢⱼ’ :

在我们的任务中,每个标签将是图(graph)的一个节点(node),两个节点之间的线表示它们的关系[13] [14]。所以我们可以训练一个矩阵来表示所有节点的关系。
以从我们的数据集中提取的一个简化的标签相关图 Figure 3为例,Label BMW --> Label Car,表示当 BMW 标签出现时,Label Car 很可能发生,但反之则不一定。标签 Car 与所有其他标签具有高度相关性,没有箭头的标签表示这两个标签彼此没有关系。

Figure 3. 标签相关性示意图
GCN网络实现如Figure 4所示。GCN模块由两层堆叠的GCN(GCN(1) 和 GCN(2))组成,它们有助于学习标签相关图,以将这些标签表示映射到一组相互依赖的分类器中。 A 是输入相关矩阵,P’ 由矩阵的值初始化。
W₁ 和 W₂是将在网络中训练的矩阵。W 是GCN学习到的分类器权重。

Figure 4. GCN网络结构
Youtube-8M 视频分类任务是一个多标签分类任务,然而,注释数据仅选择多标签中的一个进行标注为1,其余标签均为0。也就是说,某一个视频片段除了可能是标注的还可能是其他置为0的标签。这个问题也是个弱监督问题。
针对此情况,我们提出了一种解决方法。在计算损失时给带注释的类赋予较大的权重,并为未注释的类赋予较小的权重[15]。这种加权交叉熵方法将帮助模型更好地从不完整的数据集中学习。
原始二元交叉熵损失函数为:

其中 y∈Rᴮ﹡ᶜ 是视频片段的标签,p∈Rᴮ﹡ᶜ 是模型预测结果Prediction,B 是batch size,C 是所有类的数量。
新的标签重加权损失函数如下:

其中,权重 w∈Rᴮ﹡ᶜ 定义为:

n 是添加到未注释类的小权重,m 是已注释类的大值权重。
为了避免在训练模型时过拟合,我们添加了随机生成的高斯噪声并随机注入到输入特征向量的每个元素中。
如Figure 6 所示,噪声将被添加到输入特征向量中,掩码向量随机选择 50% 的维度并将值设置为 1。这里的高斯噪声是独立的,但对于不同的输入向量具有相同的分布。

Figure 6. 加高斯噪声
同时,为了避免多模态模型只学习某一个模态的特征,也就是在模态上过拟合。我们将模态特征也mask,保证输入中至少有某一个模态,如Figure 7所示。这样就可以充分学习各个模态。

Figure 7. 模态Mask
模型性能根据 MAP@K 进行评估,其中K=100,000。

其中, C 是类数, n 是为每个类预测的段数。N 是每个类的正标记段数。 P(k) 是前 k 个预测片段的精度。 rel(k) 是一个函数,用于判断排名k 的片段是否被正确预测(如果正确则等于 1,否则为 0)。
为了验证多模态中每个模态的收益,我们做了消融实验,结果如 Table 2所示。单个模态作为特征时,Video 的准确率最高,Audio的准确率最低,Text接近Video。双模态时,Video + Text 由明显提升,再加上 Audio后,提升有限。

Table 2. 多模态消融实验
同样为验证GCN的收益,我们也做了对比实验,其中阈值λ我们选择了两个,分别是 0.2 和0.4。如Table 3 所示,结果表明,原始模型(org)相比,GCN 生成的分类器有助于提高性能,特别时当λ=0.4时。

Table 3. 图卷积实验
为了验证并联的多模态网络和差异化后的效果,我们设计五组实验。第一组模型是单独的1个多模态网络,第二、三、四组是2个、3个、4个并联的多模态网络,第五组是差异化的3个并联的多模态网络。
从结果来看,并联网络能提高精度,但是并联4个以后进度会下降,所以一味的增加并联的网络数并不能带来收益。同时,实验结果还表明,差异化的网络结构能更有效的拟合数据。

Table 4. 差异化多模态网络实验
标签重加权由两个超参(n和m),通过实验表明,当n=0.1 和m=2.5时准确率提高较高。

Table 5. 标签重加权实验
特征增强属于数据增强的一种。实验表明,通过加入高斯噪声,和mask掉某些模态,都能提高模型的泛化能力。且此种加入高斯噪声方式,实现简单,迁移性强,易于再其他网络中实现。

Table 6. 特征增强实验
实验表明,上述几种方法均有不同程度的提高,尤其以多模态和图卷积提升比较明显。我们希望在未来探索更多的标签依赖关系。 GCN 网络也被证明在这项任务中很有用,我们认为值得我们做更多的实验,将 GCN 网络与其他最先进的视频分类网络结合起来。
引用
[1]. Rongcheng Lin, Jing Xiao, Jianping Fan: NeXtVLAD: An Efficient Neural Network to Aggregate Frame-level Features for Large-scale Video Classification. In: ECCV, workshop(2018)
[2]. Jeffrey L Elman. Finding structure in time. Cognitive science, 14(2):179–211, 1990
[3]. Kyunghyun Cho, Bart Van Merrienboer, ¨ Caglar Gulcehre, Dzmitry Bahdanau, Fethi Bougares, Holger Schwenk, and Yoshua Bengio. Learning phrase representations using rnn encoder-decoder for statistical machine translation. arXiv, 2014.
[4]. Jan K Chorowski, Dzmitry Bahdanau, Dmitriy Serdyuk, Kyunghyun Cho, and Yoshua Bengio. Attention-based models for speech recognition. In NIPS, pages 577–585, 2015.
[5]. Karen Simonyan, Andrew Zisserman, Two-Stream Convolutional Networks for Action Recognition in Videos. In: NIPS (2014)
[6]. Du Tran, Lubomir Bourdev, Rob Fergus, Lorenzo Torresani, Manohar Paluri Learning Spatiotemporal Features With 3D Convolutional Networks. In: ICCV(2015)
[7]. Christoph Feichtenhofer, Haoqi Fan, Jitendra Malik, Kaiming He, SlowFast Networks for Video Recognition. In: CVPR (2019)
[8]. Anurag Arnab, Mostafa Dehghani, Georg Heigold, Chen Sun, Mario Lučić, Cordelia Schmid, ViViT: A Video Vision Transformer. In: CVPR (2021)
[9]. Zhao-Min Chen, Xiu-Shen Wei, Peng Wang, Yanwen Guo: Multi-Label Image Recognition with Graph Convolutional Networks. In: CVPR (2019)
[10]. Mingxing Tan, Quoc V. Le, EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks, PMLR 97:6105-6114, 2019
[11]. Jacob Devlin, Ming-Wei Chang, Kenton Lee, and Kristina Toutanova, BERT: Pre-training of deep bidirectional transformers for language understanding. In North American Association for Computational Linguistics (NAACL), 2019
[12]. Jie Hu, Li Shen, Gang Sun, Squeeze-and-Excitation Networks. In: CVPR (2018)
[13]. Zhang Z, Sabuncu M. Generalized cross entropy loss for training deep neural networks with noisy labels[C]//Advances in neural information processing systems. 2018: 8778-8788.
[14]. Pereira R B, Plastino A, Zadrozny B, et al. Correlation analysis of performance measures for multi-label classification [J]. Information Processing & Management, 2018, 54(3): 359-369.
[15]. Panchapagesan S, Sun M, Khare A, et al. Multi-Task Learning and Weighted Cross-Entropy for DNN-Based Keyword Spotting[C]. 2016: 760-764.
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时
作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代
Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题
对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r
刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr