论文:Temporal Segment Networks: Towards Good Practices for Deep Action Recognition
链接:https://arxiv.org/abs/1608.00859https://arxiv.org/abs/1608.00859
代码解读:
TSN算法的PyTorch代码解读(训练部分)_AI之路的博客-CSDN博客https://blog.csdn.net/u014380165/article/details/79058147TSN算法的PyTorch代码解读(测试部分)_AI之路的博客-CSDN博客_tsn算法https://blog.csdn.net/u014380165/article/details/79058381
摘要
Temporal Segment Networks(TSN) 是一种用于视频中动作识别的框架。TSN通过一种基于分段的采样和聚合模块对长程时间结构进行建模,从而能够使用整个动作视频有效地学习动作模型。通过简单的平均池和多尺度时间窗集成,学习的模型可以很容易地分别适用于修剪和未修剪视频中的动作识别。论文阅读参考了部分知乎和CSDN,仅用于学习。
论文旨在设计有效的卷积网络体系结构用于视频中的动作识别,并在有限的训练样本下进行模型学习,TSN基于two-stream方法构建。
此论文主要贡献有以下两点:
(1)提出temporal segment network(TSN)网络模型:
- TSN采样,具备稀疏性和全局性的特征,能够建模间隔更长帧之间时间依赖关系,确保获取视频级信息;
- TSN包含提取空间信息和提取时间信息两路模型,并基于后期融合方式来融合两路模型的结果。
(2)提出了一系列最佳实践方案,如数据增强、正则化、交叉模态预训练等。并取得了非常好的效果 。
数据集表现:HMDB51(69.4%)、UCF101(94.2%)。
1 TSN for Deep Action Recognition
1.1 Temporal Segment Networks
two-stream 卷积网络网络无法解决学习到长间隔信息,主要因为它仅仅操作一帧(空间网络)或者操作短片段中的单堆帧(时间网络),因此对时间上下文的信息获取仅仅局限于某一方面。视频级框架TSN可以从整段视频中建模动作。
和two-stream一样,作者提出的模型旨在提取整个视频的特征,也是双流模型,一个是图像维度的信息,一个是时间维度的信息。作者将视频均匀分成多个片段,每个片段会输出一个类别得分,然后将所有片段的得分进行融合得到最终的结果,从这些片段的“共识”来得到视频级的预测结果。在学习过程中,通过迭代更新模型参数来优化视频级预测的损失值(loss value),而不是片段级预测的损失值。
TSN网络结构如下图所示:
从上图的左侧我们可以清楚地看到,输入端一段连续的视频被分为 K 段(segment),上图中分为3 段(segment),一个片段(snippet)从它对应的段中随机采样得到。片段由模式表示,例如RGB帧、光流(高灰度图像)和RGB差异(低灰度图像)。不同片段的类别得分采用段共识函数(The segmental consensus function)进行融合来产生段共识(segmental consensus),这是一个视频级的预测。然后对所有模式的预测融合产生最终的预测结果。
注意:以下说明中,“片段”代指文中“snippet”,“段”代指文中“segment”。
具体来说,给定一段视频 ,把它按相等间隔分为 段 。然后,TSN按如下方式对一系列片段进行建模:
其中:
- 代表片段序列,每个片段 从它对应的段 中随机采样得到。
- 函数代表采用作为参数的卷积网络作用于短片段 ,函数返回 相对于所有类别的得分。
- 段共识函数 (The segmental consensus function)结合多个短片段的类别得分输出以获得他们之间关于类别假设的共识。
- 基于这个共识,预测函数 预测整段视频属于每个行为类别的概率(本文 选择了Softmax函数)。
结合标准分类交叉熵损失(cross-entropy loss),关于部分共识的最终损失函数 的形式为:
其中, 是行为总类别数, 是类别 的groundtruth,实验中片段的数量 。本工作中共识函数 采用最简单的形式,即 ,采用用聚合函数 (aggregation function)从所有片段中相同类别的得分中推断出某个类别分数 。聚合函数 采用均匀平均法来表示最终识别精度。
TSN是可微的,或者至少有次梯度,由 函数的选择决定。作者采用标准的反向传播算法,利用多个片段来联合优化模型参数 。在反向传播过程中,模型参数 关于损失值 的梯度为:
其中, 是TSN使用的段数。TSN从整个视频中学习模型参数而不是一个短的片段。与此同时,通过对所有视频固定 ,作者提出了一种稀疏时间采样策略,其中采样片段只包含一小部分帧。与先前使用密集采样帧的方法相比,这种方法大大降低计算开销。
1.2 Learning Temporal Segment Networks
这部分主要讲述在模型学习时的一些最佳实践。
1.2.1 网络结构
一些工作表明更深的结构可以提升物体识别的表现。然而,two-stream网络采用了相对较浅的网络结构(ClarifaiNet)。本文选择BN-Inception (Inception with Batch Normalization) building block,由于它在准确率和效率之间有比较好的平衡,作者将原始的BN-Inception架构适应于two-stream架构,和原始two-stream卷积网络相同,空间流卷积网络操作单一RGB图像,时间流卷积网络将一堆连续的光流场作为输入。
1.2.2 网络输入
TSN通过探索更多的输入模式来提高辨别力。除了像two-stream那样,空间流卷积网络操作单一RGB图像,时间流卷积网络将一堆连续的光流场作为输入,作者提出了两种额外的输入模式:RGB差异(RGB difference)和扭曲的光流场(warped optical flow fields)。
单一RGB图像表征特定时间点的静态信息,从而缺少上下文信息。如上图2所示,两个连续帧的RGB差异表示动作的改变,对应于运动显著区域。故试验将RGB差异堆作为另一个输入模式。
TSN将光流场作为输入,致力于捕获运动信息。在现实拍摄的视频中,通常存在摄像机的运动,这样光流场就不是单纯体现出人类行为。如上图2所示,由于相机的移动,视频背景中存在大量的水平运动。受到iDT(improved dense trajectories)工作的启发,作者提出将扭曲的光流场作为额外的输入。通过估计估计单应性矩阵(homography matrix)和补偿相机运动来提取扭曲光流场。如上图所示,扭曲光流场抑制了背景运动,使得专注于视频中的人物运动。
1.2.3 网络训练
由于行为检测的数据集相对较小,训练时有过拟合的风险,为了缓解这个问题,作者设计了几个训练策略。
(1)跨模态预训练
空间网络以RGB图像作为输入:故采用在ImageNet上预训练的模型做初始化。对于其他输入模式(比如:RGB差异和光流场),它们基本上捕捉视频数据的不同视觉方面,并且它们的分布不同于RGB图像的分布。作者提出了跨模态预训练技术:利用RGB模型初始化时间网络。
首先,通过线性变换将光流场离散到从0到255的区间,这使得光流场的范围和RGB图像相同。然后,修改RGB模型第一个卷积层的权重来处理光流场的输入。具体来说,就是对RGB通道上的权重进行平均,并根据时间网络输入的通道数量复制这个平均值。这一策略对时间网络中降低过拟合非常有效。
(2)正则化
Batch Normalization
用来解决协变量偏移的问题。在学习过程中,BN将估计每批中的激活均值和方差,并使用它们将这些激活值转换为标准高斯分布。该操作会使得模型收敛速度变快,但由于要从有限数量的训练样本中对激活分布的偏移量进行估计,也会导致过拟合问题。因此,为了解决过拟合的问题,作者在用预训练模型初始化后,冻结所有Batch Normalization层的均值和方差参数,第一个标准化层除外。由于光流的分布和RGB图像的分布不同,第一个卷积层的激活值将有不同的分布,于是,我们需要重新估计的均值和方差,称这种策略为部分partialBN。与此同时,在BN-Inception的全局pooling层后添加一个额外的dropout层,来进一步降低过拟合的影响。dropout比例设置:空间流卷积网络设置为0.8,时间流卷积网络设置为0.7。
(3)数据增强
数据增强能产生不同的训练样本并且可以防止严重的过拟合。在传统的two-stream中,采用随机裁剪和水平翻转方法增加训练样本。作者采用两个新方法:角裁剪(corner cropping)和尺度抖动(scale-jittering)。
- 角裁剪(corner cropping):仅从图片的边角或中心提取区域,来避免默认关注图片的中心。
- 尺度抖动(scale jittering):将输入图像或者光流场的大小固定为 ,裁剪区域的宽和高随机从 中选择。最终,这些裁剪区域将会被resize到 用于网络训练。事实上,这种方法不光包括了尺度抖动,还包括了宽高比抖动。
1.2.4 Testing Temporal Segment Networks
由于在TSN中片段级的卷积网络共享模型参数,所以学习到的模型可以进行帧评估。具体来说,作者采用与two-stream相同的测试方案——即从动作视频中采样25个RGB帧或光流堆。同时,从采样得到的帧中裁剪4个边角和1个中心以及它们的水平翻转来评估卷积网络。
空间和时间流网络采用加权平均的方式进行融合。相比于two-strean,TSN中空间流卷积网络和时间流卷积网络的性能差距大大缩小。基于此,设置空间流的权重为1,设置时间流的权重为1.5。当正常和扭曲光流场都使用时,将其权重1.5分出1给正常光流场,0.5给扭曲光流场。
数据集和实现详情
实验是在动作数据集HMDB51和UCF101上进行。UCF101中含有13320个动作剪辑视频,共有101类动作。HMDB51数据集是来自各种来源的大量现实视频的集合,比如:电影和网络视频,数据集包含来自51个动作分类的6,766个视频剪辑。
论文作者采用小批量随机梯度下降算法(mini-batch stochastic gradient descent algorithm)对网络参数进行学习,batch_size = 256,momentum = 0.9。用在ImageNet上预训练的模型对网络权重进行初始化。实验中learning rate设置较小:对于空间网络,初始化为0.01,并且每2,000次迭代降为它的 110110,训练过程共迭代4,500次;对于时间网络,初始化为0.005,并且在第12,000和18,000次迭代之后降为它的 110110,训练过程共迭代20,000次。
作者使用TVL1光流算法来提取正常光流场和扭曲光流场,使用多GPU数据并行策略,在修改过的Caffe和OpenMPI上实现。
UCF101训练总时长(8块TITANX GPUs):
- 空间TSNs:大约2小时
- 时间TSNs:大约12小时
进一步研究
上图是作者对四种不同方案进行实验的结果:
(1)从零开始训练;
(2)仅仅预训练空间流;
(3)采用交叉输入模式预训练;
(4)交叉输入模式预训练和部分BN dropout结合。
不难发现,从零开始训练比Baseline(two-stream卷积网络)的表现差距较大,需要重新设计训练策略来减小过拟合问题带来的影响,尤其是针对空间网络。对空间网络进行预训练、对时间网络进行交叉输入模式预训练,取得了比Baseline更好的效果。之后还在训练过程中采用部分BN dropout结合的方法,将识别准确率提高到了92.0%。
文中提出了新的模式:RGB差异和扭曲的光流场。不同输入对应的具体表现如下:
从上面可以看出,RGB Image + RGB Difference将识别准确率提高到87.3%,均优于二者单独输入时的84.5%和83.8%,这表明两者的结合能够获取更多的信息。光流和扭曲光流的表现差距不大,分别为87.2%和86.9%,而二者融合的效果均优于其单独作用,达到了87.8%。与此同时,四种模式的结合可以提高到91.7%。作者推测光流可以更好地捕捉运动信息,而RGB差异在描述运动时是不稳定的。在另一方面,RGB差异可以当作运动表征的低质量、高速的替代方案。
TSN评估
段共识函数被定义为它的聚合函数 ,这里评估了 的三种形式:
(1)最大池化;
(2)平均池化;
(3)加权平均。
具体实验结果见下图:
平局池化函数取得了最高的准确率,在接下来的实验中选择平均池化作为默认的聚合函数。作者在此之后对不同网络架构的表现做了实验对比,具体结果见下图:
在这些网络架构中,BN-Inception表现最好,故选择它作为TSN的卷积网络架构,同时BN-Inception + TSN的准确率高达93.5%。
针对设置的不同结构,在UCF101数据集上的实验结果如下:
论文接下来的部分是提取过程的可视化分析,此处不做过多赘述。
写在最后
论文的具体代码实现我最近正在照着下面这篇博客实现,windows下运行有很多问题,我同样在Linux下跑的,实现过程中出现了大量的错误,主要有python版本问题(用的最新的3.10,结果要求低于3.9。。。)、mmcv-full、mmaction2包安装问题(这里卡了很久,版本太混乱了,后来用conda的虚拟环境重新一步一步安装各种包,终于好了)、git clone的文件不完整问题、分割依据文件找不到另需下载问题、代码对应import版本问题,如pytorch、代码部分需要修改问题。目前代码已经能够跑起来了,只训练了三类动作,就这样也跑了很久,最后还出来了weight文件加载的错误。搞了很久终于跑起来了,下面一篇博客可以少踩一些坑,但不全。快开学了,后面有时间,一一把这些错误列出来并提供我的解决方法以及附上CPU版本相关代码(别想不开用CPU跑)。TSN实验过程_qq_39862223的博客-CSDN博客_tsn机场https://blog.csdn.net/qq_39862223/article/details/108461526