一些关键帧抽取笔记
motivation
- 更准,提取关键性的帧就可以,
- 更小,计算量会小
过一个采样器,告诉我们哪几个帧更好,直接提取出来,然后过一个识别器,就完成了任务
为了效率,采样器是不能太强的那种,效果越好,计算量越强,所以默认是小模型,比如mobile net, shuffle net,但后面的识别器是式计算大的大模型
第一种方式,直接把注意力的权重提取出来,当做每个帧的重要性权重。比如做transformer encoder之后,用fc得到一个权重(最简单),然后对帧加权,最后用来做视频分类,学到帧的权重。
第二种,用每一帧直接做分类,默认视频的分类是直接对所有帧级别的预测结果做一个avg得到的,所以就是可以得到每一帧的一个标签,对帧级别做分类。所以,可以在所有的类别后面,额外加一个类别,用它来区分每个帧是否是重要的帧。推理的时候,对每一帧进行分类,然后挑出来类中概率最大的那个作为帧的权重。基于一个事实:如果一个帧不重要,那么它对所有的类的概率都不高,因为训练的时候,强迫不重要的frame去拟合新增加的类,所以对前面C个类做max的时候,不重要的类就是权重会比较小。这个思想在语义分割,目标检测中都有用。这是两阶段的,用小模型去做训练然后线下采样关键帧,然后再用关键帧来直接做识别。
第三种方法是,端到端的方法。LiteEval,用gating机制(gumbel softmax)连接采样器和识别器。AdaFrame,强化学习方法。
一篇综述,Dynamic Neural Networks: A Survey
关键帧的定义
- 一个是独立于文本的,只是说,能用关键帧代表这个视频的含义
- 另一个是不独立于文本,就是和文本描述更像的。有个任务是Temporal-Sentence-Grounding-in-Videos。就是同一个视频给出不同的描述,能检索出不同的对应视频片段。
如果是从效率来讲,就是采样关键字来代表这个视频的含义
- 两个方式,一个是用一个小模块,来判断它是不是关键帧,比如用mobile net,接一个linear(policy),得到每一个帧的分数,然后选择top5。这里会遇到问题就是,这个policy和后面的训练时断开的,所以要用一个可微分的topk技术。Differentiable Patch Selection for Image Recognition。
- 另一个方式,是用FrameExit,就是先慢慢看帧,然后觉得说我认为看到的n个帧已经足够代表这个视频了,就不再看了。FrameExit: Conditional Early Exiting for Efficient Video Recognition