🛢️【论文精读】:Two-Stream、I3D
2025-6-14
| 2025-8-24
字数 5349阅读时长 14 分钟
type
status
password
date
slug
summary
category
URL
tags
icon

文章目录

传送门:

一、双流网络

论文:《Two-Stream Convolutional Networks for Action Recognition in Videos》(用于动作识别的双流卷积神经网络)

1.1、前言

1.1.1、为什么要做视频?

  • 视频包含更多信息:比如时序信息、声音&图像等多模态信息,而且是连续信息而非静止的图像。
  • 论文引言提到,视频天生能提供一个很好的数据增强,因为同一个物体在视频中会经历各种形变、光照变换、遮挡等等,非常丰富而又自然,远比生硬的去做数据增强好得多
  • 视频处理是未来突破的方向:目前计算机视觉领域,很多研究热衷于在ImageNet等几个榜单刷分,往往训练了很大的模型,使用很多的策略,也只能提高一点点,类似深度学习出现以前,CV领域中机器学习的现状,已经达到了一个瓶颈期。要想突破必须有新的网络结构,指标之一就是要能很好地处理视频数据。

1.1.2、为什么识别动作

本文是做视频分类的,为啥论文题目是动作识别呢?
  • 包含人类动作的视频更容易收集,直到现在,大部分的视频分类还是做动作识别
  • 动作识别非常实际意义,对VR、视频检索等等很多工作都有帮助

1.1.3、双流网络:视频领域开山之作

在这篇文章出现之前,用深度学习来处理视频主要有两种方式:
  • CNN+LSTM:即CNN抽取关键帧特征,LSTM进行时序建模,具体来说,就是先抽取视频中的关键帧得到张图,然后将这张图输入CNN网络得到图片特征。再将这些特征全部输入LSTM网络,进行各个时间戳上图片特征的融合,得到整个视频的融合特征。最后将LSTM最终时刻的特征接一个FC层得到分类结果。
  • 3D网络:将视频帧(分割好的一个个的视频段,每段含有张图片)直接输入3D 的CNN网络进行时空学习。 此时卷积核必须是3维的(比如每个卷积核都是3×3×3,加入了时间维度),网络不光学习空间信息,还需要学习时序信息(运动信息)。最后3D Conv输出的特征也是接一个全连接层得到分类结果。因为多了一个维度,模型的参数量很大,不太好训练,而且效果也不好。
💡
这两种方式的效果都还不如手工设计的特征。双流网络是第一个能让深度学习网络效果媲美手工设计特征的视频分类结构,从此之后,深度学习在视频领域开始占据主流。
notion image
作者认为,目前CNN网络无法将视频处理的很好,是因为卷积神经网络很擅长处理静态的外观信息( appearance information,比如物体形状大小颜色、场景信息等等),而非运动信息(motion information) 。既然如此,就干脆用另一个网络(光流网络)抽取好运动信息的特征,CNN只需要学习输入的光流和最后的动作信息之间的映射就行(或者说是光流输入到时间流网络的分类之间的映射),这种映射是深度神经网络最擅长的。也就是说CNN本身不需要学习运动信息,也不需要进行时序建模,这些都交给光流做了,所以模型非常的简单。两个网络互不干扰,很好训练也很好优化,最终模型的性能也非常高(见实验部分)。

1.2、网络结构

notion image
💡
空间流和时间流网络结构几乎是一样的,唯一区别就是输入不一样。前者输入的是静止的视频帧,输入channel=3;后者输入是L张光流图的叠加,输入channnel=2×L(前向传播为L;后向传播为L;一般取L=10)。因为时间流网络输入通道是2L,所以没法用一般的CNN预训练模型。

1.2.1、数据流

  • Spatio Stream Convet:空间流卷积网络,输入是单个帧画面(静态图片),主要学习场景信息。因为是处理静态图片,所以可以使用预训练的模型来做,更容易优化。最后根据网络输出的特征得出一个logist(假设模型是在UCF-101数据集上做测试,数据集共101个类,logist是softmax之后的类别概率,那么空间流网络的输出就是一个1×101维的向量)。
  • temporal stream convet:时间流卷积网络(光流网络),输入是光流图像,通过多帧画面的光流位移来获取画面中物体的运动信息,最后也根据网络输出的特征得出一个logist。
    • 光流输入显式地描述了视频帧之间的运动,而不用CNN本身去学动作信息,大大简化了学习过程。加入时间流卷积网络之后,模型精度大大提升。
  • 融合有两种方式:
    • late fusion融合:两个logist加权平均得到最终分类结果(比如两个softmax向量取平均,再做一个argmax操作)。
      • 💡
        late fusion就是指在网络输出层面做融合(这里是logits层面),另外还有early fusion,就是在网络中间层特征上做融合。
    • 将softmax分数作为特征再训练一个SVM分类器。

1.3、光流(Optical flow)

1.3.1、什么是光流

optical flow简单说就是每个物体的运动轨迹,运动越明显的区域亮度越高。比如下图左侧由两张图片组成,背景不变,只有人的运动状态变了;右图背景运动状态不变,所以是黑色的,只有图中的人处于运动中,是亮色的。通过提取光流,可以去掉背景噪声、人物穿着性别等和运动无关的特征都忽略掉,所以最后提取的特征能很好的描述运动信息,也变相的相当于视频里的时序信息的特征表示。
notion image
光流由一些位移矢量场(displacement vector fields)组成的,其中第t帧的位移矢量用dt表示,是通过第t和第t+1帧图像得到的。dt可以拆分成水平部分dtx和竖直部分dty。将dtdtxdty可视化后结果如下:
notion image
  • a、b:前后两帧图片,维度为240×320×3(UCF-101数据集视频帧的大小)
  • c:光流dt的可视化显示,射箭动作是超右上走的,维度是240×320×2。
    • 因为图片上每个点都可能运动,所以每个像素点都有对应的光流值,所以论文中一直称之为密集光流(dense optical flow)。最终光流图和原图大小一致。
    • 每两张图得到一个光流,如果视频一共抽取L帧,那么光流就是L-1帧。这些光流一起输入光流网络
  • d、e分别是水平位移dtx和垂直位移dty

1.3.2、如何利用光流

光流网络主要是为了学习视频中物体的运动信息(时序信息),所以其输入应该是多张光流图的叠加,而非单张光流图(在之前手工设计的特征中,一般是用10帧或者16帧光流图的叠加)。在3.1 章节,讨论了两种叠加方式:直接叠加和根据光流轨迹叠加,示意图如下:(这些光流图都是要输入网络的 ,所以都经过了resize 224×224)
notion image
  • 简单叠加:网络输入是图中每个点多次光流的叠加,比如网络每次都取处的光流。这种方式简单直接,但是应该没有充分利用光流信息。
  • 按轨迹叠加:每一帧都根据光流轨迹,更新光流点的位置,比如网络按照这些位置依次提取光流。这种方式听起来合理很多,充分利用了光流信息。
  • 每次叠加都是先叠加水平位移,再叠加垂直位移,所以是 ,即光流网络输入维度224×224×2L
💡
最终实验结果表明简单叠加的方式更好,作者也没有解释清楚这一点。

1.3.3、双向光流(Bi-directional optical flow)

Bi-directional 的操作,就类似BERT一样,都是一种保险、会涨点的操作。光流前向计算和后向计算都是合理的,物体从位置a到位置b或者反过来都是可行的。

1.3.4、光流的局限性及和对应的预处理(抽取)方式

  1. 光流抽取非常耗时(单张0.06秒)
    1. 计算光流的算法来自《 High accuracy optical flow estimation based on a theory for warping》这篇论文,使用的是其GPU实现,计算一帧光流需要约0.06秒,所以抽取光流是非常耗时的。
      比如对于UCF-101数据集,有约1万视频,每个视频约10秒,每秒30fps(30帧),一共约300万帧。每两帧抽一张光流图,总共耗时约50h。如果是Sports-1M这种更大的数据集(100万视频,视频时长长达几分钟),抽取光流就要成千上万个小时了,这样即使是8卡GPU也要抽取一个多月。
  1. 光流的密集表示导致其存储困难,无法训练
    1. 图片上每个点都有光流值,也就是一个密集的表示。要把这个密集的表示存下来,所耗费的空间会非常大。对于UCF-101这个小的数据集来说,存下所有的光流也需要1.5T的空间,如果是Sports-1M数据集,至少也得是PB级了。即使有这么大的硬盘存储,IO速度也提不起来,还是没法训练。
  1. 光流预处理为JPEG图
    1. 论文在中,作者将光流的密集表示(dense)转为稀疏表示(sparse)以减少光流存储空间,具体来说就是做类似RGB图像的压缩。将光流值全部rescaled到[0,255]的整数,存成JPEG图片。这样每张光流图就十几kb,存储空间大大减小(UCF-101 dataset from 1.5TB to 27GB)。

1.4、实验

1.4.1、网络结构的消融试验

下图是在UCF-101数据集试验了空间流网络预训练效果,和时间流网络的光流堆叠方式:
notion image
  • a:空间流网络:使用预训练模型效果更好
    • From scratch:不使用预训练模型而是从头训练,效果很差。
    • Pre-trained + fine-tuning:整个网络做微调。因为数据集太小,整个网络微调作者担心过拟合,所以试验了dropout ratio=0.9,此时效果最好。后续工作因为训练的数据集更大,所以这种全部网络微调的方式效果更好。
    • Pre-trained + last layer:只微调最后一层,就不用太担心过拟合,所以dropout ratio=0.5最优。
  • b:时间流网络:简单的叠加光流效果更好,双向光流略微提高性能。
    • Single-frame optical flow:网络输入是单张光流图
    • Optical flow stacking、Trajectory stackin:前者表示简单的叠加光流,效果更好;后者表示按轨迹叠加光流。
notion image
上图是单向/双向光流、加权平均/SVM分类、是否多任务的消融试验(时空流网络融合时,双向光流是不利的)。

二、I3D(双流网络的3D实现)

2.1、前言

本文有两大贡献:
  1. 提出了一个新的模型I3D,即Inflated 3D ConvNet
    1. Inflated是扩大膨胀的意思,这里是指把一个2D模型扩张到一个3D模型(比如直接将ResNet的卷积核从二维替换为三维,池化也使用3D池化等等)。这样做有几个优点:
      • 不用再费尽心思的设计一个针对视频理解的网络了,否则从头设计3D网络,还得考虑各种网络结构,方方面面。
      • 可以沿用CV领域的2D网络,比如ResNet、VGG等等,这些模型都是经过多年优化的。
      • 可以使用2D预训练网络进行3D网络的初始化,所以模型可以做的很深,也不需要太多的视频数据进行训练
      💡
      之前的3D网络参数量太大,也没有合适的视频数据集去预训练,所以之前的3D网络都不能太深(比如C3D模型,其网络只有8层),效果也不如双流网络。
  1. 提出了一个新的视频分类数据集Kinetics ,其优点是:
      • 类别均衡、规模合适:Kinetics一开始只有400类所以也叫Kinetics 400,每个类别都超过400个clips(10s左右的视频段落一般叫video clip)。后续又推出了Kinetics 600Kinetics 700;其视频数量分别有30万、50万、60万。
      • 多样性好:每段视频都来自独一无二的YouTube视频。有些视频数据集的视频,都是一个长视频中截取的,比如UCF101
      • 标注精准:每个clips都是视频中精准抽出10s左右的段落,所以整个数据集都标注的非常精准。
      • 难度适中:如果数据集的视频都过于难或者过于简单,就失去其意义了,也没人会用。

2.2、视频处理模型对比

notion image
在本文1.1中已经引用了这张图,介绍了视频理解模型的几种结构,再次做个说明:
  • CNN+LSTM:即CNN抽取关键帧特征,LSTM进行时序建模。具体来说,就是先抽取视频中的关键帧得到K张图,然后将这K张图输入CNN网络得到图片特征。再将这些特征全部输入LSTM网络,进行各个时间戳上图片特征的融合,得到整个视频的融合特征。最后将LSTM最终时刻的特征接一个FC层得到分类结果。
  • 3D Conv:将视频帧(分割好的一个个的视频段,每段含有K张图片)直接输入3D 的CNN网络进行时空学习。 此时卷积核必须是3维的(比如每个卷积核都是3×3×3,加入了时间维度),网络不光学习空间信息,还需要学习时序信息(运动信息)。最后3D Conv输出的特征也是接一个全连接层得到分类结果。因为多了一个维度,模型的参数量很大,不太好训练,而且效果也不好。
  • Two stream(late fusion):双流网络整体还是2D网络结构,但额外引入一个时间流网络。通过巧妙的利用光流来提供的物体运动信息,而不用神经网络自己去隐式地学习运动特征,大大提高了模型的性能。。
  • 3D Fused Two stream(early fusion)双流网络的改进。作者认为双流网络中,两个网络的输出只是进行简单的加权平均来处理,效果还不够。所以将其替换为一个较小的3D网络,进一步融合特征。实验证明这种先进行2D卷积网络训练,再进行3D卷积网络融合的效果更好。
  • Two stream 3D ConvNet:I3D是3D网络和双流网络的结合。因为单纯的使用3D网络,模型效果还是不好,加上光流之后,可以大大提高模型性能。所以可以说I3D=Two stream+3D Conv。另外两个分支网络都已经是3D网络了,也就不需要另外加一个3D网络进行融合,直接加权平均得到最终的结果就行。

2.3、I3D网络结构

2.3.1、Inflated:2D网络扩张为3D网络

notion image
将空间、光流数据输入到3D CNN网络,最后将2个分支的输出进行加权平均。3D CNN网络结构采用nception-V1结构,详细信息如中间图片左右;其中Inception Module模块如右图所示。
扩张方式简单粗暴,其它网络结构都不变,就是把2D的卷积核加一维变为3D(K*K —> K*K*K),2D池化改为3D池化。一直到最新的video swin transformer(2022年),将swin transformer从2D扩张到3D,也是使用这种方式。

2.3.2、Bootstrapping:预训练的2D模型初始化3D网络,及代码实现

验证模型是否正确初始化:使用预训练模型初始化自己的模型时,如果同一张图片,分别输入原模型和初始化后的模型,最终输出的结果都一样,就说明原模型的参数初始化是对的(因为两个模型的结构和输入都是一样的)。
受此启发,作者将一张图复制粘贴次就得到了一个视频,这个视频每个时间步上都是同一张图片(a boring video)。将图 和其复制次得到的视频 分别输入2D网络 和3D网络 ,将后者的网络除以,如果和2D网络的输出一样,则说明3D网络初始化OK。
比如2D网络输出设为 ,3D网络输出为 。然后将3D网络的所有 2D filters权重除以,那么就等于 ,和2D网络输出结果一致。
Bootstrapping初始化具体实现代码如下(来自dmlc/gluon-cv):

2.3.3、I3D网络结构

具体来说,I3D使用的是Inception-V1进行3D扩张,模型结构如下图所示,整体改动还是很小的。
notion image
💡
之所以使用Inception-V1非ResNet,是因为当年(2016年——2017年),很多视频工作的消融表明,使用Inception-V1的效果比ResNet更好。但是ResNet统治力是在是太强了,一年后《Non-local Neural Networks》ResNet实现了I3D模型,并且加入了self-attention。后续大家一般提到I3D,都是指其ResNet实现的版本。
  • Inflated Inception-V1结构,就是卷积核都加了一个维度(K*K —> K*K*K,上图蓝色框)。池化层也加了一个维度,但时间维度不进行下采样。比如池化是3*3—>1*3*3而非3*3*3,对应的stride是2*2—>1*2*2*,而非2*2*2*。不过在后面几个阶段进行了时间维度的下采样(后三个池化层)
  • Inception Module,和之前2D结构一样,只是卷积核变为了3D。

2.3.4、几种模型结结构对比

下图是将之前讲的五种模型都在Kinetics 400 数据集上进行预训练,再进行测试:
notion image
  • ConvNet+LSTM:输入是25帧视频帧。作者每1秒取5帧,25帧就是一共5s(fps=25)。
  • 3D-ConvNet :输入是16帧,fps=25,所以一共0.64s(输入是连续帧)。
  • Two-Stream:任选一帧,然后取剩下的10帧共11帧,计算出10张光流。整个时间跨度是11帧,约0.4s。
  • 测试时,Kinetics 400 数据集每个视频都是10s左右。为了保证公平,使用整个视频来做测试,即测试的视频时长都是10s左右。

2.4、实验

  1. 对比其他视频处理模型,I3D效果最好。 下图也可以看到,不论时间流效果比空间流好还是坏,二者结合之后,模型性能都大幅提升,说明光流对2D、3D视频处理网络都非常有帮助
    1. notion image
  1. 只使用Kinetics 400 数据集进行预训练,而不用ImageNet,效果也很好 黑体是top-1精度,括号内为top-5精度
    1. notion image
  1. 对比各种视频处理模型,I3D效果最好
      • 中间蓝色框是之前的3D网络模型效果,可见都比较差。可以说I3D之前的3D视频处理网络都不流行,被光流网络和传统手工特征碾压。
      • 下面的I3D模型,对比了单独的空间流I3D和单独的时间流网络I3D、完整的I3D;以及这三种模型只在Kinetics 400 数据集上进行预训练的效果。后面三个模型的效果也不差,说明只用视频数据集进行预训练效果就已经很好了。
      • 后续的这种扩展3D模型,可以不再需要使用ImageNet上预训练的模型,直接从头训练就可以了。
      notion image
  1. Kinetics 400 数据集的迁移效果非常好,证明视频领域,使用预训练模型进行微调的方式效果也是非常好的。
    1. notion image
      • Original:只在 UCF-101 o或HMDB-51上进行训练,然后测试
      • Fixed :在Kinetics 400 上预训练模型,测试时其它层冻住,只训练最后的全连接层
      • Full-FT :在Kinetics 400 上预训练模型,测试时整个网络进行微调

2.5、总结

本文从两个方面解决了视频模型的训练问题:
  • 如果没有好的训练数据,可以使用ImageNet上预训练的模型按本文的方式扩张到3D网络,这样不用设计3D网络结构,而且使用了预训练模型的参数进行初始化,效果一般都很好(Inflating+Bootstrapping);
  • 如果你想从头设计一个3D网络,那么可以使用Kinetics 400 数据集进行预训练,是一个不错的选择(不需要依赖于ImageNet预训练的模型参数)。
I3D最大的亮点就是Inflating操作,不仅不用再从头设计一个3D网络,直接使用成熟的2D网络进行扩充就行,而且看还可以使用2D网络的预训练参数,简化了训练过程,使用更少的训练时间达到了更好的训练效果。
I3D的最终结果,也超过了之前的2D CNN或者双流网络(UCF101精度刷到98%)。所以自从I3D 在2017年提出之后,到2020年,3D CNN基本霸占了整个视频理解领域,双流网络瞬间就不香了,直到vision transformer的出现。
【论文精读】Segment Anything(Meta AI)视频理解系列概述
Loading...