小言_互联网的博客

行为识别 - No frame left behind: Full Video Action Recognition

321人阅读  评论(0)

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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场