TSN(Temporal Segment Networks)算法笔记

论文:Temporal Segment Networks: Towards Good Practices for Deep Action Recognition
论文链接:https://arxiv.org/abs/1608.00859
代码链接一:https://github.com/yjxiong/temporal-segment-networks
代码链接二:https://github.com/yjxiong/tsn-pytorch

这篇ECCV2016的文章主要提出TSN(temporal segment network)结构用来做视频的动作识别。TSN可以看做是双流(two stream)系列的改进(关于双流网络可以参看论文链接:https://arxiv.org/abs/1406.2199或者博客链接),在此基础上,文章要解决两个问题:1、是长时间视频的行为判断问题(有些视频的动作时间较长)。2、是解决数据少的问题,数据量少会使得一些深层的网络难以应用到视频数据中,因为过拟合会比较严重。

针对第一个问题,首先,为什么目前的双流结构网络难以学习到视频的长时间信息?因为其针对的主要是单帧图像或者短时间内的一堆帧图像数据,但这对于时间跨度较长的视频动作检测而言是不够的。因此采用更加密集的图像帧采样方式来获取视频的长时间信息是比较常用的方法,但是这样做会增加不少时间成本,同时作者发现视频的连续帧之间存在冗余,因此想到用稀疏采样代替密集采样,也就是说在对视频做抽帧的时候采取较为稀疏的抽帧方式,这样可以去除一些冗余信息,同时降低了计算量。

针对第二个问题,可通过常规的数据增强方式,比如随机裁剪,水平翻转等;另外还有作者提到的交叉预训练,dropout等方式来减少过拟合。这些后面会详细解释。

Figure2是作者用到的输入数据形式。我们知道对于图像而言,特征可能就只有图像本身,但是视频的特征就比较丰富,除了帧以外,还有光流(optical flow)等,如Figure2所示。注意,这也是作者解决数据量少的一种方法,那就是从有限的数据中提取更多有用的特征。从最左边开始说起,RGB image就是video中的某一帧图像;RGB difference是相邻两帧图像的差,可以用来表达动作信息;optical flow field和warped optical flow field是视频的光流信息。RGB image和光流正是双流网络论文中的spatial stream convnet和temporal stream convnet两条支路的输入。因此这里作者相当于想额外研究RGB difference和warped optical flow对动作检测效果的影响。
TSN(Temporal Segment Networks)算法笔记_第1张图片

Figure1就是作者提出的TSN网络。网络部分是由双路CNN组成的,分别是spatial stream ConvNets和temporal stream ConvNets,这和双流网络文章中介绍的结构类似,在文中这两个网络用的都是BN-Inception(双流论文中采用的是较浅的网络:ClarifaiNet)。那么这两路CNN以什么为输入呢?spatial stream ConvNets以单帧图像作为输入,temporal stream ConvNets以一系列光流图像作为输入,换句话说两个网络的输入类型是不一样的。
当然最重要的是temporal segment network(包含多个spatial stream convnet和temporal convnet,参看Figure1)的输入不是单帧图像或短时间内的一堆图像帧,而是从视频中稀疏采用得到的一系列snippets,这就是为了获取视频的长时间信息所做的改进。

Figure1的最左边是一个Video,用V表示,将V分成K份(文中K采用3),用(S1,S2,…,Sk)表示。这样TSN网络就可以用下面这个式子表示:
这里写图片描述
这里的(T1,T2,…,Tk)表示K个snippets,snippets翻译过来也是小片段,也就是说Tk是从(S1,S2,…,Sk)中对应的视频片段Sk中随机采样出来的结果,Tk是一个snippet,每个snippet包含一帧图像和两个光流特征图。这也就完成了作者说的稀疏采样。上面式子中的W就是网络的参数,因此F(Tk;W)就是网络的输出,也就是该snippet属于每个类的得分。F函数的输出结果就是Figure1中spatial convnet或temporal convnet的输出结果,可以看Figure1中convnet图后面的绿色条形图,代表的就是socre在类别上的分布。g是一个融合函数,在文中采用的是均值函数,就是对所有snippet的属于同一类别的得分做个均值,毕竟我们最后要求的是这个video属于哪个类别,而不是这个video的某个snippet属于哪个类别。g函数的输出结果就是Figure1中segmental consesus的输出结果。最后用H函数(文中用的softmax函数)根据得分算概率,概率最高的类别就是该video所属的类别。注意,在输入softmax之前会将两条网络的结果进行合并,默认采用加权求均值的方式进行合并,文中用的权重比例是spatial:temporal=1:1.5。另外需要强调的是:Figure1中的K个spatial convnet的参数是共享的,K个temporal convnet的参数也是共享的,实际用代码实现时只是不同的输入过同一个网络。
TSN(Temporal Segment Networks)算法笔记_第2张图片

网络的损失函数如下(standard categorical cross-entropy),C表示类别数,yi是标签。
TSN(Temporal Segment Networks)算法笔记_第3张图片
其中G表示:
这里写图片描述
也就是说G是一个长度为C的向量,表示一个video属于每个类别的得分

前面提到过为了防止过拟合,作者采取了多个措施,其中一个就是交叉预训练,预训练我们都很熟悉,以图像为输入的spatial ConvNets网络可以用在imagenet数据集上预训练的网络来初始化。而以光流作为输入的temporal stream ConvNets网络该怎么初始化呢?答案就是交叉预训练,交叉预训练其实是将图像领域的预训练模型迁移到光流领域。 另外一个是partial BN,冻结了除第一个BN层以外的所有BN层的均值和方差。

实验结果:
Table1是关于不同训练策略下双流网络的效果对比。可以看出交叉预训练(主要提升了temporal convnets的效果)和partial BN with dropout是有效的。
TSN(Temporal Segment Networks)算法笔记_第4张图片
Table2是关于网络的几种不同输入形式下two stream convnets的效果对比,数据集是UCF101。可以看到一般而言融合多种类型的输入可以达到更好的效果,尤其要利用光流信息。
TSN(Temporal Segment Networks)算法笔记_第5张图片

Table3是关于前面TSN公式中的不同g函数对实验结果的影响。最后文章采用的是average的融合方式。
TSN(Temporal Segment Networks)算法笔记_第6张图片

Table5是总结本文的一些基于双流网络的改进效果。
TSN(Temporal Segment Networks)算法笔记_第7张图片

Table6是和其他视频行为识别算法在HMDB51和UCF101数据集上的对比,效果还是比较明显的。
TSN(Temporal Segment Networks)算法笔记_第8张图片

最后的Figure3是作者对网络的可视化,个人感觉做的很不错。将两条网络,以及是否预训练的差异表达出来了。预训练后的网络显然可以提取到有效的特征信息。
TSN(Temporal Segment Networks)算法笔记_第9张图片

你可能感兴趣的:(深度学习,计算机视觉,视频分类/理解/分析)