Deep Learning Based Registration文章阅读(十)
本次文章是CVPR2021年《Learning Optical Flow from a Few Matches》。基于深度学习的光流法的研究一直是CV领域坚持不懈的追求。目前取得sota的RAFT(Recurrent all-pairs field transforms for optical flow)需要计算dense correlation volume,这会带来很大的memory和computation的负担,并且对于first image中的一个像素对应的second image中的dense correlation volume只有一小部分的correlation value很大,所以论文作者认为dense correlation volume是冗余的,并假设只需要top-k个,也就是correlation value最大的k个点的sparse correlation volume就足够,论文结果也是印证了这个假设。
Motivation
目前基于深度学习的光流估计方法中,correlation (cost) volume是最为流行的表示dense displacement的方法。但是dense correlation volume的计算需要较大的memory和computation,这不利于有效的训练和模型的部署。目前解决该问题的方法是采用类似与PWCNet中coarse-to-fine的策略,在size较小的high-level feature上去计算correlation volume,然后通过上采样加fine-tune最终估计出原图大小的flow field。但是coarse-to-fine的策略会带来一个问题,就是著名的“small objects moving fast problem”,自然的感觉是:如果一个物体很小,那么在high-level feature map中可能一个像素都占不到,那么上采样加卷积fine-tune的时候可能无法“无中生有”的估计出这个object的flow,但是这个object又运动很快,如果没估计出来对于最后的flow field的准确性影响优惠很大,在EPE等指标上可能就非常明显。所以基于这两个考虑,这篇文章在RAFT上做出改进,提出sparse correlation volume一方面可以减轻计算负担,同时因为sparse的特性,相比于RAFT可以用更高分辨率的feature map来计算correlation volume,所以能够取得和RAFT差不多的效果(一定程度上得益于“small objects moving fast problem”的缓解)。但是该方法的局限性也是存在的,就是在局部特征不明显的区域估计的效果不好,这是因为在局部特征不明显的点,它的top-k matches找的不好,但是找特征点的时候一般不是找全图,但是这里必须是对first image的全图进行操作,所以感觉这个问题无法避免。
Framework
先验知识:correlation volume
如下试,计算first image的每个像素与其在second image的对应点(这里对应点的概念,如果是像PWCNet那样还有warping操作,那就是坐标一样的点;如果像本文中没有warping操作,只是靠forward search来估计displacement,那对应点的坐标笔者的理解是first image该像素加上该像素displacement后的坐标)为中心的窗口为d的范围内所有点计算correlation value,是一个4D的tensor
Framework
这里的F1,F2是经过CNN backbone提取后的feature map,本文用的是6个resnet unit的CNN。sparse correlation volume是用KNN将first image的每个像素的前k个matches计算出来,只保留这k个matches,本文中k=8
下图是怎么更新sparse correlation volume中的不可学习的中间结果,其他都好理解,只有这个di+1=di−Δfid_{i + 1}=d_i - \Delta f_idi+1=di−Δfi稍微难理解:F1中x对应F2中的点是xix_ixi,经过上次迭代后可以得到的flow residualΔfi\Delta f_iΔfi,那很好理解fi+1=fi+Δfif_{i+1}=f_i + \Delta f_ifi+1=fi+Δfi,所以第i+1次迭代的F1中x对应F2中的点是xi+1x_{i+1}xi+1,那原本xxx对应F2中的top-k个mathces的坐标是不会变的,因为整个framework中没有warping操作,所以xi+dix_i + d_ixi+di的位置是不会变的,他相对于xix_ixi的距离是did_idi,在第i+1次迭代中,因为现在的点是xi+1x_{i+1}xi+1,而xi+dix_i + d_ixi+di的位置是不会变的,所以现在的相对距离di+1=xi+di−xi+1=xi+di−(xi+Δfi)=di−Δfid_{i+1} = x_i + d_i - x_{i+1} = x_i + d_i - (x_i + \Delta f_i)=d_i - \Delta f_idi+1=xi+di−xi+1=xi+di−(xi+Δfi)=di−Δfi
下图解释的是Multi-scale Displacement Encoder,总的思想是把现在的不规则的sparse correlation volume的tensor转为RAFT中的规则的tensor,这里采用的是bilinear splatting策略将coarse-level的不在grid上的matches的correlation value转到grid上,简单理解bilinear splatting就是双线性插值的逆过程。然后使用一个固定大小半径r的window来构建N∗5∗(2r+1)2N*5*(2r+1)^2N∗5∗(2r+1)2的规则tensor,这里的N是h*w就是图像的面积,5是有5个level,相比于RAFT的N2N^2N2大小的tensor,计算量和memory都减少了。
GRU是一个类似于LSTM的单元,用来估计flow residual
Loss
从sparse correlation volume - GRU block updata这个流程迭代N次,本次是8次,loss是每一次迭代后的flow和GT的L1范数的一个加权平均,权值和时间有关,越往后的迭代权值越大
Dataset
Training set: FlyingChairs/Things/Sintel(clean显示颜色、纹理和场景照明的变化,但没有图像退化/Final模拟景深模糊、运动模糊、阳光眩光的变化)/KITTI-2015
Test set: Sintel/KITTI-2015
Evalution
EPE(end-point-error)for Sintel
F1-all for KITTI-2015
Results
下图是文章方法和目前各个做光流方法的比较,最主要比较的还是RAFT方法,可以看到相比于RAFT基本都有掉点
下图是唯一一个涨点的Sintel Clean (train)数据集的一些可视化结果,涨点的原因解释为因为sparse correlation volume占用内存更小,可以在更高resolution的feature map上计算,所以一定程度上缓解了“small objects moving fast problem”。
下图是ablation study
下图是评估memory
Discussion
下图是failture的例子,红头发区域因为局部特征不明显,所以KNN找到的top-k个matches不好,从而影响了该区域的flow estimation
疑问
KITTI-2015评价指标中F1-all——光流异常值占的比例,光流异常值的定义是什么?