从标题上就可以看出这篇文章的核心:通过Temporal Shift Module对时间信息进行高效建模,从而实现高效的视频理解。先看看效果:
背景
整个网络的视频数据量剧增,这就要求视频理解算法能够以较低的代价对视频进行高准确率的理解。
2D CNN计算量低,但是不能对时间信息进行建模,因此准确率比较低;3D CNN可以对时间信息进行建模,因而可以获得比较好的准确率,但是计算量太高。
这篇文章中提出的TSM模型,使用了一个很巧妙的trick,使得TSM既能获得3D CNN的高准确率,同时维持2D CNN的低计算量。
2D CNN的缺陷
2D CNN可以很好的对空间信息进行建模,但是没有任何时间建模能力。
![](https://img.haomeiwen.com/i23105790/553f03c1b7283a98.png)
在视频理解模型中,某一层中一个典型的tensor可以表示为,其中N为batch size,T为时间维度,即有多少帧,C是通道数,H和W是空间维度。
看上图,这是4个视频帧经过2D CNN处理之后,某一个层中tensor的可视化展示。
其中每一行同一颜色的块就是一个视频帧在该层中的所有特征,比如第一行黄色的图块就是第一帧在该层中的特征,第二行蓝色的图块就是第二帧在该层中的特征,以此类推,是第三帧的特征、第四帧特征等等。作者为了后续说明TSM的原理将每一帧的所有通道分成了6份。
如上图所示,传统的2D CNN对每一帧进行单独的处理,不同帧之间没有任何的交互,没有对时间信息的建模。因此简单的将2D CNN用于视频理解的准确率不是很高。
TSM的优化
那么TSM是通过什么技术在使用2D CNN的基础上,实现了对时间信息的建模呢?
离线处理场景
简单来说就是,利用2D CNN生成所有帧在某一层的特征之后,在时间维度上移动其中一部分的特征通道,然后再进行下一层的卷积计算,并重复以上操作。
通过这种移动让不同帧混合了其他帧的特征,于是完成了对时间信息的建模,同时又不会产生想3D CNN那么大量的计算。
![](https://img.haomeiwen.com/i23105790/117be7f73385f0d4.png)
上图就是TSM优化思路的可视化展示,从上到下分别代表采样出来的第1、2、3、4帧。
- 首先,将所有帧一部分通道特征即图中的第1列,沿着时间轴向前移一帧,于是从第2帧开始的每一帧的特征中就融合了前面一帧的特征。于是第4帧融合了第3帧的部分特征,第3帧融合了第2帧的部分特征,第2帧融合了第1帧的部分特征。
- 其次,将所有帧一部分通道特征即图中的第2列,沿着时间轴向后移一帧,于是从倒数第2帧开始的每一帧的特征中就融合了后面一帧的特征。于是第1帧融合了第2帧的部分特征,第2帧融合了第3帧的部分特征,第3帧融合了第4帧的部分特征。
- 结果就是每一帧的特征都融合了临近帧的特征。
- 每使用一次上述的平移,即每增加一个TSM模块,那么TSM的时间视野就增加一倍。
经过一次TSM之后,上图中第1帧的特征就融合了第2帧的特征,而第2帧则融合了第1帧和第3帧的特征, 第3帧则融合了第2帧和第4帧的特征,第4帧则融合了第3帧的特征,以此类推;
再经过一次TSM之后,其中第1帧的特征再次融合了第2帧的特征,这里的第2帧的特征因为在上一个TSM中已经融合了第1帧和第3帧的特征,因此第1帧的特征就间接的融合到了第3帧的特征。与之类似的,经过第二次STM之后,第2帧的特征则会间接融合到第4帧的特征。经过多次TSM之后,2D CNN就能看到越来越多其他帧的特征,从而实现对时间信息进行建模。
看代码可以理解的更容易。
# naive shit
out = torch.zeros_like(x)
out[:, 1:, :fold] = x[:, :-1, :fold] # shift left
out[:, :-1, fold: 2 * fold] = x[:, 1:, fold: 2 * fold] # shift right
out[:, :, 2 * fold:] = x[:, :, 2 * fold:] # not shift
上述代码第一行,创建一个和x一样大小的tensor;
第二行将一部分通道沿着时间维度向后移动,对应上图的第1列。
第三行将一部分通道雁阵时间维度向前移动,对应上图中的第2列。
第三行将剩余部分赋值给out。
在线处理场景
![](https://img.haomeiwen.com/i23105790/5bbce0fadf19d84e.png)
对于实时在线视频处理,在处理当前帧的时候,不可能获取到后一帧的特征,因此在这类场景下,就只有单向移动,即将之前帧的特征保留下来,替换掉当前帧的部分特征,使得当当前帧获得了之前帧的时间信息。
TSM的优点
在完成时间信息建模的同时,几乎没有增加额外的计算量。也就是保持了2D CNN的计算量的同时,获得了3D CNN的时间建模能力 。
需要注意的点
问题1
对多少特征通道进行平移?
如果移动的太多,虽然不会增加计算量,也不会增加特征数量,但是会涉及到数据在内存中的移动,而数据移动会导致一定的时间延迟,毫无疑问移动的越多,导致的延迟会越长,使得处理效率下降
解决方案
既然移动太多,会降低处理效率,那么就减少移动的通道数,作者对移动不同比例的层进行了实验,实验结果如下图。作者分别在P100(NVIDIA Tesla P100)、TX2(NVIDIA Jetson TX2)和CPU上进行了测试。
可以看到随着所要移动通道数的增加,需要移动的数据量也越来越多,导致的延迟也越来越大。所以作者的解决方案就是只移动其中一部分通道,来获得时间建模能力的同时,不会导致过多的时间延迟。
![](https://img.haomeiwen.com/i23105790/c2652703434da5ec.png)
问题2
TSM模块放在哪个位置?
一种最直接的处理方式,是把TSM模块放到每个卷积层之前,作者称这种方式为in-place shift,如下图所示。
![](https://img.haomeiwen.com/i23105790/6d59109eac5a5bc1.png)
但是这种处理方式会损害模型的空间建模能力。因为移动了部分特征,所以这部分特征在原有的帧中就丢失了,导致性能降低。
解决方案
使用残差网络作为backbone,将TSM模块加在残差模块的残差分支中,作者称这种方式为residual shift,如下图所示。
![](https://img.haomeiwen.com/i23105790/3fbb813aeba7dea9.png)
将TSM放在残差分支中,使得模型可以对时间信息进行建模,同时由于skip链接的存在保持了原有的空间特征,不会降低对空间信息的建模能力。
下图是作者对in-place shift和residual shift进行的实验。
![](https://img.haomeiwen.com/i23105790/b2b6e03a647e4eb0.png)
从图中可以看出,无论是移动的通道比例如何变化,residual shift的准确率都高于in-place shift,这与之前的理论分析一致。
而在移动比例为时,准确率最高,因此在所有实验中均采用这一比例作为默认值。
实验效果
与TSN对比
TSN是2D CNN视频理解模型的典型代表。作者在TSN的基础上增加了TSM模块,以验证TSM的时间建模能力。实验结果如下,可以看到在给出的6个数据集上,TSM明显优于TSN。
在时间信息不明显的三个数据集上,TSM的准确率提升3.5到8.8个百分点。
在时间信息明显的三个数据集上,TSM的准确率提升11.7到31.3个百分点。
![](https://img.haomeiwen.com/i23105790/0bfcbbeaaac2c290.png)
TSM的通用性
作者在MobileNet-V2, ResNet-50, ResNext-101,ResNet-50+Non-local这四个不同模型上,测试了TSM在Kinetics这个数据集上的准确性,实验显示准确率均比TSN要高,说明TSM可的适应性很好,可以实现很好的时间建模。实验结果如下:
![](https://img.haomeiwen.com/i23105790/f5a929ef70bc9f20.png)
与SOTA对比
TSM不但提升了2D卷积模型的准确率,而且比那些采用3D卷积的模型也要好。
作者在Something-Something-V1上进行了对比实验。因为这个数据集包含很丰富的时间信息,基本上不能通过单帧来判断一个视频的类别,比如把一个盒子从右侧推到左侧。所以很适合来对比不同模型的时间建模能力。
![](https://img.haomeiwen.com/i23105790/870d1498db0d5b32.png)
看上图,其中第一部分的是TSN和TRN,其中TSN没用时间建模能力,因此准确率很差在20%以下。TRN在高层语义上进行了时间信息融合,但是TRN的准确率远低于SPTA的方法,说明在不同level上进行时间信息建模的重要性。
第二个部分是SOTA的算法ECO,这个算法使用了early 2D + late 3D的架构,因此可以实现medium-level的时间特征融合,这个算法就是目前最优模型。但是相比之下,TSM可以在更低的FLOPs上实现更高的Acc,比如在使用8帧作为输入的时候,TSM的top acc为45.6%,FLOPS为33G,比ECO的41.4%高出4.2个百分点,而FLOPs比ECO的64G则要低1.9倍。
第三部分是Non-local I3D,相比之下,TSM以10倍以上更少的FLOPs将acc提高了1.2%。
结论
如果你在做视频理解的时候,想要对时间进行建模,同时又需要高效率,那么TSM是一个很好的选择。
作者也开源了代码,使用的是pytorch,可以直接上手使用。
https://github.com/mit-han-lab/temporal-shift-module
我是陈雷,目前在新华智云从事计算机视觉算法开发。
我们公司是新华社和阿里合资成立的一家致力于媒体智能的公司。目前已经成立3年,公司正处于快速发展阶段,对于CV&NLP算法工程师、产品、前端、后端、测试、数据分析师等都有大量的需求,工作地点为杭州或北京。
具体岗位可以查看这个页面:https://www.xinhuazhiyun.com/hire.html?spm=xinhuazhiyun.home.0.1.qdrBKO
有意向的同学可以联系我帮忙内推(P5-P8),内推简历会在3个工作日内回复。
网友评论