用图卷积来建模视频

图卷积被多个领域广泛关注,本文介绍下我在ECCV2018年上的一个工作,用图卷积来建模视频:Hierarchical Video Frame Sequence Representation with Deep Convolutional Graph Network,希望能做视频建模的带来些思路。

如何对视频进行建模呢?也就是如何用一个或多个向量表达一个视频呢?

视频指纹算是一种通用的特征,它一般是一种手工设计的特征,采用颜色空间、纹理空间的统计值作为特征,并进行压缩编码,对视频每帧(或关键帧)都进行提取。这种视频指纹主要用于同源匹配,结果可以定位精确到毫秒,是一种不带语义的embedding,泛化性不高。

而带语义的embedding是一种获得泛化性好的特征。首先我们会对帧进行采样,然后过CNN网络提取单帧embedding,接着通过一个序列建模,获得一个全局的语义embedding。基于这个embedding,我们可以进行分类、检索、聚类等任务。

比如可以采用无参的方法,即手工设计一个融合策略,包括均值计算等。也可以用序列表达的常用方法LSTM。目前效果比较好的征聚合方法是NetVLAD。相对域VLAD,VLAD的表达中心不可变,而NetVLAD是可变的,聚类中心随着训练的进行不断的调整,因此可以不在中心。如下图,通过上面这个分支获得每个特征属于当前某中心的概率,然后用这个概率集去对原始特征集进行加权平均。获得kxd的特征向量。

用图卷积来建模视频

 

然而视频是个多级结构的数据,包括事件、场景、镜头、超帧和帧等单元。这些单元之间的关系是复杂的,往往并不是一个简单的顺序关系,比如同一个目标会分布在不同的时间点上。

用图卷积来建模视频

比如这里有个美食综艺节目的例子,包含厨师烹饪,主持人聊天,食物,观众等的镜头和事件。不同颜色的矩形表示不同的镜头或事件。 我们使用一个graph network 来表示帧,如下图,镜头或事件之间的关系,相似的(节点)用边连接在一起。 这个graph逐渐聚合,从帧级到视频级通过卷积和信息传播来抽取特征,分级地表示帧,镜头,事件和视频,并最终获得是的一个紧凑的全局表达,用于后续的分类。

用图卷积来建模视频

视频帧序列是个多级的结构,因此这个图的拓扑应该逐渐被抽象到更高层的拓扑。我们用节点卷积和3种池化的方法来不断聚合这个图。下面这个图展示了具体的网络结构。图中每个方块代表视频的某个层级的单元,比如帧,相似的帧存在潜在的边。首先,通过节点卷积,获得了局部序列特征的一次抽象,比如这里我们将连续的3个节点做一次卷积,且stride是3,获得数量为原来1/3的新节点,如上面这一路;同时,我们采用图池化,在图节点数降为原来1/3时,拓扑结构获得一次抽象,即其大致的拓扑时不变的,如下面这一路。然后,我们在这个新的拓扑上,去传播新的节点特征,从而获得了下一层级的图表达,如此进行下去。刚才提到的图池化是个关键,我们实验了3种图池化的方法,其中基于self-attantion的方法效果较好,并发现第三种方法也能较好地对于镜头。最终的结果,我们的方法是比传统的rnn的方法要好,而且速度非常快。改技术可以用于其它序列表达的问题上。

用图卷积来建模视频

 

用图卷积来建模视频