论文题目《Pyramid Stereo Matching Network》,被2018CVPR收录,后将用PSM-Net表示这个模型...没办法,立体匹配这边大家都是这样给自己的网络命名的。这篇论文的代码是PyTorch的,所以重点关注了一下,终于大概知道了立体匹配这边经常用的cost volume是什么东西了...
主要的创新点就是引入了空间金字塔池化模块(spatial pyramid pooling,SPP)。作者谈到,当前的方法没有利用好上下文(context,一直不知道这个词咋翻译好...)信息,于是用SPP聚合多尺度的信息。其实多尺度在深度估计/补全的很多方法都用到了,不过SPP的概念应该是在这边的首次引入吧。摘要中谈到的另一个点是堆叠漏斗网络(stacked hourglass networks),不过这个东西看着名字很厉害其实也就是一个用3D卷积做的encoder-decoder结构,然后用了好几个堆叠起来(stacked的意思)。
话说立体匹配这边得到的都是视差图,单位是像素,也即左图某像素点(x,y)在右图中匹配的像素点为(x-d,y),d即视差。要转化为深度,还需要进行标定,要给出相机的基线B和焦距f。深度z=fB/d。
传统的立体匹配主要是两步:匹配损失(matching cost)和后处理(post-processing),而神经网络出现后,很多工作都是基于CNN的。但是只施加强度一致的信息是不够的,很多病态区域如遮挡区域、重复出现的表象、低纹理区域、反射表面等。需要全局上下文信息进行整合。SPP和膨胀卷积用来扩大感受野,使得PSM-Net可以将像素级的特征扩展至多尺度区域级的特征。全局信息和局部信息结合形成cost volume,再用3D卷积的方式融合多通道信息,正则化cost volume,最终预测视差图。
根据《A taxonomy and evaluation of dense two-frame stereo correspondence algorithms》的总结,传统的立体匹配方法可以分四步:匹配代价计算;代价聚合;优化;视差调优。看的好多立体匹配的文章都再Related Work里引这个了,所以过来敲下黑板。还有一个要注意的是发表在17年ICCV上的工作:GC-Net,应该是首次提出cost volume并用3D卷积将其正则化。
网络结构的示意图:
![84a53d712ac3be559cf1181e65902e8a.png](https://i-blog.csdnimg.cn/blog_migrate/bca4102a78a006ed2a88f5abfbec75e0.jpeg)
立体匹配这边左右视图提取特征的网络都是共享权重的。SPP模块可以从左下方看到,就是四个不同尺度的池化,再上采样串联起来,其实就是整合多尺度的信息。送到cost volume之前左右图的特征是(1,32,96,312)维度的(连着两个乘号会把中间的加粗...行吧),32是通道数,96*312是输入图像分辨率的1/4,1是batch size,后面的cost volume的1也是这个,就不管了。cost volume的维度是(1,64,48,96,312),64的前32个通道是左视图的,后32个通道是右视图的;48代表视差等级的维度,即视差为0-47px(设置最大视差为191px,后面会上采样)。贴一下形成cost volume这部分的代码,比如现在i=10,即cost volume的第三个维度视差为10px时,第二个维度的前32个通道取左图x轴上10以后的像素,后32个通道取右图x轴上去掉最后10像素的所有,其他地方都是0(截图没截出来)。
![10986b0849bfe5f30963dd64a530816c.png](https://i-blog.csdnimg.cn/blog_migrate/5eaf69f365809e0d6ba24b1c59513c8b.jpeg)
得到cost volume之后就是一大堆3D卷积(Stacked hourglass的结构比Basic效果好,反正谁复杂谁强呗...),可以看到右下方有bilinear和regression模块,就是将低分辨率、低视差等级的图插值为(D,H,W)维度的,然后用softmax作用于所有视差等级求出各个视差的概率,加权得到最终各个像素点的视差,即H*W的视差图。
训练的损失函数是Smooth L1损失,说是比起L2损失对异常点不敏感(low sensitivity to outliers)。训练集是Scene Flow是一个合成的数据集,然后在KITTI 2015上调优。KITTI 2015 立体匹配数据集规模比较小,训练集200对双目图像、测试集200对,而且视差的真值是稀疏的(约20%的像素有真实视差值数据)。所以现在合成的规模较大的Scene Flow上训练,再在KITTI 2015上调优。最终的结果:误差高于3px的点的数量为1.98%,还是很不错的。放一张效果图稍微看下:
![d172518cc30a780d0f6567439d6d55a5.png](https://i-blog.csdnimg.cn/blog_migrate/651897eb97f1cc0752dded0aecc83c0c.jpeg)
作者还谈到,PSM-Net对病态区域鲁棒性很高,像车窗、墙啥的,和其他工作对比:
![1fd99b10c4dc5aa90d781543f41ceeb4.png](https://i-blog.csdnimg.cn/blog_migrate/ce34cc79ee896eb2a0226f88bc78a15b.jpeg)