参考代码:RAFT-Stereo
1. 概述
导读:RAFT算法是非常经典的立体匹配算法,在光流和立体匹配任务中有着广泛的运用。而这篇文章正是基于RAFT并将其运用到了立体匹配中,并且在如下的几个方面进行改进:
1)相比原生的RAFT算法钟重点关注X轴(W方向)的视差信息,前提是输入的图像对需要事先经过极线校准;
2)在GPU的update阶段使用stride为 [ 8 , 16 , 32 ] [8,16,32] [8,16,32]的特征图进行运算,这样可以在迭代优化的同时更加增大网络感受野,从而增加对与大范围无/弱纹理区域的适应性;
通过上述两点的改进文章的立体匹配算法在现有的一些基准测试集上均取得了较为不错的结果,而且基于RAFT其泛化性能也是不错的。
文章的方法通过聚焦X维度视差,并且在update阶段采用多尺度优化的形式,极大增强了在极线对齐情况下网络的性能,文章的算法得到的效果见下图所示:
文章的算法在时间上的对比:
2. 方法设计
2.1 算法pipline
文章算法的pipeline见下图所示:
可以看到文章的pipeline主要由三个部分组成:左右视图特征抽取网络,使用左视图的内容特横抽取网络,基于Conv-GPU的迭代更新模块。
2.2 特征抽取模块
从图1中可以看到文章的特征抽取网络包含两个部分:
- 1)左右视图特征抽取:这里将左右视图输入同一网络得到它们的特征,需要注意的是这里使用了Instance Norm,参考:
# core/raft_stereo.py#L39
self.fnet = BasicEncoder(output_dim=256, norm_fn='instance', downsample=args.n_downsample)
- 2)context特征抽取:这里是对左视图进行特征抽取,这里使用的归一化为BatchNorm,参考:
# core/raft_stereo.py#L29
self.cnet = MultiBasicEncoder(output_dim=[args.hidden_dims, context_dims], norm_fn="batch", downsample=args.n_downsample)
2.3 基于Conv-GRU的迭代更新模块
2.3.1 相关性金字塔构建与X维度采样
回顾原生RAFT中是通过矩阵相乘,也就是torch.matmul()
的形式实现相关性计算的,而在这篇文章中也是通过矩阵相乘的形式,只不过在后面对其中一个X维度进行归约得到,其公式为:
C i j k = ∑ h f i j h ⋅ g i k h , C ∈ R H ∗ W ∗ W C_{ijk}=\sum_hf_{ijh}\cdot g_{ikh},\ C\in R^{H*W*W}