利用光流提升视频识别的速度和精度

daijifeng老师的两篇文章,利用光流提升视频识别的速度Deep Feature Flow for Video Recognition,利用光流提高视频的精度Flow-Guided Feature Aggregation for Video Object Detection,关于光流可参考我之前的博客光流介绍以及FlowNet学习笔记

Deep Feature Flow for Video Recognition

Motivation

传统的视频识别一般以下做法
1. 一帧一帧做: 太慢了,相邻帧其实很接近重复地提特征浪费时间
2. 复用上一帧在网络中某些计算量较大层的中间特征,然后把这些特征送到后面计算量较少的部分重新算得到最终的特征,快了一些但是精度损失严重,这有一篇先驱的文章Clockwork Convnets for Video Semantic Segmentation
相邻帧之间每个位置的像素值虽然发生很多变化,但是整体语义基本无变化。如下图是Reset101最后一个卷积产生的feature map,当前帧的feature可以通过光流将关键帧的feature warp过来得到,而不用重复计算,而且warp过来的特征和由网络重复计算的相差无几

利用光流提升视频识别的速度和精度

Framework

利用光流提升视频识别的速度和精度

一般深度学习的网络结构都可分为,特征提取网络和特定任务网络两个部分。
算法大体流程:
1. 判断当前帧是否为关键帧,如果是使用特征提取网络提取特征
2. 如果不是,利用光流对它前面提取好的关键帧特征进行warp得到当前帧的特征
3. 特征送到后面的具体任务网络
利用光流warp的过程:
i为当前帧,k为i前面的关键帧
1. 利用FlowNet或其他方法计算i->k的光流F: 当前帧上任一点p(x和y两个坐标值),对应与关键帧上的位置p+Δp,Δp即是光流F,两个channel代表x和y的偏移,尺寸和i一致
2. 现在想要计算当前帧i的feature,这个feature上每个位置p的值,都对应于关键帧feature上p+Δp的值,然后我们需要计算关键帧上p+Δp的值,这个p+Δp可能是浮点数,需要用双线性插值计算(之前roialign时已经介绍过了,通过p+Δp周围的4个整数点像素值插值)
即: 当前帧上每个点p都可通过以下公式获取 双线性插值公式具体介绍
利用光流提升视频识别的速度和精度

Experiment

具体实验我就不多介绍了,SFF是不训练的光流效果不是很好,fix N是固定特征层,fix F是固定光流层,DFF separate分开训练特征和光流,DFF是end2end训练 光流采用FlowNet simple
利用光流提升视频识别的速度和精度
还有一些细节
1. 对FlowNet simple再进行简化,减少channel等
2. 关键帧的选取,本文是固定长度挑选,可以选择更好的关键帧提取技术,对于光流和后面的warp都有利,关键帧提取的好光流网络可以再次简化

Flow-Guided Feature Aggregation for Video Object Detection

Motivation

视频中物体检测存在以下问题,我们需要利用视频的时序上下文信息来解决他们
利用光流提升视频识别的速度和精度

Framework

利用光流将前后帧的feature warp过来进行特征增强
如图: 当前帧猫已经模糊了,未检测到。但是前10帧和后10帧检测到了,这样特征warp过来增强后最终检测到了猫。

利用光流提升视频识别的速度和精度

特征融合策略

对于warp过来的特征可以进行简单的相加,但是由于光流可能预测不好,warp过来的特征不好反而影响了当前帧的检测。
本文采用了一个自适应的权重融合: 和当前帧特征越像的权重越大
1. 首先对前后帧的feature进行warp
2. 对于每个位置p,得到一个1x1xC=C维的向量,然后利用一个小的全卷积网络将它投射到一个新的embedding(降维)来计算cosine相似度
3. 利用softmax进行归一化
利用光流提升视频识别的速度和精度

Experiment

实验就不多介绍了,对移动快的物体提升明显,联合训练效果最好。
利用光流提升视频识别的速度和精度


  1. Flow-Guided-Feature-Aggregation code
  2. Deep-Feature-Flow code