《Video Action Transformer Network》
这周阅读了《Video Action Transformer Network》这篇文章,发表于2019年度的CVPR,并且做了oral talk,作者是卡内基梅隆和Google的研究人员,代码开源在:http://rohitgirdhar.github.io/ActionTransformer。
模型的目标是针对视频中的某一帧进行动作的检测和分类(此帧中包含多个人物和不同的动作,类似于目标检测),主要的思路是借鉴transformer结构将视频中前后的信息加入最终进行分类和定位的向量。优势在于使模型能够考虑到目标之外的相关物体带来的语义信息,这对于动作的识别是十分重要的。行为识别和定位的难点通常在于推断一个人的行为时不仅需要考虑目标本身的动作,其周围的物体对于推断同样重要。同样在视频中同样的需要考虑时序上的上下文关系,例如对“watch a person”进行识别,当人从帧中消失之后,同样需要进行推理来判断到底看的是人还是其他什么东西。
作者提出了改进的action transformer结构用于视频中的动作定位,其结构如下:其结合了I3D模型和RPN模型,分别提供基础的特征和采样机制。模型的训练和测试均在AVA数据集进行,最终性能在25%的mAP值
我们将一步步的介绍上图中的数据流程:
- Input clip的生成:以keyframe为中心,从原始的视频中前后共抽取64帧作为I3D模型输入,生成一个clip,对其前后大约3秒的信息进行编码
- Trunk部分:此部分是模型的基础部分,用于对clip部分进行编码,生成原始特征(蓝色部分的向量),以及供后续的模型结构使用的Q、K、V向量。首先使用I3D模型(在Kinetics-400上预训练,使用mixed4f层上的输出,特征下采样维度变为原来的1/4,1/16,1/16)提取基础特征,包括图像特征和位置编码;基于此特征,在每一帧的特征上使用RPN网络生成对应的region proposal,只针对key frame生成。(生成多个带有评分的潜在的目标框,选择前300分数最高的框生成最终的bounding box)
- Action transformer network(右下的tx unit):使用RPN网络生成的person box作为q向量(每个proposal对应一个q)和memory特征(person周围的信息),将memory的每一帧映射为一组K和V向量(共64组)。此处就可以将其视为一个300头的self attention。Transformer单元使用一个Q向量分别和前后所有的K向量计算出注意力系数,然后和V向量加权得到一组全局信息,然后和原始的Q向量加和得到包含了全局信息的Q向量(300个q向量重复次运算,当然是同步进行的),后续的FFN和layer norm和原始的transformer相同。整个模型堆叠三层,每层包括两个这样的单元,(同样是为了获得不同的注意力模式下的向量)两个单元的特征使用拼接操作进行连接,得到下一步的Q向量。最终得到最右的蓝色向量。
- Q、K、V向量的生成:类似于原生transformer,此处同样使用线性映射生成K、V向量,Q向量则是将POI pooling之后的向量(center frame person box)先后通过Query preprocessor(先1*1卷积后拼接)和linear layer得到一个(1,1,D)维的向量。此为一种方式,另一种方式是直接进行平均池化,但是会损失所有的空间信息。作者对这两种方式进行了对比:
- Q向量的更新过程的形式化描述:
-
- I3D head对比:做着同样进行了对比试验,使用I3D head代替transformer。这是一种简单的头部,不再抽取上下文信息。其计算过程如下:先对RPN生成的某个proposal进行拉伸得到新的向量;然后从memory中抽取对应的特征表示,每个对应的帧使用不同的ROI pooling抽取,最后将得到的所有向量进行stack得到新的向量输入I3D network得到最终的logits进行定位和分类。
-
最终的实验结果:
-