这篇文章有一个扩展《Stereo Matching by Training a Convolutional Neural Network to Compare Image Patches》。
1. 研究问题
使用CNN来计算立体匹配代价。
2. 研究方法
MC-CNN训练一个卷积神经网络来预测两个图像块的匹配程度,并使用它来计算立体匹配代价。 通过基于交叉的成本聚合和半全局匹配来细化代价,然后进行左右一致性检查以消除遮挡区域中的错误,利用亚像素插值并应用中值滤波和双边滤波来获得最终的视差图。
2.1 Computing the matching cost
2.1.1 Creating the dataset
2.1.2 Network architecture
在这篇文章中,没有讲损失函数的设计,但在同年的另一篇文章中,用了hinge loss,是这篇文章的完善版以及扩展,hinge loss里面就包含了正例和负例的输出分数。详见另外一篇文章《Stereo Matching by Training a Convolutional Neural Network to Compare Image Patches》。
2.1.3 Matching cost
当网络训练完毕后,输入一对patches,输出即为两个patch的相似性分数。要遍历立体图像的所有像素的整个视差范围,会导致计算量很大,因此,文章也提出了减小计算量的方法:
- L1,L2,L3 三层可以对每个像素只计算一次,避免遍历不同视差时的重复计算。
- 输入整幅图像对而不是patches,然后将网络的L2,L3两层修改为卷积层,L2层改为
5*5*32
的卷积核,L3层改为1*1*200
的卷积核,这样L1层和L2层就可以形成9*9
的感受野大小,跟原始的输入patches大小一样,因此可以一次性的计算整个立体图像对的特征空间,而不用进行W*H
前馈的patches特征的计算。注意:训练的时候还是采用patches输入,因为这样可以很方便的完成样本随机排序,控制每个批量中正例数量等于负例数量,以及控制每个批量中的patches可以来自不同的图像;但在推理时使用整幅图像输入,以加快计算速度。 - L4-L8也可以改成卷积层,这样就可以经过一次前馈,而完成整张图像的一个视差值的代价计算,遍历所有的视差值(可以通过将右图特征右移遍历其他的视差值)。因此,整个CNN计算代价的计算瓶颈就是视差搜索范围D。
最终,通过CNN可以得到立体图像对的初始代价空间 C C N N ( p , d ) C_{CNN}(p,d) CCNN(p,d)。
2.2 Stereo method
2.2.1 Cross-based cost aggregation
2.2.2 Semiglobal matching
文章说,在SGM之后,还需要进行交叉聚合,应该是可以进一步细化代价空间。
2.3 Computing the disparity image
2.3.1 视差计算
用WTA,
2.3.2 视差细化
利用左右一致性检测检测异常点和遮挡点,然后用填充,亚像素插值,中值滤波和双边滤波进行细化。
3. 实验结果
4. 结论
(1)在KITTI-2012测试集上获得了2.61%的错误率,是当时的第一。
(2)证明了CNN可用于计算立体匹配代价,并且可以通过增加训练样本数提高视差精度。
5. 局限性
(1)CNN计算匹配代价非常耗时。
(2)有限的接受域和复杂的正则化函数。
6. 启发
相比于手工制作的特征,通过卷积和池化可以提取全局上下文,而不仅仅是局部特征。