FlowNet 1.0 and 2.0

这两天读到了FlowNet1.0与2.0这两篇文章,算是用CNN来估计optical flow的经典文章,因此拜读一番,体会一下前辈的真意。

FlowNet1

FlowNet 1.0: Learning optical flow with CNNs

FlowNet1.0是比较早的文章了,ICCV2015的paper,其主要网络架构有两个,一个是FlowNetSimple,一个简单的encoder-decoder结构,另一个是FlowNetCorr,先对每帧提取feature,然后利用一个correlation layer来获取两帧的feature之间的相关性,这个layer在后面的很多方法中,包括去年比较有名的contextual attention都有影子。具体做法就很简单了,其实就是把patch similarity的计算利用卷积来实现,但是因为结果值是4维的,计算量很大,因此文章采用了局部patch计算的方式,减缓复杂度。

具体而言就是,原本的版本中,对x1中的一个patch,计算x2中所有的patch与它的相似度,而改进的版本中,对x1中的一个patch,计算x2中边长为D的square之内的所有patch与它的相似度,这样的话复杂度就变小了很多,也能够提取到比较好用的correlation feature。

但是这样的话,D的大小就得控制好了,因为一定要超过Flow的最大值。

实验结果表明,FlowNetSimple相对于FlowNetCorr能够更好地泛化,而且FlowNetCorr在大的motion情况下会有一些问题。(当然这些点后来被FlowNet2给推翻了)

FlowNet 2.0: Evolution of optical flow estimation with deep networks

FlowNet2.0首先提到FlowNet1.0没有将FlowNetC和FlowNetS在同等条件下做对比实验,所以得出来的孰优孰劣不够准确。

这篇文章在FlowNet的基础上提出了三个点,其一是training data的训练策略,其二是提出了stacked architecture,其三是提出了一个子网络,focus在small displacement上,二三两点通过逐级优化和correlation的方式提升了flow estimation的性能。二三两点其实就是网络的堆叠+warp之后的consistency loss,是现在看来比较常规的操作了,文章做了不少实验去选择不同形式堆叠的网络结构。

关于第一点,主要是提到了在训练数据不是很够的情况下,或者说不同训练数据复杂度不同时(例如真实数据和合成数据),训练数据的顺序也很重要,我的理解是先在通用而简单一点的数据集上学习通用的模型,然后再在复杂的数据集上学习更加复杂的特性,类似于coarse-to-fine的操作。

小结

FlowNet系列是比较早的文章了,其中的思想都比较经典吧,虽然不一定是最早提出的,例如correlation layer、learning schedule等。

文章目录
  1. 1. FlowNet 1.0: Learning optical flow with CNNs
  2. 2. FlowNet 2.0: Evolution of optical flow estimation with deep networks
  3. 3. 小结
|