论文笔记--ActionVLAD: Learning spatio-temporal aggregation for action classification
介绍
这是去年CVPR2017的一篇动作分类的文章,用tensorflow实现,有预训练模型,代码链接如下:
http://rohitgirdhar.github.io/ActionVLAD
这篇文章在时空上分别独立提取特征,然后做pooling聚合,采用了一种VLAD的pooling方法,端到端的训练,主要解决两个疑惑:
1.如何聚合视频帧之间的特征来表示整个视频。
2.在多流网络中(例如two-stream)里面如何整合不同流(双流)的信息。
动机

一整段视频中虽然是单一的动作分类,但是可能有多个不同的子类特征,例如basketball shoot中有hoop,dribbling,jump,group,throw,ball,running等多个子类特征,所以我们想找方法去整合多个子类特征到一整段视频特征的表示中。
相关工作
特征聚合:VLAD和FV,之前是作为一种方式对提取的图像特征进行后处理编码,常用于图像检索,近年来开始用端到端的训练方法在卷积神经网络中表示图像特征。本文基于此工作扩展到了视频上。
贡献:1.基于two-stream做聚合表示视频特征。2.提出来了多种不同的pooling策略。3.在UCF101和HMDB51上取得了巨大提升。
视频双流结构
为了解决上述motivation中的问题,中聚合层中就有了这样一个参数,action words。它可以理解为子类特征的聚类中心。
可训练的时空聚合层
设x_{i,t} \in R^D,是一个从一段视频中帧t \in \{1...T\} 的位置i \in \{1...N\} 中提取的D-dimension局部特征描述子。划分这个特征描述子空间R^D到K个action words,可以表示为锚点\{c_k\}.,那么每一个描述子x_{i,t}被分配到一个聚类中心,残差向量x_{i,t}-c_k表示描述子和锚点之间的残差,然后把整段视频的残差累加

这里\alpha是一个超参数,j是指D-dimension中的第j个维度。输出V是一个矩阵,表示k个聚类中心的D-dimension特征描述子,经过normalize后展开为v \in R^{KD}描述子即可表示整个视频。

这是整个视频双流结构图,可以看出基于two-stream框架,就是多了一个可训练的ActionVLAD层。

这个则是不同pooling策略建模的对比,可以看出max pooling和average pooling都只能关注到部分子类特征,而ActionVLAD却可以聚合不同子类特征的描述子来共同描述视频特征。
聚合层位置
1.FC层 就如上述描述都D-dimension描述子操作即可。
2.conv层 需要将feature map展开为h \times w \times c维描述子。
双流融合方法

第一种是直接concat策略,第二种和第三种都是average策略,只是融合位置稍显不同。
实现细节
K=64,=1000,dropout=0.5,T=25,梯度裁剪阈值为5,adam里面\epsilon=10^{-4},分两阶段训练:第一阶段,先用kmeans固定ActionVLAD,学习率为0.01;第二阶段,再学习ActionVLAD,学习率为10^{-4}.
效果展示

这个是可视化ActionVLAD模型学到的action words,可以看出(b)中的action word明显就是头发。
个人思考
1.位置如何选取的呢?是随机选取位置resize训练吗?还是selective selction呢?
2.聚类中心action words如何可视化的呢?这个D-dimension的向量怎么能可视化出这个效果呢?
