这是kitti上排名靠前的文章
且最近希望能够从传统方法的角度上看看可否突破
因此这篇文章必定细读之
摘:
SGM是一个常用的规范化方法,以其较高的精度以及较快的速率闻名于世。
通过改变SGM的惩罚参数来调节视差预测图是否平滑还是不连续,SGM能够取得一个较好的结果。所以要用好非常的不容易而且跟使用者的经验有很大的关系。
因此本文提出一种这个参数估计的方法,美其名曰 SGM-Net ,由卷积神经网络构成。
SGM-Net的输入是小图像块以及位置,输出就是3D物体结构的惩罚。为了网络能够训练,loss也做一番手脚。
对于SGM来说非常重要的惩罚因子应当根据3D物体的结构形状来决定。比如路面就很平滑,因此用CNN去进行惩罚的预测。
本文贡献:
1.对于SGM设计一个学习的方式去对其中重要的惩罚因子进行估计。
2.物体结构形状可明确区分
3.效果好,不论对于真实数据人造数据,各种艰难的环境,反射,模糊,噪声等等,效果杠杠的
相关工作
一般而言,利用CNN来获取local correspondence 信息,再由SGM来regularization。
MRF可以看做SGM的一个常用的方法
有个假设,梯度大的像素可能会不连续的。这意味着这里像素的惩罚应该小一点,来让视差进行跳跃(所以像素梯度大,变化大的地方惩罚小)
条件随机场(CRF)也可以来做这样的事,
SGM
(1)
第一项C,意味着像素x,以及它的视差d的匹配成本。第一项代表了所有视差映射D的所有像素的匹配成本之和。
第二项代表了x领域Nx当中所有像素y的倾斜平面惩罚P1,定义视差相差等于1为slanted surface。
第三项就是不连续误差的惩罚P2,定义视差相差大于1为不连续discontinuous。
P2一般设置得很小,根据图像的梯度大小来设置的。T当中内容为真则值为1,否则为0.
(其实这个公式中,C(x,d)一定是最重要的,是重点,后面的只是想让输出结果更加的平滑,最好恨不得Nx周围的y的d都与x的d一样才好呢)
(2)
(3)
后面这个公式只是为了防止式子太大了。。所以要减一个数
(这个L也是的,c一定是关键,是主题,后面的只是使得整个输出更加的平滑和连续,恨不得都是d呢~)
r是其中一个方向,一般最终结果是WTA即多个方向取和再取argmind(关于SGM至今还未有一个直观上的理解,先不多聊)
SGM-Net总述
该网络训练的时候根据path cost 和neighbor cost 去得到P1和P2,最后SGM根据P1和P2去得到最终的结果
图1
path cost
一个道理,就是穿过像素X0中最合适视差的路径gt一定是比其他路径都要小的。如果用hinge loss去表示,那么就会是。
(4)
m意味着margin,至于为什么要用hinge loss呢,恐怕是相比于softmax loss它的反向更加好写罢。首先看下这个图
图2
好,目光全部聚焦到像素x0先,成本costL呢,是由x3至x0一路累积而来的。经过像素x0的视差路径可以反向的去看看。本图中像素x0的视差d5(紫线)和gt视差即(橙线),各自如下表示:
(5)
beta呢意味着(3)中的最小路径成本,就是为了防止式子数值过大,后面减的那个数。
总的来说,路径上累计的成本公式就是
(6)
公式中T里面的数值就是r方向上连贯像素xk和xk-1的一系列视差差距。d^x0_i代表着从像素x0开始的,lambda代表着累计的匹配成本(不包含每个像素的最小成本),lambda与P1和P2无关哟。OK,下面用loss function Eg对P1和P2求偏导
可导就好了,这个就是“path cost”
由于path cost 不需要dense gt ,因此真实环境KITTI也适用。另外一方面,就是这个path cost存在一个中间路径的问题,比如图2中的橙色线和红色线,起点终点一样,中间有部分不一样,因此这段造成了关于像素x2和x3不一样的惩罚。
总的来说,path cost还是不错的,就是可能存在一些细节,比如A的丢失,可以看到a是gt,b是初始的,c是以path cost 去训练的
图3
Neighbor cost
为消除path中不清不楚的一些视差,我们引入“neighbor cost”函数。最基本的想法就是穿梭于连续像素之间的包含正确视差信息的路径必须是最短的。如图4
图4 连续像素之间相关的视差,红线是正确的path,绿线是错误的path
红线中的成本Fb,Fs或者Ff一定是比率险种的要小。
neighbor cost 是这样的:
(7)
其中N意味着
(8)
FX(.)是一个基于连续像素之间视差变化关系的函数:border Fb(.),slant Fs(.),flat Ff(.)
Border就是说明连续像素之间视差不连续。因此path cost FX(.)定义如下:(9)
SLant就是只有一个小的视差变化,FX(.)是:(10)
Flat就是说没有变化,所以不加惩罚:(11)
添加neighbor cost 一个有必要的条件就是像素x1的视差必须要估计正确。
就是说这个积累的cost必须要在所有视差上都有一个最小的accumulated cost Lr,否则,像素x0的视差就不可能预测正确。
neighbbor cost 的优势就是连续像素之间的聚合cost应当在正确的视差上都取最小。同时,在所有像素上都加neighbor cost是非常困难的,因为特殊条件。
最终的loss就是将上面讲的融合到了一起。
(12)
最后的最后~
千言万语汇成一句话:求源码!