【论文笔记-Stereo】Deep Stereo Matching with Explicit Cost Aggregation Sub-Architecture
目录
-
-
简介
-
摘要
-
论文主要内容
- A: 匹配代价计算
-
特征提取(ResNet18)
-
特征Volume构建
-
相似度计算
- B: 匹配代价聚合
-
C:视差计算
- 实验
-
简介
Deep Stereo Matching with Explicit Cost Aggregation Sub-Architecture
AAAI2018 ,KITTI2015目前(20180320)排名第二,PSMNet
https://arxiv.org/abs/1801.04065
摘要
深度卷积神经网络,在解决双目立体匹配问题上已经取得了非常不错的表现。很多工作都专注于特征提取和相似度的计算,但是,很少人关注匹配代价聚合,这个在视差计算中很重要的一步。在这篇文章中,我们将介绍一种基于学习的匹配代价聚合方法来进行立体匹配,通过引入新的子结构使得整个视差计算网络可以被端到端训练。我们将匹配代价聚合转化为可学习的匹配代价生成和挑选两个过程。
使用双束流网络:一个分支用来产生可能的匹配代价融合结果,另一个用来挑选最后的结果。挑选的准则由浅层的图像信息(形状,边缘)决定。通过这种方式,我们很好地矫正了视差的计算,我们在KITTI上进行验证,得到了超越前沿算法的效果。
论文主要内容

我们通过三个步骤实现时差的计算:匹配代价计算,匹配代价聚合和视差计算
-
匹配代价计算包含三个部分:特征提取(A1), volume构建(A2),相似度计算(A3)
- A1是一个特征提取网络,使用ResNet结构
- A2使用简单的平移实现
- A3通过编码-解码结构进行相似度计算
-
匹配代价聚合包含两个子结构:一个产生聚合结果的proposal(B2),另一个结合图像浅层信息对匹配代价进行融合(B1)。
-
最后一部分(C)主要负责视差计算
A: 匹配代价计算
特征提取(ResNet18)

输入:(H, W, nChannel) , (H, W, nChannel)
输出:(H/2, W/2, F), (H/2, W/2, F)
为了节省计算资源,先对图像进行5x5 stride =2 的卷积,然后使用ResNet18进行特征提取,图像大小变为H/2, W/2, F。
特征Volume构建

输入:(H/2, W/2, F) , (H/2, W/2, F)
输出:(D, H/2, W/2, 2F), 其中D = max_possible_disparity
3D卷积能够非常有效地处理volume类型的3D输入,因此,我们通过提取的特征构建feature volume。构造的方式很简单,通过平移feature map然后拼接实现。我们以左图feature map为基础,然后沿着W方向移动右图的feature map,移动{1, max_disparity}个像素,每次移动将超出的部分用于补充缺少的部分。
相似度计算

输入:(D, H/2, W/2, 2F)
输出:(D, H, W,1) cost map
因为,“3D convolutional networks are effective to take into account the context and geometry information ”。直接对feature volume进行学习得到相似度。
由于3D卷积耗时,耗内存,所以采用auto-encoder结构(FCN结构?)。使用4层编码单元 + 4层解码单元的结构。
- 一个编码单元包含两个普通的s=1x1x1的卷积层和一个s=2x2x2的卷积层,使得原feature map在D,H,W维度各自减半。
- 一个解码单元包含一个s=2x2x2的上采样卷积层,并且,每一层都使用ResNet的思想,和编码器中对应位置、相同大小的feature map 相连。
最后我们添加一个2x2的上采样层,使得输出图像恢复原图的大小(D, H, W),这个图就是初始的匹配代价图。
B: 匹配代价聚合
匹配代价聚合的目的是为了修正一些错误的匹配代价值。因为匹配代价是基于局部区域计算得到的,我们现在用全局的信息来进行修正。另外,匹配代价融合还可以让我们的到高质量的视差图,保证视差图有非常好的平滑性和连续性。
传统的匹配代价融合使用人工定义的方程实现(论文提到“static or dynamic function”,不是很理解)。这里我们使用学习的方法对初始匹配代价进行融合。我们使用一个双分支的网络。
-
proposal stream: 这一分支用来产生可能的匹配代价聚合结果, 我们直接在初始的匹配代价计算网络上添加匹配代价聚合网络(与其他端到端的方法不同,我们显示地定义聚合网络),是整个网络可以end-to-end训练。这一分支可以使得匹配代价计算考虑足够大的receptive filed,和足够丰富的语义信息。
输入:(D, H, W, 1)
输出:(D, H, W, G) G是所有可能的匹配代价聚合结果。如果只看一个维度,C(d,h,w,G)就表示在像素(h, w)处,视差为d时,聚合后的cost的可能结果有G个。 -
guidance stream: 这一分支直接使用CNNs从reference图片中提出浅层的图像结构信息,这种信息可以作为全局信息来对前一分支的结果进行选择。我们使用轻量化的网络进行特征提取,因为很多工作已经证明,在深度CNNs中,浅层网络能够提取浅层的结构信息,而高层网络往往提取的是高层的语义信息。两者对于匹配代价融合都是非常重要的。前一分支负责的结果富含语义信息,而这一分支的结果则主要提供结构信息。
输入:(H, W, nChannel)
输出:(H, W, G) 我们沿着G维度,把guidance的结果用sofmax转换为概率,代表取当前位置(h,w) 在target图中对应的cost的概率。
最后,我们结合两个分支的结果进行匹配代价聚合结果的结算:
其中*代表矩阵乘法。(这里为什么用乘法比较tricky,和同学讨论后得出了一些假设性的结论:用矩阵乘法可以比较好的结合两个分支的优势,同时可以使两个分支在反向传播过程中同步优化。我们用加法来做对比:用乘法进行融合,可以使两个分支的梯度相互影响,共同优化。相反地,如果用简单地加法,就不能很好地结合两个分支提供的信息。因为这个时候相当于两个网络,梯度的调整也是相互独立的。) 括号里的解释似乎不是很靠谱,这里的矩阵乘法的物理含义不知道如何解释,以及,矩阵乘法之后取max也不好理解,希望清楚这一点的读者帮忙解释一下,我留个坑,以后理解了再回来解释。
C:视差计算
使用soft-argmin 方程而不是WTA进行最后的视差计算。这种方法
是将匹配代价沿着d维度,使用softmax函数映射为概率,则-C(h,w,d)可以用来来表示位置(h, w)处的视差为d的可能性。然后使用概率的加权和计算最后的视差。其中,权重就是对应位置的视差值d。
其中 \sigma为softmax方程。
这种方法的优势是考虑了所有可能的视差值对应的Matching cost,这使得得到的视差图更加平滑,并且能够得到更高质量的(sub-pixel level accuracy?)。另外,上面的方程是可微分的,所以很容易参与训练。
最后的损失函数用L1损失:
实验
Scene Flow 是一个合成的双目立体匹配数据集,其中包含35454个训练图像对,4370个测试图像对。下表对比了我们和GC-Net效果:

KITTI Benchmark

验证guidance 分支的作用,可视化结果

