百度视觉技术部联合PaddlePaddle团队近期开源了用于视频分类的StNet框架。StNet框架为ActivityNetKinetics Challenge 2018中夺冠的网络框架。本次开源了基于ResNet50实现的StNet模型。该模型提出“super-image"的概念,在super-image上进行2D卷积,建模视频中局部时空相关性。另外通过temporal modeling block建模视频的全局时空依赖,最后用一个temporalXception block对抽取的特征序列进行长时序建模。该框架在动作识别方面优于一些最先进的方法,可以在识别精度和模型复杂性之间取得令人满意的平衡。
视频当中的动作识别任务已经获得了许多从事计算机视觉与机器学习研究人员的重点关注。越来越多的视频录像设备的普及,让更多好玩有趣的视频丰富了人们的业余生活。但是过多的视频已经远远超过人工能够处理的范围,因此发展针对各种应用场景的自动视频理解算法变得尤为重要,比如:视频推荐、人类行为分析、视频监控等等。
深度学习在静态图像理解上取得了巨大成功,但是针对视频时空建模中最有效的网络架构是什么还尚不清楚,因此我们将新探索的用于视频中局部和全局时空建模的时空网络(StNet)架构与现有的CNN+RNN模型或是基于纯3D卷积的方法进行比对分析,来寻求更有效的网络架构。
由于深度学习在图片识别中的卓越表现,该技术也被应用到了解决视频分类的场景当中。这其中就有两个主要的研究方向,一个是应用CNN+RNN框架结构来对视频序列建模,还有一个是单纯的利用卷积网络结构来识别视频当中的行为。但是在动作识别准确性方面,目前的行动识别方法仍然远远落后于人类表现。现有方法存在如下待改进之处。
局部信息和全局信息对识别视频中的行为都起着非常重要的作用。
例如,在图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 卷积核在每个时序特征中跨所有通道进行卷积。
环境准备: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)
python train.py --model-name=STNET
--config=./configs/stnet.txt
--save-dir=checkpoints
--log-interval=10
--valid-interval=1
bash scripts/train/train_stnet.sh
用户也可下载Paddle Github上已发布模型通过--resume指定权重存放路径进行finetune等开发。
数据预处理说明:模型读取Kinetics-400数据集中的mp4数据,每条数据抽取seg_num段,每段抽取seg_len帧图像,对每帧图像做随机增强后,缩放至target_size。
训练策略:
模型评估:通过以下方式(方法 1)进行模型评估,同样我们也提供了快速启动的脚本(方法 2):
python test.py --model-name=STNET
--config=configs/stnet.txt
--log-interval=1
--weights=$PATH_TO_WEIGHTS
bash scripts/test/test__stnet.sh
模型推断:可通过如下命令进行模型推断:
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