【视频理解】九、TSN☆


参考资料

论文

  Temporal Segment Network

博客

  视频分类 | 论文 2016 [TSN]

  Temporal Segment Networks: Towards Good Practices for Deep Action Recognition论文笔记


第1章 前言

 视频和图像相比多了一维时序信息。对视频表象(appearance)信息的处理在图像分类领域中已经有比较成功的方法,而对视频运动(motion)信息的处理设法融合表象和运动信息是解决视频理解任务的关键。近期许多研究工作都是在这两个角度进行发力,要对视频运动信息进行处理,就需要捕获视频中的时序依赖关系

 许多复杂的动作会包括很多步,持续很长一段时间,我们需要全盘考虑整体才能进行预测,例如下图喝水的动作就包括多步。因此,我们需要捕获长距离依赖。

在这里插入图片描述

 目前做动作识别的两大主流方法是 3D卷积双流(two-stream)但这两种方案能捕获的仅是视频中的短距离时序依赖

 主要是由于它们对时间上下文的访问有限,因为它们被设计为仅在单个帧(空间网络)或短片段中的单个帧堆栈(时间网络)上操作。然而,复杂的动作,如运动动作,跨越了相对较长时间的多个阶段。

为了捕获长距离时序依赖,这些方法通常需要 密采样视频片段(clip) ,但这需要庞大的计算开销,并且当时序依赖长度长于视频片段帧数(通常为64到120帧)时,捕获长距离时序依赖的能力仍然有限。

【密采样视频片段(clip)】:时序动作定位里,将视频分帧后,采用多尺度滑动窗口,比如滑动窗口为64,也就是每64帧图片为一个视频clip,视频分为若干个clip 。


 作者通过较少的训练样本,高效的训练出用于动作识别的ConvNet,主要贡献有两点:

  1. 提出Temporal Segment Network(TSN)网络模型:
  • 时间段网络不是处理单个帧或帧堆栈,而是处理从整个视频中稀疏采样的一系列短片段,具备稀疏性和全局性的特征,能够建模间隔更长帧之间时间依赖关系,可以利用整个视频的视觉信息来执行视频级预测;
  • TSN包含提取空间信息和提取时间信息两路模型,并基于后期融合方式来融合两路模型的结果;
  1. 提出了一系列最佳实践方案,如数据增强、正则化、交叉模态预训练等,并取得了非常好的效果;

 作者认为,在训练视频分类模型时,连续的帧会造成冗余,所以密集采样的策略是没必要的,所以作者采用了稀疏采样的策略。


第2章 主要方法

2.1 网络结构

 由于相邻的帧有信息冗余,TSN采用稀疏采样的策略利用整个视频的信息。具体来说,TSN把视频分成3段,每个片段均匀地随机采样一个视频片段,每个片段会输出一个类别得分,然后将所有片段的得分进行融合得到最终的结果。

在这里插入图片描述

作者在论文中指出,针对视频 V V V ,采取以下稀疏采样策略:

  • s e g m e n t s segments segments—— 视频片段,一个视频会被分成 K K K 个片段 { S 1 , S 2 , . . . S k } \{S_1,S_2,...S_k\} {S1,S2,...Sk} ,论文中 K K K 取值为 3 3 3
  • s n i p p e t snippet snippet —— 片段帧,针对每个片段,会随机采样 1 1 1 s n i p p e t snippet snippet ,得到 { T 1 , T 2 , . . . T k } \{T_1,T_2,...T_k\} {T1,T2,...Tk}
  • 每个 s n i p p e t snippet snippet 1 1 1 R G B RGB RGB 图像+ 5 5 5 帧光流图像(水平+垂直的话就是10张光流图)组成;

 参考:https://github.com/yjxiong/temporal-segment-networks/issues/46


 TSN网络可以用以下式子表示:

在这里插入图片描述

  • F ( T K ; W ) F(T_K;W) F(TK;W)——参数为 W W WConvNet,作用在 T k T_k Tk 上,输出类别得分;

  • g g g ——表示聚合函数,融合各个片段的 F ( T K ; W ) F(T_K;W) F(TK;W) 输出,论文用的平均值;

  • H H H——将分数转化为概率,softmax函数;


 结合标准的分类交叉熵损失,最终损失函数 G G G 如下所示:

在这里插入图片描述

  • C C C 是动作的类别数量;
  • y i y_i yi 是基于动作类别 i i i 的真实标签 Ground Truth;

 梯度更新的表达式:

在这里插入图片描述

 上式可以通过SGD算法来优化。聚合函数 g g g 的选择包括:最大值、平均值、加权平均值,论文用的平均值。这样做的话,可以通过整个视频的信息来更新模型参数,而不是只在很短的片段上更新。

TSN的巧妙之处 训练时,TSN可以根据整个视频的信息而不只是一个视频片段的信息对网络参数进行学习,这是TSN最大的优点(个人认为)。测试时,和主流做法密采样视频片段相比,TSN只需要采样一小部分视频片段即可进行预测,十分高效。实际上,TSN仍采用主流方法的策略进行测试。


2.2 模型学习技巧

2.2.1 模型架构

 之前的two-stream模型采用的是相对浅的模型结构,作者选择BN-Inception这种比较深的模型结构来当做building block,因为该模型在速度和准确率上都不错。


2.2.2 模型输入

 之前two-stream模型采用RGB作为spatial stream的输入,采用光流作为temporal stream的输入。作者研究了额外的两种模态,RGB differencewarped光流

  • 由于受相机本身运动的影响,作者提出采用 warped(扭曲)光流作为补偿,抑制背景的运动,使得光流集中在运动的物体上
  • 单个RGB图像只是静态信息,缺少了关于前一帧和下一帧的上下文信息,而两个连续帧之间的RGB差异描述了外观变化,这可能对应于运动显著区域,所以作者提出用 RGB difference

在这里插入图片描述


2.2.3 模型训练

 由于视频样本较少,训练较深的ConvNet可能会过拟合。为了解决该问题,作者提出了如下的策略:

  • 跨模态预训练:RGB网络可以使用ImageNet预训练,但是光流网络没有预训练的数据集,所有作者采用ImageNet上预训练的参数来初始化光流模型参数。
  • 正则化Batch Normalization用来解决协变量偏移的问题。在学习过程中,BN将估计每批中的激活均值和方差,并使用它们将这些激活值转换为标准高斯分布。该操作会使得模型收敛速度变快,但是同时会带来了过拟合的问题。因为,作者通过固定住除了第一层以外,其他层的BN参数,来解决该问题。而且,作者在BN-Inception模型后面加入了dropout层,来解决过拟合的问题。
  • 数据增强:random cropping、horizontal flipping、corner cropping、scale jittering。

第3章 实验

 该部分主要介绍TSN模型在数据集上的一些实验结果,并比较了不同TSN训练策略所带来的效果。

3.1 数据集和实验细节

  • 作者主要在HMDB51UCF101两个较大的数据集上做实验

  • 使用mini-batch SGD优化算法,batch size设置为256,momentum设置为0.9

  • 使用ImageNet预训练的参数

  • 学习率:

    • 空间网络,初始学习率为0.001,每2000次迭代下降1/10
    • 时间网络,初始学习率为0.005,在12000次迭代和18000次迭代,分别下降1/10
  • 总的迭代次数:20000

  • 数据增强:location jittering, horizontal flipping, corner cropping, and scale jittering

  • 使用CUDA版OpenCV TVL1光流算法抽取光流特征

  • 训练设备:4 TITANX GPUs,数据并行


3.2 实验结果

(1)跨模态预训练和partial BN with dropout实验:

在这里插入图片描述

 其中Baseline是2014年Two-Stream的实验结果。可以看到,作者提出的跨模态预训练对于时间网络提升非常大,Partial BN with dropout也有一定的提升。


(2)新模态特征:RGB Difference和warped optical flow fields实验

在这里插入图片描述

  • RGB Difference和RGB特征有一定的互补性
  • 结合RGB和光流特征,能取得非常好的效果

3.3 评估TSN模型结构

(1)视频片段间的聚合函数实验(K=3)

在这里插入图片描述


(2)Backbone效果以及稀疏采样的作用

在这里插入图片描述


(3)对比SOTA模型

在这里插入图片描述


3.4 模型可视化

DeepDraw 是一种基于梯度上升优化的可视化方法。

在这里插入图片描述


第4章 Pytorch实现TSN

参考代码

  yjxiong/tsn-pytorch

博客

  tsn-pytorch代码解读

  TSN算法的PyTorch代码解读(训练部分)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

travellerss

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值