StNet 作者

PaddlePaddle视频联合时空建模方法开源 | ActivityNet Kinetics夺冠

百度视觉技术部联合PaddlePaddle团队近期开源了用于视频分类的StNet框架。StNet框架为ActivityNetKinetics Challenge 2018中夺冠的网络框架。本次开源了基于ResNet50实现的StNet模型。该模型提出“super-image"的概念,在super-image上进行2D卷积,建模视频中局部时空相关性。另外通过temporal modeling block建模视频的全局时空依赖,最后用一个temporalXception block对抽取的特征序列进行长时序建模。该框架在动作识别方面优于一些最先进的方法,可以在识别精度和模型复杂性之间取得令人满意的平衡。

应用背景

视频当中的动作识别任务已经获得了许多从事计算机视觉机器学习研究人员的重点关注。越来越多的视频录像设备的普及,让更多好玩有趣的视频丰富了人们的业余生活。但是过多的视频已经远远超过人工能够处理的范围,因此发展针对各种应用场景的自动视频理解算法变得尤为重要,比如:视频推荐、人类行为分析、视频监控等等。

深度学习在静态图像理解上取得了巨大成功,但是针对视频时空建模中最有效的网络架构是什么还尚不清楚,因此我们将新探索的用于视频中局部和全局时空建模的时空网络(StNet)架构与现有的CNN+RNN模型或是基于纯3D卷积的方法进行比对分析,来寻求更有效的网络架构。

现有方法分析

由于深度学习在图片识别中的卓越表现,该技术也被应用到了解决视频分类的场景当中。这其中就有两个主要的研究方向,一个是应用CNN+RNN框架结构来对视频序列建模,还有一个是单纯的利用卷积网络结构来识别视频当中的行为。但是在动作识别准确性方面,目前的行动识别方法仍然远远落后于人类表现。现有方法存在如下待改进之处。

  • CNN+RNN模型

  • 对于CNN+RNN的方法,CNN前馈网络部分用来空间建模(spatial modeling),LSTM或者GRU用来时域建模(temporal modeling),由于该模型自身的循环结构,这导致了端到端的优化困难。

  • 单独训练的CNN和RNN部分对于联合的时空特征表示学习(representation learning)不是最佳的。

  • 纯卷积网络结构

  • 2D卷积网络结构在抽取外观特征(appearancefeatures)的时候,只利用了局部的空间信息而忽略了局部的时域信息;此外,对于时域动态,2D卷积网络仅融合了几个局部片段的分类得分并计算平均值,这种取平均的方法在捕捉时空信息方面的性能有待提高。

  • 3D卷积网络结构可以同时在空间和时间上建模进而得到令人满意的识别任务结果。众所周知,浅层的神经网络与深层神经网络相比,浅层网络在大数据集中,表现出较差的表示学习能力。当进行大规模数据集中的人类行为识别任务时,一方面浅层的3D卷积网络得到的视频特征的可辨别性相对深层网络较弱,另一方面,深层的3D卷积网络会导致过大的模型以及在训练中和推理阶段中过高的计算成本。

StNet模型

局部信息和全局信息对识别视频中的行为都起着非常重要的作用。

例如,在图1(a)中,我们可以通过局部的空间信息来识别搬砖和搬石头,换而言之,在该图中,局部的空间信息(local spatial information)是我们识别行为至关重要的因素。而在图1(b)中,全局时空(global spatial-temporal)线索是用来区分”摞卡片”和”飞卡片”这两个场景行为的关键证据。

图1 局部信息足以区分”搬砖”和”搬石头”;全局时空信息可以分别”摞卡片”和”飞卡牌”

StNet可以由先进的2D卷积网络改造可得,比如:ResNet,InceptionResnet等等。图2展示了如何从Resnet构建StNet。 

图2:基于ResNet骨架构建的StNet。StNet的输入是T ×3N×H ×W张量。通过2D卷积对局部时空模型进行模型。在Res3和Res4块之后插入时序卷积模块进行全局时空特征建模。最后,用时序Xception模块进一步建模时序动态信息。3D卷积的设置是(# Output Channel, (temporal kernel size,height kernel size, width kernel size), # groups) -(Ci,(3,1,1), 1)

1.   超图像(Super-Image):

StNet的输入为均匀采样的T个局部连续N帧的视频帧。局部的连续N帧组合成一个”超图”,这使得”超图”保留原始视频各个局部的时空信息。所以网络的输入是一个尺寸为T*3N*H*W的张量

2.   时域建模块(Temporal Modeling Block):

采用2D卷积对T个”超图”进行局部时空关系的建模,可以避免3D 卷积网络参数量和计算量大的问题,进而生成T个局部时空特征图。通过堆叠3D卷积/2D卷积模块,对T个局部时空特征图进行全局时空信息的建模,这对理解整个视频起到至关重要的作用。具体而言,我们选择插入2个时域建模块在Res3和Res4块之后。时域建模块是为了捕捉视频序列内的长期时域动态,可以利用Conv_3d-BN3d-RELU架构实现。将3D卷积空间维度的kernel size设置成1以节省模型的参数量与计算量。

3.   时域Xception模块(TemporalXception Block):

时域Xception模块是为了在特征序列之间进行有效的时域建模,并能轻松地进行端到端优化。Xception模块的设计主要基于时序1维卷积,采用了channel-wise和temporal-wise分离的策略进一步减少计算量与模型参数量。

时域Xception块结构如下:

图3:时域 Xception 块(TXB)。时域Xception 块的详细配置如(a)所示:括号中的参数表示 1D卷积的(#kernel,kernel size,padding,#groups)配置。绿色的块表示 channel-wise 的 1D 卷积,蓝色的块表示 temporal-wise 的 1D 卷积。(b)描绘了channel-wise 和 temporal-wise 的1D 卷积。TXB 的输入是视频的特征序列,表示为T×C_in 张量。Channel-wise 1D 卷积的每个卷积核仅在一个通道内沿时间维度应用。Temporal-wise 的 1D 卷积核在每个时序特征中跨所有通道进行卷积。

基于PaddlePaddle实战

环境准备:PaddlePaddleFluid 1.3 + cudnn5.1 。使用cudnn7.0以上版本时batchnorm计算moving mean和moving average会出现异常,此问题还在修复中。建议用户安装PaddlePaddle时指定cudnn版本。

数据准备:Kinetics数据集是DeepMind公开的大规模视频动作识别数据集,有Kinetics400与Kinetics600两个版本。这里使用Kinetics400数据集。

ActivityNet官方提供了Kinetics的下载工具,具体参考其官方repo 即可下载Kinetics400的mp4视频集合。将kinetics400的训练与验证集合分别下载到dataset/kinetics/data_k400/train_mp4dataset/kinetics/data_k400/val_mp4。

官方repo:

https://github.com/activitynet/ActivityNet/tree/master/Crawler/Kinetics

模型训练:数据准备完毕后,通过以下方式启动训练(方法 1),同时我们也提供快速启动脚本 (方法 2)

  • 方法1

python train.py --model-name=STNET       
       --config=./configs/stnet.txt       
       --save-dir=checkpoints         
       --log-interval=10         
       --valid-interval=1
  • 方法2

  • bash scripts/train/train_stnet.sh

用户也可下载Paddle Github上已发布模型通过--resume指定权重存放路径进行finetune等开发。

数据预处理说明:模型读取Kinetics-400数据集中的mp4数据,每条数据抽取seg_num段,每段抽取seg_len帧图像,对每帧图像做随机增强后,缩放至target_size。

训练策略:

  • 采用Momentum优化算法训练,momentum=0.9

  • 权重衰减系数为1e-4

  • 学习率在训练的总epoch数的1/3和2/3时分别做0.1的衰减

模型评估:通过以下方式(方法 1)进行模型评估,同样我们也提供了快速启动的脚本(方法 2):

  • 方法1

python test.py --model-name=STNET        
       --config=configs/stnet.txt       
       --log-interval=1         
       --weights=$PATH_TO_WEIGHTS
  • 方法2

bash scripts/test/test__stnet.sh
  • 使用scripts/test/test_stnet.sh进行评估时,需要修改脚本中的--weights参数指定需要评估的权重

  • 若未指定--weights参数,脚本会下载已发布模型进行评估。

模型推断:可通过如下命令进行模型推断:

python infer.py --model-name=stnet        
       --config=configs/stnet.txt        
       --log-interval=1         
       --weights=$PATH_TO_WEIGHTS         
       --filelist=$FILELIST


  • 模型推断结果存储于STNET_infer_result中,通过pickle格式存储。

  • 若未指定--weights参数,脚本会下载已发布模型进行推断。

模型精度:当模型取如下参数时,在 Kinetics400数据集上的指标为:

参数取值

参数

取值

seg_num

25

seglen

5

target_size

256

评估精度

精度指标

模型精度

TOP_1

0.69

传送门:

PaddlePaddle Github: 

https://github.com/PaddlePaddle 

StNet in PaddlePaddle Github:

https://github.com/PaddlePaddle/models/blob/develop/fluid/PaddleCV/video/models/stnet

Reference:Dongliang He, Zhichao Zhou, Chuang Gan, Fu Li, Xiao Liu, Yandong Li, Limin Wang, Shilei Wen,StNet:Local and Global Spatial-Temporal Modeling for Action Recognition

https://arxiv.org/abs/1811.01549

PaddlePaddle
PaddlePaddle

PaddlePaddle是百度独立研发的深度学习平台,易用,高效,灵活可伸缩,可支持海量图像识别分类、机器翻译和自动驾驶等多个领域业务需求,现已全面开源。

工程计算机视觉RNNCNN机器学习深度学习视频分类StNetPaddlePaddle
3
相关数据
DeepMind机构

DeepMind是一家英国的人工智能公司。公司创建于2010年,最初名称是DeepMind科技(DeepMind Technologies Limited),在2014年被谷歌收购。在2010年由杰米斯·哈萨比斯,谢恩·列格和穆斯塔法·苏莱曼成立创业公司。继AlphaGo之后,Google DeepMind首席执行官杰米斯·哈萨比斯表示将研究用人工智能与人类玩其他游戏,例如即时战略游戏《星际争霸II》(StarCraft II)。深度AI如果能直接使用在其他各种不同领域,除了未来能玩不同的游戏外,例如自动驾驶、投资顾问、音乐评论、甚至司法判决等等目前需要人脑才能处理的工作,基本上也可以直接使用相同的神经网上去学而习得与人类相同的思考力。

深度学习技术

深度学习(deep learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。 深度学习是机器学习中一种基于对数据进行表征学习的算法,至今已有数种深度学习框架,如卷积神经网络和深度置信网络和递归神经网络等已被应用在计算机视觉、语音识别、自然语言处理、音频识别与生物信息学等领域并获取了极好的效果。

权重技术

线性模型中特征的系数,或深度网络中的边。训练线性模型的目标是确定每个特征的理想权重。如果权重为 0,则相应的特征对模型来说没有任何贡献。

机器学习技术

机器学习是人工智能的一个分支,是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、计算复杂性理论等多门学科。机器学习理论主要是设计和分析一些让计算机可以自动“学习”的算法。因为学习算法中涉及了大量的统计学理论,机器学习与推断统计学联系尤为密切,也被称为统计学习理论。算法设计方面,机器学习理论关注可以实现的,行之有效的学习算法。

参数技术

在数学和统计学裡,参数(英语:parameter)是使用通用变量来建立函数和变量之间关系(当这种关系很难用方程来阐述时)的一个数量。

学习率技术

在使用不同优化器(例如随机梯度下降,Adam)神经网络相关训练中,学习速率作为一个超参数控制了权重更新的幅度,以及训练的速度和精度。学习速率太大容易导致目标(代价)函数波动较大从而难以找到最优,而弱学习速率设置太小,则会导致收敛过慢耗时太长

张量技术

张量是一个可用来表示在一些矢量、标量和其他张量之间的线性关系的多线性函数,这些线性关系的基本例子有内积、外积、线性映射以及笛卡儿积。其坐标在 维空间内,有 个分量的一种量,其中每个分量都是坐标的函数,而在坐标变换时,这些分量也依照某些规则作线性变换。称为该张量的秩或阶(与矩阵的秩和阶均无关系)。 在数学里,张量是一种几何实体,或者说广义上的“数量”。张量概念包括标量、矢量和线性算子。张量可以用坐标系统来表达,记作标量的数组,但它是定义为“不依赖于参照系的选择的”。张量在物理和工程学中很重要。例如在扩散张量成像中,表达器官对于水的在各个方向的微分透性的张量可以用来产生大脑的扫描图。工程上最重要的例子可能就是应力张量和应变张量了,它们都是二阶张量,对于一般线性材料他们之间的关系由一个四阶弹性张量来决定。

验证集技术

验证数据集是用于调整分类器超参数(即模型结构)的一组数据集,它有时也被称为开发集(dev set)。

计算机视觉技术

计算机视觉(CV)是指机器感知环境的能力。这一技术类别中的经典任务有图像形成、图像处理、图像提取和图像的三维推理。目标识别和面部识别也是很重要的研究领域。

神经网络技术

(人工)神经网络是一种起源于 20 世纪 50 年代的监督式机器学习模型,那时候研究者构想了「感知器(perceptron)」的想法。这一领域的研究者通常被称为「联结主义者(Connectionist)」,因为这种模型模拟了人脑的功能。神经网络模型通常是通过反向传播算法应用梯度下降训练的。目前神经网络有两大主要类型,它们都是前馈神经网络:卷积神经网络(CNN)和循环神经网络(RNN),其中 RNN 又包含长短期记忆(LSTM)、门控循环单元(GRU)等等。深度学习是一种主要应用于神经网络帮助其取得更好结果的技术。尽管神经网络主要用于监督学习,但也有一些为无监督学习设计的变体,比如自动编码器和生成对抗网络(GAN)。

大数据技术技术

大数据,又称为巨量资料,指的是传统数据处理应用软件不足以处理它们的大或复杂的数据集的术语。

堆叠技术

堆叠泛化是一种用于最小化一个或多个泛化器的泛化误差率的方法。它通过推导泛化器相对于所提供的学习集的偏差来发挥其作用。这个推导的过程包括:在第二层中将第一层的原始泛化器对部分学习集的猜测进行泛化,以及尝试对学习集的剩余部分进行猜测,并且输出正确的结果。当与多个泛化器一起使用时,堆叠泛化可以被看作是一个交叉验证的复杂版本,利用比交叉验证更为复杂的策略来组合各个泛化器。当与单个泛化器一起使用时,堆叠泛化是一种用于估计(然后纠正)泛化器的错误的方法,该泛化器已经在特定学习集上进行了训练并被询问了特定问题。

百度机构

百度(纳斯达克:BIDU),全球最大的中文搜索引擎、最大的中文网站。1999年底,身在美国硅谷的李彦宏看到了中国互联网及中文搜索引擎服务的巨大发展潜力,抱着技术改变世界的梦想,他毅然辞掉硅谷的高薪工作,携搜索引擎专利技术,于 2000年1月1日在中关村创建了百度公司。 “百度”二字,来自于八百年前南宋词人辛弃疾的一句词:众里寻他千百度。这句话描述了词人对理想的执着追求。 百度拥有数万名研发工程师,这是中国乃至全球最为优秀的技术团队。这支队伍掌握着世界上最为先进的搜索引擎技术,使百度成为中国掌握世界尖端科学核心技术的中国高科技企业,也使中国成为美国、俄罗斯、和韩国之外,全球仅有的4个拥有搜索引擎核心技术的国家之一。

http://home.baidu.com/
推荐文章
暂无评论
暂无评论~