论文学习——Stereo Matching by Training a Convolutional Neural Network to Compare Image Patches
原始论文地址:https://arxiv.org/abs/1510.05970
代码:https://github.com/jzbontar/mc-cnn
摘要:针对很多立体匹配算法的第一阶段——匹配代价计算,通过CNN来学习小的图片块之间的相似度。用CNN的输出来初始化后续立体匹配处理,包括cross-based代价聚合,半全局匹配,左右一致性检查、亚像素增强、中值滤波、双边滤波。并在KITTI2012、KITTI2015和Middlebury立体数据集上进行测试评估。
1. Matching cost
一个简单的方法是
其中p是像素位置,d是视差值,I是照片对应位置的强度,Np是p的邻域。
1.1 构建训练用的数据集
真实的深度图(ground truth)可以从KITTI或Middlebury数据集中获得。通过该深度图,构建一个二分数据集(binary classification data set)。就是说构建一个正确的和不对的照片对,则后面训练时只需使正确的cost最小,不对的cost最大即可,构建方法如下:
用
表示一组图片块。
假设
则
分别表示错误情况和正确情况下q的表示。其中,Oneg是从区间[dataset neg low, dataset neg high]或者[−dataset neg high, −dataset neg low]中随机取的,Opos是从区间[−dataset pos, dataset pos]中随机取的。关于Opos为什么不直接取0,文中说是和后面处理过程有关。另外,Opos应小于1。
1.2 网络结构
这部分主要就是利用CNN来计算两个图片块的相似度,而不是以前那种直接通过特征点的方式来找对应点的方式。其实本质上是一样的,以前只不过是人为的设定了特征,然后找左右图片中像素的一一对应关系,现在转用CNN来找特征做,结果更好罢了。
原文中的网络结构分两种,一种快速型的(图1),一种精度型的(图2)。
图1 Fast Architecture
图2 Accurate Architecture
其实差不多,后者相比前者多了一个全连接层,最后用cross-entropy计算相似度,而快速型的最后直接用hinge loss计算相似度。
1.3 计算匹配代价
CNN网络的输出可以表示为
2 立体方法
CNN输出的图还不够好,如图3所示,后面还要经过cross-based代价聚合,半全局匹配,左右一致性检查、亚像素增强、中值滤波、双边滤波等步骤。
图3 CNN直接输出结果
2.1 Cross-based Cost Aggregation
可以看到图3中很多的噪声和不连续的点,一个很自然的想法就是根据某个像素周围像素的深度信息来评估该点的深度值有没有问题。这是MRF的思路。但是,遇到遮挡,深度不连续的情况怎么办呢?因此需要找一个能自适应的找到合理邻域的方法。
在Cross-based Cost Aggregation中,它是这样做的:对于点p,在上下左右分别伸出四条臂,直到不满足以下条件的时候终止。(就是强度不能超过太多,距离不能太远)
然后在p所在的垂直臂上,每一点(命名为q)同理再伸出水平的臂。就得到了点p的支持区域Up,如图4所示。
图4 p的支持区域Up
考虑左右两图,则最终的联合支持区域为
匹配代价计算为
其中i是迭代次数。这里有点像置信传播(BP),通过迭代传递信息。
2.2 Semiglobal Matching
可以通过对目标函数加上平滑约束来减少误差。定义能量函数E(D)如下,
其中D为深度图
其中1{·} 表示indicator function, 就是满足了返回1,不满足返回0。
在Semiglobal Matching,原文是通过上下左右四个方向逐次优化,然后取平均的方式做的。
在方向r,为了减小E(D),构建了Cr(p,d)如下
第二项被减掉是为了防止Cr(p,d)的值过大。惩罚系数P1,P2是根据梯度来设置的:
其中
最终cost函数为
在半全局最优匹配后重复cross-based cost aggregation。
2.3 Computing the Disparity Image
2.3.1 插值
左右视差图一致性检测:
对于标记为occlusion(遮挡)的点,通过向左寻找标记为correct的点,用其值作为插值。
对于标记为mismatch的点,在16个不同的方向找到最近的标记为correct的点,取其中指进行插值。
插值处理后的视差图记作
2.3.2 亚像素增强
我们知道视差的值是有范围的,最小单位就是一个像素,这其实会造成分辨率较低(因为求出的深度是离散的),因此需要用到Subpixel enhancement。这里用一个二次函数拟合的方法进行亚像素增强。
有三个深度候选人d, d _ and d +,其中d是求出来的最佳值,d _ = d − 1,d + = d + 1,假设代价函数可以用二次函数来近似
则代入可以求出二次函数取最小值时
因此,用该方式可以得到新的深度图
其中
2.3.4 滤波
文中用了5x5中值滤波和双边滤波,双边滤波可以较好地保留边缘信息,公式如下:
其中g(x)是一个零均值高斯分布的深度概率函数,标准差为blur sigma,W (p)是归一化常量
这里的
就是最终输出。效果如图5所示:
图5 最终输出