0. 前言
- 相关资料:
- arxiv
- github
- 论文解读
- 论文基本信息
- 领域:行为识别
- 作者单位:荷兰代尔夫特理工大学
- 发表时间:CVPR 2021
- 一句话总结:使用多帧activations累加结果计算一次梯度,来替代普通求梯度方式。
1. 要解决什么问题
-
现在行为识别的输入数据是一个视频的 coarsely sub-sampled frames,换句话说,就是从视频中提取一小部分作为输入。
- 如果输入帧数太多,需要的显存太大、算力太高。
- 但采样若干帧肯定会导致数据缺失。
-
进一步分析为什么输入帧太多会导致模型无法训练
- 算力方面:如果将视频看作一组图片的集合,那如果只是正向、反向运算,其实算力的限制并不明显。
- 内存方面:行为识别的损失函数都是针对整个视频(而不是单帧图片的)。而计算损失函数、更新参数就需要保存每一帧、每一层的activations和梯度,随着帧数增加,很快显存就不够用了。
-
根据前面的分析可以得出结论:想要输入整段视频作为输入的最主要问题就在于内存/显存不足,而内存/显存不足的原因在于计算梯度需要保留的数据太多。
2. 用了什么方法
- 提出了一种近似计算梯度值的方法
- 使用单一梯度来替代一组图片得到的精度。
- 假设:
- 同一个视频中临近的视频帧是类似的,且拥有几乎相同的activations,所以要对应的梯度值也几乎相同。
- 当使用Relu的时候,由于Relu的特性,activations为整数时,整体模型是线性的。
- 得到结论:普通计算梯度值(累加梯度值),与累加activations再计算梯度值,是等价的。
- 累加activations再计算梯度值,可以令内存消耗大大减少。
- 最终公式如下
- 两个条件:对于相似的输入x,函数h得到的activations是相似的;loss的线性的。
-
上面计算方法的最大前提是:相似的帧得到的activations是几乎相同的
-
视频中,可能相邻帧类似,但距离较远的帧,很可能差别很大。
-
所以就需要进行聚类,哪些帧可以只算一次。
-
文中大篇幅在
Error bound for the approximation
,推导、分析上述方法的误差。 -
最终结论就是
-
Thus, the difference between the two gradient updates is bounded by a function depending on the difference between
the activations and their softmax responses. The closer to 0 the difference between the activations the smaller the difference between their gradient updates.
- 那么,现在要做的就是聚类,即 Temporal clustering and aggregation
- 聚类的原则就是:sign agreement of their activations(猜测就是activations为正的情况类似?)
- 一种直接的方法就是:二值化activations(猜测就是正数为1,其他为0),然后计算 fast Hamming distance
- 聚类方法的整体流程就是:
- 首先确定要聚g类,类似于以前TSM的 num_segments
- 计算 cumulative Hamming distance(就叫C曲线吧,曲线中每个节点就是一个frame),然后根据该曲线分别执行
- cumulative clustering:按照C曲线的最大值,将曲线分为g个部分
- slope clustering:寻找C曲线这斜率最大的(g-1)个部分,将帧分为g个部分
- 下图就是一次聚类结果
- 紫色实现就是C曲线
- 蓝色虚线就是 cumulative clustering 方法
- 绿色实现就是 slope clustering 方法
- 整体方法的结果如下图
- 整个架构基于 TSM-R50,下面的理解都是我自己猜的,没有验证
- 最开始的 n, t, c, h, w 中,n就是输入视频的数量(也就是 batch size),t就是单个视频的帧数量。(换句话说,要求所有输入视频都有固定长度的帧数量)
- jingguo conv1/conv2后,对得到的features进行前面说过的聚类操作,换句话说,就是将t张图片分为g类,每一类求activations的累加和。后面的网络就根据这个聚类以及融合的结果作为输入。
3. 效果如何
- 使用了一些没听过的数据集。
- Move4MNIST 数据集,帧长度固定为32,分4类,train/val 分别是 1800/600 个样本,得到的结果如下
- 效果最好的就是将所有图片作为输入的TVM
- 但我感觉因为一共就32帧。其他的来看,本文提出的方法精度提高明显。
- 但也可以看出,FLOPs还是比较多。以8Frames为例,FLOPs从14.56提高到28.61,精度从90.13提高到94.08。
- Breakfast 数据集,长视频(超过1000帧),本文方法精度提高明显
- 没提FLOPs,肯定提高了不知道多少倍。
- Something-Something 数据集,精度提高有一点,但不多。作者认为是视频长度较短,因此 uniform sampling 基本能提取有效信息的原因
4. 还存在什么问题&可借鉴之处
-
这种方法非常适合视频文件,对于实时数据流感觉还需要研究下聚类的细节。
-
这种方法感觉不适用于3D网络,毕竟3DCNN融合多帧数据的方式明显与2D不同,更复杂。
转载:https://blog.csdn.net/irving512/article/details/117532422
查看评论