视频理解论文实验笔记2014-2022

本文详细回顾了视频理解领域的进展,从早期的DeepVideo到双流网络,再到3D卷积网络如C3D和I3D,以及Non-local Networks和R(2+1)D。随着Transformer的兴起,TimeSformer和MViT系列展示了自注意力在捕捉时空信息方面的潜力,进一步推动了视频理解技术的发展。
摘要由CSDN通过智能技术生成

视频理解论文实验笔记

看了李沐团队的视频,其中关于视频理解的串讲(上集 下集)讲的太好了,按照他的顺序看了这些论文,并做了重点针对实验部分的笔记

2D Base

cvpr2014 - DeepVideo: Large-scale Video Classification with Convolutional Neural Networks

下载

在这里插入图片描述
他们在Sports-1M(很老)数据集上实验,这个数据集有487个类,没类约1000-3000段视频,每段长约5min, 70%的视频用于训练,10%验证,20%测试,训练用的是从每个视频随机抽100个0.5秒的的clip, 测试时从视频里随机抽取20个clip, 每个clip独立地,经过不同的crop和flip,共4次进入模型,最后将所有clip的结果平均来预测视频的类别
在这里插入图片描述
从上面结果来看,这么做最好的slow fusion只比Single Frame好一点点,他这里的Fovea only是只用高分辨率图像的中间区域,context only是用低分辨率的整图,Multires是用这两个网络最后加两层fc.

把slow fusion模型拿到UCF-101上finetune, 按几种不同的finetune方法,最好只有65.4%,当时最好的手调特征在UCF-101上都有87%,后来的双流也有88%。因此这样从图片中提取时间信息是不行的。这个论文的作用就在于把所有最直接的方式试了一遍,发现都不行。
在这里插入图片描述

Two-Stream

nips2014 - Two-Stream Convolutional Networks for Action Recognition in Videos

下载

双流网络的结构就是两个网络,一个进单帧图,一个进多帧光流图,两个网络结构是一样的,但是不共享权重,最后拿softmax后的得分fusion一下,属于late fusion, 除了最后这一下fusion两个网络间没有交互。他们的想法是当发现只用一个CNN不能很好地提取时序信息时,那就再加一个专门的网络去处理时序信息。
在这里插入图片描述
他们测试时,无论视频长短,从每个视频上均匀地(等间隔)地抽取25帧。他在UCF-101和HMDB-51上实验,这两个数据集的视频长度一般是5-7秒,差不多平均间隔1/3秒取一帧。再对取出来的帧做10-crop(上下左右中5个位置重叠很大地crop, 再左右flip得到10张图),一段视频就有250个crop, 都进入空间流,结果直接平均,得到空间流的结果。对这25帧,取每一帧后11帧算10个光流图,共20个通道进入时间流得到时间流的结果。最后两个结果再fusion。他们离线提取光流,保存为JPEG格式,UCF-101的光流占用空间从1.5TB降到27GB。

他们训练时,视频帧是离线rescale到短边256的。对于空间流和时间流,batch都是256张图,分别是在256个视频(类别均衡地采样)上随机抽取的单帧,然后随机crop224x224,在经过随机水平flip,和rgb jittering. 光流也是随机crop 224x224x2, 也有flip. 他们用opencv里的一个实现去提取光流,在gpu上耗时0.06s。

双流网络分开训练,他们分别在空间流上尝试了预训练的方法,在时间流上尝试了不同堆叠光流的方法。使用imagenet预训练明显好,只训最后一层dropout=0.5,和finetune全部层dropout=0.9效果差不多,在UCF-101都有72%。下面时间流的表格里,L指的是输入几张光流图,10张最好。bi-dir指的是使用测试时使用rgb图前后L帧的光流图,其他是rgb图后L帧的,也是论文里说的uni-directional forward flow,实验显示搞不搞双向其实差不多。optical flow stacking指的是多张光流图直接堆叠,最简单, Trajectory stacking指的是沿着光流的轨迹做堆叠,麻烦也没有比直接堆叠效果好。
在这里插入图片描述
因为时间流没有预训练模型,想用更多数据防止过拟合,他们采用multi-task learning的方法同时使用UCF-101和HMDB-51这两个数据集训练,在卷积网络之后有2个输出,一个给UCF-101分类,一个给HMDB-51分类,有各自的loss函数,只作用在来自相应的数据集的图片上, 总loss是两个分类loss的和。他们还和其他使用多个数据集的方法做了比较, 分别有:1只在HMDB-5上训练,2在UCF-101上预训练在HMDB-51上finetune, 3在HMDB-51上增加UCF-101的类别数据训练,4多任务学习方法同时在HMDB-51和UCF-101上训练。多任务学习效果最好。
在这里插入图片描述
他们也尝试了怎么去fusion双流,空间流固定为预训练+只训最后一层,时间流用单向光流,多任务学习训练,用SVM来fusion比平均好一点点。
在这里插入图片描述
最后是双流网络在UCF-101和HMDB-51上和过去的方法比较正确率,Slow Fusion 65.4%那个就是上一篇的成绩,87.9%那个就是最好的手工特征,双流88%,终于和手工打平了。
在这里插入图片描述

cvpr2015 - Beyond Short Snippets: Deep Networks for Video Classification

下载

这篇是在双流网络的基础上探讨在长视频上做视频分类的问题,不像上边那样对clip做分类,而是考虑如何融合多帧的视觉信息。他输入更多RGB帧,那就需要对多帧的特征做feature pooling, 或者LSTM, 最后再对双流的结果做fusion.
在这里插入图片描述
他们探讨了多种feature pooling的方式,在Sport-1M数据集上实验,结论是各种feature pooling 区别不大,conv pooling最简单也最好。下边C是同一视频不同帧做conv,这些conv是权重共享的。 blue(像紫色)是max-pooling, 绿色是时间维度的卷积,黄色是全连接,橙色是softmax.
在这里插入图片描述

  • Conv Pooling就是每一帧经过conv后,在时间维度上concat一起,再在时间方向max-pooling

  • Late Pooling 是各帧conv后,各自做两次全连接再在时间维度上max-pooling,这些全连接也是权重共享的, 它的想法是组合多帧的高级语义信息,全连接后就是高级语义信息,只是卷积就是局部特征信息。

  • Slow Pooling是以stride=5, 对每10帧的conv结果做max-pooling, 相当于在多帧conv后concat的特征的时间方向上做kernel为1D的size=10,stride=5的max-pooling. 然后对每个pooling的结果做一次全连接,再在时间维度上max-pooling, 再全连接。想法是在组合高级语义特征之前分组组合局部特征。

  • Local Pooling 和Slow Pooling类似,在各帧做完conv后,再在时间方向上做1D的size=10,stride=5的max-pooling,再做两次全连接,最后一起Softmax

  • Time-Domain Convolusion 是在多帧的conv结果沿时间方向concat后做,在时间方向上stride=5, 每10帧做3x3的卷积,在做时间维度上的max-pooling, 再2次全连接。想法是想捕捉小时间窗口内的帧之间的局部关系。

在这里插入图片描述
搞了那么多,最后是最不折腾的conv pooling最好,目的是让你以后别再往这些方向上浪费时间。

他们又尝试用LSTM做时序特征融合,在Sport-1M上做了好多对比实验,结果和conv pooling比LSTM并没有优势, 表2中,conv pooling都比LSTM高几个点,从表3看,conv pooling用120帧比用30帧好一点点。从表4看LSTM加上光流后能比conv pooling+光流好一点点。
在这里插入图片描述
在Sports-1M数据集上,30帧双流+LSTM效果最好,但只比conv pooling双流高不到一个点
在这里插入图片描述
然而在UCF-101上只比双流高一点点。可能是UCF-101的视频都太短了,发挥不出这篇论文的威力,帧与帧之间的高级语义太相似了,没什么变化,LSTM和conv pooling都起不到多少作用。
在这里插入图片描述

cvpr2016 - Convolutional Two-Stream Network Fusion for Video Action Recognition

下载

这篇主要讲双流怎么做fusion,以及各种fusion对应的效果。比如下面他们以VGG为主干,在时间流和空间流的ReLU5之后fusion, 分别尝试了Max, Concat, Bilinear, Sum, Conv funsion, 效果最好的是conv fusion, 就是先concat再加个1x1的conv ( y c o n v = y c a t ⋅ f + b y^{conv}=y^{cat} \cdot f + b yconv=ycatf+b
在这里插入图片描述
他们也尝试了在哪些位置做fusion, 如下边在ReLU5最好,参数不那么多,精度和两倍参数量的FC8差不多,fusion的越晚,双流网络就越长,参数越多,FC参数尤其多。
在这里插入图片描述
在这里插入图片描述

eccv2016 - TSN - Temporal Segment Networks: Towards Good Practices for Deep Action Recognition

下载

这篇的想法非常简单,就是把一个视频分成k段,每段随机取一帧以及该帧后的光流,组成一个snippet, 再把snippet送入双流网络中,同一视频不同snippet的空间流的结果(logits)要consensus(试验了max, average, weighted average。average效果最好), 不同snippet的时间流的结果也要consensus, 最后时间流和空间流consensus的结果还要fusion。
在这里插入图片描述
这篇文章还给出了很多实用训练技巧,比如

  • Cross Modality Pre-training: 就是用imagenet预训练模型来初始化光流网络,他们把光流的值域线性变换到0-255的范围,把imagenet预训练模型的第一层卷积的权重沿着RGB通道的方向按光流输入的通道数平均

  • 正则化技术:1)partical BN: 因为光流的均值和方差和RGB不同,初始化后除第一层外的BN全部冻结,帮助第一层的BN学习如何把光流的值变换到RGB相似的空间里。 2)dropout: 在global pooling 层之后加dropout, 减少过拟合,时间流的ratio=0.8, 空间流的=0.7

  • 数据增强:1)corner cropping: 避免显式地关注图片中心区域,在训练时增加了corner cropping. 2)scale jittering: 固定光流的输入图为256x340,然后随机从{256,224,192,168}中随机选择宽高去crop, 再resize到224x224

下表显式只用时间流,使用cross modality pre-training方法初始化,精度明显提高,从81.7%到86.6%。使用Partial BN+dropout,提升到87.2%, 双流的结果也有相应提升到92%
在这里插入图片描述
他们也尝试了几种主干, 不用TSN, 用带BN的Inception是最好的(和vgg16, googlenet比),他们最终方案是在BN-Inception上使用TSN
在这里插入图片描述
他们尝试了几种snippet的consensus functions, 直接平均效果最好。
在这里插入图片描述

3D Conv

iccv2015 - C3D: Learning spatiotemporal features with 3d convolutional networks

下载

这里用了一个类似vgg的3D卷积网络(输入16帧,112x112)尝试3d卷积在大型视频数据上训练的效果
在这里插入图片描述
上表只用一个网络训练,不搞ensamble, 就是sports-1m 44.9%的水平,就比2d slow fusion的deepvideo好3个点。下表是在UCF101的结果。他们发现用这个模型拿到其他数据集finetune的效果不好,费时费力,所以一般都是用它提取c3d特征(fc6),再用svm训练分类器,单网络最好的结果是82.3%,干不过LSTM,two-stream,也搞不过手工特征(iDT w/Fisher vector)。C3D比较火的原因是它提取的特征用起来比较方便,为后续的3D工作做了铺垫。
在这里插入图片描述

cvpr2016 - I3D: Quo Vadis, Action Recognition? A New Model and the Kinetics Dataset

下载

这篇论文降低了动作视频网络训练的难度,使大家可以用2D的模型结构,和预训练模型(把2D的卷积膨胀到3D, 卷积核在时间维度上平均),用较少的时间finetune到不错的结果,提出了Kinetics数据集(k400),后来大家都在这个数据集上玩了,UCF101和HMDB51就不那么重要了.

下边RGB-I3D是只用RGB(64x224x224)做I3D有95.6,已经好于Two-Stream很多了,Flow-I3D也有96.7,最好的结果RGB和Flow都用I3D, 即Two-Stream I3D, 在Imagenet+Kinetics上预训练,在UCF-101上98%,UCF-101已经被I3D刷到顶了。
在这里插入图片描述
它把之前做视频理解的网络结构归纳为下面几种形式
在这里插入图片描述
并比较了这几种形式,下面的I3D是基于imagenet inceptionv1预训练模型训练的,分别在UCF-101,HMDB-51, K400上训练并在相应的测试集上测试(和上边使用的数据不同)。它还把这几种网络都在kinetics上又训了一遍。右边Kinetics中Two-Stream I3D行, RGB列,应该指的是只用RGB图片训练的I3D. 在K400(Kinetics)上,双流的,单流的,I3D比其他方法好近10个点。
在这里插入图片描述
他用的网络结构是inceptionv1,后续的其他工作者用有resnet的I3D比较多,叫R3D

cvpr2018 - NLN: Non-local Neural Networks

下载

那段时间nlp的自注意力比较火,适合学习长距离的信息,这篇就在视频理解上使用了自注意力, 这篇论文后NLN在视频理解领域中基本替代了LSTM。

他们提出的non-local block和transformer的自注意模块几乎一样,θφg就相当于QKV
在这里插入图片描述
他们搞了C2D网络来做实验,这个网络如下,它输入是32x224x224,相当于用2D卷积一帧一帧地处理输入,以1xkxk的3D卷积核来实现,pooling是3D的,它可以从imagenet预训练模型初始化。
在这里插入图片描述

他们做了大量的消融实验,一步步展现了网络结果是如何设计出来的

  • 表a:在c2d网络中加一个non local模块,比较自注意力的计算方式,结果是点积最好。

  • 表b: 是比较在网络的什么位置插入non local比较好,这里是在R50的C2D网络里的res block块后边插入non local, 在res3后插最好

  • 表c: 比较插入多少non local 块比较好,在R50上表现是加越多越好,这里最多是10个,R101用5block最好

  • 表d:是想比较non local加在哪个维度上好,是不是只在空间维度上算自注意力就足够了,这里展示在时空维度都算自注意力效果最好

  • 表e: 把C2D里的一个residual block的3x3kernel膨胀到3x3x3,或者把一个residual block里的第一个1x1kernel膨胀到3x1x1, 和C2D加5块non local block比较,都比baseline有提升,为表f铺垫。

  • 表f:是在表e的I3D(只膨胀一个block)的基础上,比较加non local的I3D,提升明显,说明non local可以是I3D的补充。

  • 表g:这里用了128帧作为输入,比表f有提升,比C2D, I3D用长输入高,说明non local是对处理长时间的输入有帮助的。
    在这里插入图片描述

他和其他state-of-the-art的比较如下表,I3D的主干加resnet结构有72到73,1%的提升,I3D加non local是76.5%, 提升明显,也比Two-Stream I3D要高,说明提升主要来自non local,不是主干起决定作用。下面的3-stream指的是加了音频。
在这里插入图片描述

cvpr2018 - R(2+1)D: A Closer Look at Spatiotemporal Convolutions for Action Recognition

下载

这篇是个NLN同时期的论文,3D卷积比较昂贵,它探讨如何组合使用2d, 3d卷积来代替全3D卷积,搞一些还能用又不那么昂贵的网络。他们实验了下边这些结构,R2D相当于Resnet版的Late fusion, MCx是先3D再2D, rMCx是先2D再3D, 相当于Slow fusion吧,R3D是Resnet版的I3D, R(2+1)D是把3D拆成空间的2D和时间维度的1D.
在这里插入图片描述

比较结果如下, 都是基于Resnet18网络的结构,从scratch训练,在k400-val上测试,R(2+1)D的参数量和R3D是差不多的,R(2+1)D的结果要高于上述结构。
在这里插入图片描述
(2+1)D是把txdxd的3D卷积,变成Mi个1xdxd的2D卷积,加一个tx1x1的1D卷积,Mi是用来保持总体参数量不变的, 下图右下角有给出计算公式。可以看到在R3D-18和R3D-34上,R(2+1)D的训练和测试误差都呀低不少,说明训练更容易收敛了。
在这里插入图片描述

他和其他state-of-the-art的比较如下,在k400上训练测试,RGB版(有无预训练)都比I3D高,但是加上光流就不如I3D了。two-stream I3D的参数量是25M, R2+1D这里的主干是R2+1D-34(R2+1D-18是33M的参数量), 应该是比two-stream I3D参数量大的,但是R2+1D在空间上输入是112x112,I3D是224x224,I3D的输入图更大,所以不好比较。

在UCF101,HMDB51上finetune也是类似的结果,就是RGB输入下R(2+1)D好,双流输入下,双流I3D好。前面说的2-stream I3D也有只在Kinetics上预训练的,也比这里只在kinetics上训练的R2+1D高。UCF101和HMDB51上的结果也是2-stream I3D比2-stream的R(2+1)D好。
在这里插入图片描述
I3D需要2D的预训练模型防止过拟合,R(2+1)D就不受2D预训练模型网络结构的限制,用起来比I3D方便。

iccv2019 - SlowFast Networks for Video Recognition

下载

这篇借鉴了双流网络的结构,但没有使用光流,而是分为fast和slow2个分支,帧率高的fast分支学习动态信息(动作),帧率低的slow分支学习静态信息(物体,场景)
在这里插入图片描述
slowfast的网络结构如下,slow和fast分支基本都是Resnet版的I3D结构,而快分支的通道数是明显小于慢分支的,最右列也显示了,原始输入是64x224x224, 然后慢分支是每隔16帧取1帧,输入是4帧,快分支是每隔4帧取1帧,输入是32帧。在时间维度上没有做下采样,且在每个residual block后都有一次两个分支的互通
在这里插入图片描述
和其他state-of-the-art的比较如下,下边SlowFast的4x16指的是慢分支的输入为4帧,这4帧是每16帧取1帧取来的,快分支的帧数是慢分支帧数的α倍,默认α=8。他们还报告了每个view的GFLOPs, 一个view表示从测试时从视频中抽取的clip数 x corp数,每个clip在训练时需要取随机的224x224的crop和它的水平翻转,再加一个随机的256x320, 测试时把clip rescale到短边256,并取3个256x256的crop,需要覆盖这张短边rescale到256的图。slowfast在训练时从视频里随机抽取clip, 测试时是在时间维度上均匀地取10个clip(等距取),每个clip有3个crop,所以一共是30个view.

下表中,无论从计算量还是top1上看,slowfast都是当时k400上最好的方法。Non local也能带来1%的提升。
在这里插入图片描述

Transformer

icml2021 - TimeSformer: Is Space-Time Attention All You Need for Video Understanding

下载

这篇的目的是讨论在视频理解领域怎么做自注意力,如下边5种:只在空间做,同时在时空做,时空分开做,局部和全局(稀疏)分开做,沿着轴(TWH)分开做。
在这里插入图片描述
下图可视化了对蓝色块计算注意力时选取哪些色块来计算自注意力, 注意看图中色块的颜色和列标题中STLGWH字母的颜色是对应的。
在这里插入图片描述
他们的实验显示时空分开算自注意力的结果最好,时空同时算自注意力看起来差不多,参数量也少,但是训练时用的gpu显存(不等于参数量)特别多。
在这里插入图片描述

和其他state-of-the-art的比较如下表,给出了参数量和计算量,还很贴心地给出了训练时长,TimeSformer的输入是8帧x224x224, 帧采样率是1/32(每32帧取1帧), 测试时对clip取top-left, center, bottom-right 3个crop推理,再取平均scores。这里用的slowfast是slowfast 8x8 R50, I3D也是类似的8x8。视频理解的state-of-the-art的比较变量实在太多了。虽然TimeSformer的参数量多了很多,在K400的top1上,相比SlowFast也没有多少优势,但是推理时间,训练时间(Tesla V100)要短不少。
在这里插入图片描述
他们又搞了更大的网络, TimeSformer-HR输入是16帧x448x448, TimeSformer-L的输入是96帧x224x224, 帧采样率是1/4, 又在imageNet21k上预训练,k400-top1终于到了80%.
在这里插入图片描述

2021 - MViT: Multiscale Vision Transformers

下载

这篇论文在算自注意时加了个pooling, 大大减少了计算量和显存,降低了用transformer的搞视频理解的门槛。他们搞了一个Multi Head Pooling Attention结构代替ViT中的多头自注意力结构,其中的自注意力模块改为Pooling Attention结构, 在QKV和X之后都加了pooling操作,它看起来就是把Q的序列长度LQ从THW减少到 T ^ H ^ W ^ \hat{T}\hat{H}\hat{W} T^H^W^, 把KV的序列长度LK和LV变成了 T ˉ H ˉ W ˉ \bar{T}\bar{H}\bar{W} TˉHˉWˉ。最终的输出的序列长度是LQ决定的,做POOLQ就可以减少序列长度。
在这里插入图片描述
基础的MViT模型结构如下, Ni表示该stage有多少个transformer block, MHPA(D)表示输入的序列的向量维度为D, MLP(4D)是指隐藏层的序列的向量维度是4D, τ \tau τ表示输入的帧的采样率(每 τ \tau τ帧取1帧)。cube是一个3D卷积操作,输出特征图就是vit里的patch, 只在每个stage的第一个transformer block里的对空间下采样(poolq stride=1,2,2), MviT-S和MviT-B的显存占用都不到7G, 对穷人非常友好。
在这里插入图片描述
他和其他的state-of-the-art比较, 在K400的测试上,它均匀地从视频中抽取5个clip, 每个clip取1个crop(短边rescale到256再中心crop224x224)。由于MviT的计算量比较小,它可以输入更多帧,MViT-B 32x3表示输入32帧,帧采样时的stride为3(即每3帧取1帧,采样率1/3),其top1 80.2比SlowFast 16x8+NL高,FLOPs也更低。显然MViT是好于SlowFast的。他们也在Something-Something-v2和AVA数据上finetune, 也比SlowFast好。
在这里插入图片描述
他们用MviT和ViT比较输入帧随机shuffle对精度的影响,MviT掉的精度比ViT多,说明MviT比ViT更多地学习了时序信息,ViT的损失很小,说明ViT本身没有学习时序信息。
在这里插入图片描述
他们也对输入帧率怎么选取,cube层的卷积核应该多大,stride怎么设置做了消融实验,选出了他们的默认配置, 带下划线部分,输入16帧,stride=4采样帧,cube的kernel取3x7x7, THW方向的stride=2x4x4.
在这里插入图片描述
他们也对每个stage用多少transformer block做了消融实验,保证总块数为16的前提下,把最多的transformer block放在N4(V5=[1,2,11,2]), 精度最高,计算量和显存占用都是最小
在这里插入图片描述
他们还对几种pooling func做了消融实验,结果显示,当stride为s时,k=s+1, kernel有重叠的maxpool比没有重叠的好,重叠太多, k=2s+1则变差; average pool 不如max pool; 而使用kernel为3x3x3,stride=s的3D卷积+LayerNorm 做pooling是效果最好的。
在这里插入图片描述

最后他们给了一张图,横轴是在k400-val上每个视频上推理的flops,纵轴是k100-val top1, 每种算法都记录了从视频中抽取K=1,3,5,7,10段clips来做测试的top1。可以看到MViT在K100-val上测试每个视频的计算量和SlowFast相当,而MViT的top1更高。
在这里插入图片描述

cvpr2022 - MViTv2: Improved Multiscale Vision Transformers for Classification and Detection

下载

MViT中采用和ViT一样的绝对位置编码,这被认为忽略了平移不变性(物体在图片中的位置不同绝对位置编码也不同),v2版采用相对位置编码

MViT中poolingQ的stride是1,2,2, 而PoolingKV的步长是1,8,8, 被认为算完自注意力后Query的信息损失了很多,v2在PoolingQ和自注意力后加了连接,Residual pooling connection。

MViT中的自注意力是在整个patch上做的,为了适应更大的输入(用于图像检测分割), 需要在patch中划分window来分别算自注意力,v2版借鉴了Hwin的方法,在同一stage中,除最后一个transformer block外,注意力都在windown内做,最后一个transformer block在整个patch上做。
在这里插入图片描述
MViTv2在K400上的结果如下,MViTv2的S和B版都比v1版有明显提升,类似计算量下,MViTv2-B 32x3已经比SlowFast 16x8+NL高3%,为82.9。采用更大输入分辨率的MViTv2-L 312x312有86.1.
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值