点击下方卡片,关注“自动驾驶之心”公众号
ADAS巨卷干货,即可获取
点击进入→自动驾驶之心技术交流群
后台回复【数据集下载】获取计算机视觉近30种数据集!
学习资料:
GitHub仓库:/krahets/awesome-mvs
GitHub仓库:/walsvid/Awesome-MVS
Multiple View Geometry in Computer Vision (Second Edition).pdf:/DeepRobot/books/blob/master/Multiple%20View%20Geometry%20in%20Computer%20Vision%20(Second%20Edition).pdf
常用数据集:
DTU:室内数据集,124个场景,每个场景包含49或者64张图像(7种不同的光照条件),用机械臂拍摄,深度范围较小,提供gt的深度图和22个场景的gt点云
Tanks and Temples:主要是室外的数据集,训练集只有7个场景有ground-truth的点云,深度范围较大,一般用于测试模型在室外数据集中的泛化能力
BlendedMVS:合成数据集,既有室外也有室内场景,一共113个场景,17818张图像,用于finetune或者测试,提供gt的深度图,部分场景有gt的网格(Mesh)
ETH3D:有多目和双目benchmark,提供gt的深度图,高分辨率多目有13个训练场景,12个测试场景;低分辨率多目有5个训练场景和6个训练场景的视频
多目立体匹配问题定义:
大部分多目立体匹配是用深度图的方式来表示场景,跟体素相比内存占用更少,分辨率更高,近几年隐式神经表面也十分火爆(DeepSDF,Nerf),但主流的方法是用深度图来表示场景,然后用一个后处理将深度图融合成3D的点云(Point Clouds),因此本文介绍的算法也是基于深度图表示的算法。
输入:同一个场景在不同视角拍摄下的多张图像 ,理想情况下,输入图片数量可以是任意大小,一般我们选取视角交叉较大的几张图片作为输入(n=3或者5)
[注1]: 这里的输入图像有多张,为了区分,我们将需要估计深度的图像称为参考图像reference view(Ref.),将除了这张图像外的所有图像成为源图像source view(Src.)
输出:多目立体匹配主流的pipeline中主要将深度图 ,作为一个预测量输出,但是多目的方法需要在3D空间中评价,因此我们会将生成的深度图通过一个标准的后处理(post-processing)流程生成点云文件,再和ground truth的点云文件比较,以此来评价生成点云的质量
原理:对极几何(Epipolar Geometry)
如左图所示,当3D空间中的一个点同时在两个平面内成像的时候,三维点,两个平面中对应的成像点和,以及两个相机的中心 和 应该是处于同一个平面(Epipolar Plane)上的。基于对极几何的原理,对于左图中任意一个像素点 ,如果我们能找到它在另一个视图中对应的成像点 ,那么连接 和 我们就可以得到这个像素点 在3D空间中的准确位置。
多目相比于双目的特殊性在于,多目是一个超定的问题,如果一个像素点可以在多个视图中被匹配(一般都会有误差),生成了多个3D点,那么哪一个3D点才是真实的 的位置
从多目立体匹配的定义中,我们引申出来一系列问题:如何在另一个视图中匹配对应的像素?如何在多个视图的匹配中计算出真实的位置?
MVSNet
MVSNet: Depth Inference for Unstructured Multi-view Stereo (ECCV)
主要贡献:
端到端多视角立体匹配的开山之作,将双目立体匹配的方法扩展到了多目立体匹配中,在此框架下可以处理任意多个输入视角的图片
提出了一个简洁优美的端到端神经网络来处理多目立体匹配的问题,后续很多方法都是基于这一套框架来实现的
通过计算方差生成3D cost volume以及3D卷积来聚合多个视角的信息,得到深度图的估计
网络框架:
如上图所示,整个网络分为:特征提取(Feature Extraction),可微单应性变换(Differentiable Homography),3D代价体正则化(3D Cost Volume Regularization),深度图优化(Depth Map Refinement)
特征提取
这部分使用的是共享参数的2D卷积,将图像层层下采样到输入图像的1/16,然后在最低分辨率的特征图上面做可微单应性变换
可微单应性变换
整个框架最核心的部分就是可微单应性变换,以及3D代价体正则化,单应性变换(Homography Warping)的公式是:
其中 是单应性变换矩阵,这个公式是为了计算视角 中的一个像素点,在另一个视角 下对应的像素点,公式中的 和 分别对应视角1和视角 的内参矩阵; 和 对应外参矩阵中的旋转矩阵,表示相机参考系相对于世界坐标系的旋转; 和 对应外参矩阵中的平移矩阵,表示相机参考系相对于世界坐标系的平移; 是一个法向量,垂直于图像平面;而 是一个标量,表示像素点相对于相机坐标系的深度,这正是我们要求的量;(具体公式可以参考《Multiple View Geometry in Computer Vision》)
观察这个公式我们可以知道,在做多视角几何重建的时候,当我们知道一个像素点 以及这个像素点对应的深度 时,我们就可以找到这个像素点在另一个视角 下的位置 ,将视角1中 的像素值填充到位置 ,用这样的方法将视角1中的像素全部变换到另一个视角,我们就可以得到一张单应性变换之后的特征图 ,当深度值估计越准确的时候, 和 越接近。
单应性变换提供了一种度量, 可以表示当前深度估计的准确性,也是作者文中所说的代价图(cost map),对于一张参考视角图像 (reference view)以及 张源视角图 我们可以得到 张代价图
但是这种代价图是视角两两之间的代价,如何融合多个视角的信息呢,最直观的方法是用均值(mean)或者直接级联(concatenate)去度量,(双目中还有直接级联,以及计算相似度correlation的方法)在这里作者使用的方法是方差(variance):
MVSNet在数据集的深度范围内沿着相机的法线方向均匀采样了 个深度,然后根据每一个采样的深度去做单应性变换, 个假设采样深度可以生成 张cost map,将这些cost map堆叠起来就能得到一个3D的代价聚合体(cost volume)
这个cost volume可以理解为参考视角图像 中的每一个像素在不同深度下的代价
3D代价体正则化
3D代价体正则化部分使用一个3D U-Net结构来将代价 cost 转化为概率,用3D的卷积来感知 cost volume中的信息,得到一个概率聚合体(probability volume),这个概率聚合体可以理解为视角图像 中的每一个像素在参考相机坐标系下的深度的概率,最后网络输出的深度由下面的公式给出,采样深度的概率加权和:
深度图优化
其实上面的过程以及可以生成深度图了,但是由于正则化过程中的大的感受野,导致了重建的边缘过于平滑,所以作者提出将RGB图中的语义信息融合进来,跟深度图 concat到一起输入一个残差网络,来保留边缘信息
近几年根据MVSNet引申出来了一系列的研究工作,如下图所示:
比较主流也是用的比较多的网络结构一般是基于金字塔的coarse-to-fine的结构,在这上面引申出来非常多的方法,近几年和无监督,半监督以及transformer相结合的方法也大放异彩,接下来我们会按照时间顺序来梳理最近几年流行的多目立体匹配算法
R-MVSNet
Recurrent MVSNet for High-resolution Multi-view Stereo Depth Inference (CVPR )
网络框架:
Pipeline和MVSNet是相似的,用平面扫描构建3D cost volume,只是在正则化的时候用RNN来将3D的cost volume序列化处理,用2D的卷积加上GNU(gated recurrent unit)来处理每一张cost map
主要贡献:
用RNN来处理3D cost volume到3D probability volume的正则化问题
用gated recurrent unit (GRU) 来序列化的处理3D cost volume
Scalability,用时间来换空间,理论上可以采样无穷多个深度,也因此能处理高分辨率的输入数据
分别在DTU,TnT以及ETH3D上面测试了性能
对于RNN 序列化处理3D cost volume的理解:
Winner-take-all:在深度方向上,对每一个像素取概率值最大的深度作为估计的深度值
Spatial Regularization:在cost map上面做2D卷积,感知域只在图片的空域上
Recurrent Regularization:沿着深度方向序列化感知,感知域是当前深度 到最小深度 这个区间,当处理完全部的cost map序列之后也能达到全局的感知域
3D CNN Regularization:全局感知
实验部分:
Scalability:深度采样和MVSNet不同的是使用了逆深度(inverse depth)采样,深度采样数目可以很大(DTU数据集是512,TnT是898),针对不同的数据集可以在测试的时候使用不同的深度采样数目,另一个体现Scalability的是,可以处理更高分辨率的数据
网络结构部分:2D CNNs + 3D CNNs/GRU(proposed)/Spatial/Winner-Take-All,基本是对比了几种不同的处理3D cost volume的方法
Post-processing后处理的消融实验
CVPMVSNet
CVPMVSNet:Cost Volume Pyramid Based Depth Inference for Multi-View Stereo (CVPR )
网络框架如上图所示:
在特征提取阶段首先构建图像特征金字塔,然后在最低分辨率(训练时长宽是原图的1/8)上用MVSNet提供的平面扫描方法,采样整个深度范围,估计一个低分辨率的深度图,然后上采样,在一个更小的深度范围内采样并且refine深度图,重复上采样并且refine的过程,直到输出一个原分辨率的深度图。MVSNet为了节省内存输出的深度图的分辨率低于原图,而使用这种方法可以输出一个和原图分辨率一致的深度图
主要贡献:
用cost volume pyramid结构由粗到细地估计深度图,网络更加轻量以及flexible,因为可以不用在固定的分辨率构建cost volume,训练的时候只需要训练两层金字塔,测试的时候理论上金字塔level可以任意大
减少了内存和运行的时间,在DTU上SOTA,在TnT上部分SOTA
这种由粗到细的结构,讨论的比较多的点是,如何确定上采样之后的深度搜索范围,这里CVPMSVNet提供了一种思路:
总结起来就是用对极几何的原理
左图中,对于Ref. view中的紫色像素点,有一个上采样之后初步的深度估计,而refine之时计算的深度采样范围,则由upper bound蓝色像素以及lower bound 红色像素之间的范围确定,在这个范围中再次使用平面扫描算法,就可以得到refine之后的深度,upper bound和lower bound由极线上相邻像素backproject到3D空间中得到
实验部分:
Report了DTU和TnT benchmark上面的结果
消融实验一:训练时不同金字塔层数越多,结果越差,当训练时只用两层金字塔的时候效果最好
消融实验二:沿着极线逆投影计算深度refine搜索范围的时候相邻1个或者0.5个像素的效果最好
CasMVSNet
Cascade Cost Volume for High-Resolution Multi-View Stereoand Stereo Matching (CVPR)
CasMVS的网络框架结构,如上图所示,和CVPMVSNet一样是coarse-to-fine的网络框架,在低分辨率上搜索整个深度范围,不同的是,CasMVSNet用一个固定的搜索范围,在上采样深度图的时候,按照比例来递减深度搜索的范围
主要贡献:
coarse-to-fine的MVS网络框架
分别report了多目立体匹配benchmark:DTU和TnT上的结果,以及双目立体匹配数据集:Scene Flow,KITTI 以及Middlebury 上的结果
实验部分:
每一层深度采样的数量(Cascade Stage Number),作者表示三层金字塔[96,48,48]
的采样数量性能最好
图像分辨率,使用上/下采样金字塔和用固定分辨率相比较,使用上/下采样金字塔更节省内存和运行时间,并且在使用fpn做特征提取之后性能有明显的提升
特征金字塔(Feature Pyramid)的有效性
参数共享/非共享正则化UNet,使用非参数共享UNet可以进一步提升性能
Self-supervised CVPMVSNet
Self-supervised Learning of Depth Inference for Multi-view Stereo (CVPR)
CVPMVSNet作者在第二年的续作,将self-supervised融入到了MVS框架中,训练过程中分为两个部分,分别是无监督初始化和自监督训练。
其中Unsupervised initialization部分,分别用深度平滑loss以及对图像合成loss来监督网络,深度预测分支和CVPMVSNet一致,只是在这里增加了另一个分支去合成reference view下的图像,再跟真实的reference输入图像做一个loss,根据单应性变换的原理,当深度估计越准确的时候,这个合成的图像应该和真实的reference图像越相近,也因此能作为深度估计网络的监督信号,下图是合成视角的pipeline,从源图像视角合成参考图像视角,只需要结合深度图做一个单应性变换
迭代self-training阶段,之所以要对网络做一个训练的初始化,是因为后面需要用到网络去生成一个伪深度标签,这里值得注意的是,CVPMVSNet网络结构中,上采样之后的深度搜索范围是根据邻域像素计算的,所以这是一个parameter-free的方法,不需要对每一层训练额外的参数来确定深度范围(所以理论上CVPMVSNet只需要训练两层金字塔结果,在eval的时候可以复制任意多的第二层网络进行refine,所以在self-training阶段,生成伪深度的时候才能用5层金字塔结构,而右边的自监督网络是两层,事实上两边是同一个网络),这一阶段,从高分辨率的伪深度图,生成3D的点云和网格,然后再渲染出一个新视角的深度图作为自监督训练的信号
主要贡献:
为mvs深度估计提供了一个自监督学习的框架,将前作的CVP-MVSNet作为backbone
设计了一种生成伪标签的方法,由2D的图像估计深度图和mesh,再由mesh渲染出新视角的图像和深度图,作为后续网络的监督信号,不断refine网络性能
report了DTU和TnT上的实验结果,性能低于有监督的框架
实验部分:
report了DTU和TnT上的结果,其中TnT上的结果是网络在DTU上训练,然后在TnT上直接测试得到的
消融实验一:基于概率的图像合成(Probability based image synthesis),实验证明这种方法优于直接从源图像(Src.)变换到参考相机视角
消融实验二:self-training中每一个模块的有效性
消融实验三:self-training训练的迭代次数
无纹理区域:文中方法生成的所有为标签都是基于几何关系的,所以生成的为标签在无纹理区域是不存在任何深度的,如下图所示
JDACS
Self-supervised Multi-view Stereo via Effective Co-Segmentation and Data-Augmentation (AAAI杰出论文)
之前的自监督方法,比如self-supervised CVPMVSNet,只使用了光度一致性(photometric consistency)作为约束,但其实光度一致性是完全基于图像的RGB值的,同一个场景当视角发生变化时,外部的光照条件也会发生变化,这时候单纯的用RGB值作为匹配的约束会存在不准确的情况,因此我们不能只考虑不同视角中颜色的对应,作者在这篇文章中引入了语义一致性和数据增强一致性约束,用三个分支协同处理深度图估计
主要贡献:
引入了语义一致性和数据增强一致性来监督MVS的深度图估计,用一个协同分割分支来辅助深度图的估计
report了DTU和TnT上的结果,在DTU上性能高于其他的自监督方法,并且已经接近于有监督方法的性能,在TnT数据集上的测试验证了方法的有效性
实验部分:
在MVSNet网络(文中的JDACS )以及multi-stage的方法CVPMVSNet(文中的JDACS-MS)上面都验证了提出的无监督方法的有效性,在不需要外部监督信号的情况下得到了接近有监督方法的性能
消融实验一:用三个分支的不同组合来验证每个分支的有效性,这一组实验分别report了JDACS和JDACS-MS上的实验结果
消融实验二:语义簇数量的影响,区别于有监督方法中人工标注的语义标签,自监督框架下的语义概念是模糊的,所以语义分支中语义簇聚类的数量k,是一个重要的超参数,作者还在这部分做了可视化
RC-MVSNet
RC-MVSNet: Unsupervised Multi-View Stereowith Neural Rendering [ECCV]
同样是一个自监督的框架,并且也是为了解决光度一致性约束在计算匹配关系的时候由于光照条件变化,反射以及遮挡等带来的误差,RC-MVSNet分别提出了depth rendering consistency loss和reference view synthesis loss来生成一个连续的监督信号。Self-supervised CVPMVSNet是先从深度估计网络生成一个场景的3D表示(mesh),然后再从3D场景中投影得到新视角下的深度图作为监督,RC-MVSNet也生成了一个3D场景表达,不过作者使用的是隐式神经表面来表达3D场景,再通过神经体积渲染(neural volumetric rendering)的方式来合成新视角的图像
如上图所示:左边是DTU数据集的可视化,由于光照等条件不一样,同一个物体的同一个区域,在不同的视角中的颜色不一样,在这时候就不满足光度一致性假设,除此之外,还会有遮挡和可见性的问题(左图右);右图是作者提出的渲染一致性,生成的深度图更平滑
主要贡献:
提出了一种基于神经体积渲染的参考视角合成损失(reference view synthesis loss)来合成RGB监督信号,消除了由视角不一致带来的光度损失误差,将光度一致性变成了渲染一致性
提出了一种采样方法(Gaussian-Uniform mixture sampling)沿着光线采样积分,以学习物体表面的几何纹理,并且可以解决以往的自监督方法中存在的遮挡问题
提出了深度渲染一致性损失(Depth rendering consistency loss),保证在深度估计过程中各个视角中深度的连续性
实验:
Report了DTU和TnT上的结果,在DTU上的结果已经超过了JDACS-MS,性能上甚至高于某些有监督的方法
消融实验:对网络中的每一部分loss都做了消融实验来验证有效性,分别report了DTU数据集上的定性和定量的结果
MVSTER
MVSTER: Epipolar Transformer for EfficientMulti-View Stereo [ECCV]
是一个基于transformer的端到端的网络结构,提出了一个新颖的Epipolar Transformer结构,可以沿着极线寻找不同视角之间像素的匹配关系,同时MVSTER还使用了一个四层的金字塔结构由粗到细的构建高分辨率深度图
主要贡献:
提出了一个新颖的基于transformer的端到端神经网络,其中网络的核心部分是作者提出的 Epipolar Transformer,这种方法可以沿着极线查找像素对应的几何关系
使用了一个辅助的单目网络,为深度估计引入了语义信息
将深度估计形式化为了一个分类问题,用熵正则化最优传输理论来解决这个问题,具体来说提出用Wasserstein distance来衡量估计出来的深度分布 和gt的深度分布 之间的区别,作者提出这种方法有利于在金字塔结构的cascade stage中产生更好的深度传播(estimations propagated)
在多个数据集上验证了方法的有效性:DTU,TnT,BlendedMVS以及ETH3D等
[注2]: 金字塔结构即前文中提到的coarse-to-fine结构,在上采样的过程中,用双线性插值会出现深度值的传播,关于深度传播depth propagated,可以参考文章:FastMVSNet [CVPR]
如下图所示是文章中提出来的Epipolar Transformer结构,前文中简述了对极几何的原理,在找参考视角下的某个像素 的匹配时,我们只需要沿着极线去查找即可,因为与 对应的像素一定满足对极几何的约束,基于这个假设,作者将参考图像中的像素作为query,用cross attention计算像素之间的相似度,然后再根据attention值来聚合源图像的信息。([注3]:MVSNet中是用统计学的方差(variance)来聚合邻域信息的)
上图中是一个像素在两个source view中极线上的对应像素
实验部分:
分别report了在DTU,TnT以及ETH3D上定量的结果
消融实验一:Epipolar Transformer (ET) 的有效性,作者对比了三种不同的聚合邻域视角的方法,分别是MVSNet所用的基于方差(variance-based)的方法,基于CNN的方法,以及本文提出的基于Epipolar Transformer 的方法,variance-based的方法在深度采样数量少的情况下表现很差(样本数量少统计学性质当然就不准确了),CNN-based的方法性能比variance-based的方法更好,更稳定,但是计算量比Epipolar Transformer更大,因为Epipolar Transformer只需要query极线上的像素就可以了
消融实验二:Monocular Depth Estimator (MDE),单目模块为网络带来了更多的语义信息,消融实验证明了这个模块的有效性
消融实验三:Optimal Transport in Depth Propagation (OT),对比了文中使用的Wasserstein loss和MVS网络中常规使用的L1 loss和交叉熵损失,验证了Wasserstein loss的有效性
立体匹配在3D检测中的应用
从上文的介绍中可以看出,立体匹配可以通过查找相邻视角中的匹配关系,再通过相机的内外参矩阵,计算出像素点在当前视角下的深度,但是根据原理,只有当两张图像的光线有交点的时候(即3D世界中的同一个点同时在两个视角内都出现的时候)才能匹配上,目前自动驾驶中的数据集 Kitti 3D提供双目数据,因此可以通过双目立体匹配来计算密集的深度,对应的方法有Liga-stereo, DSGN等,对于视角重合较少的数据集,如nuscenes,Waymo等,相邻的相机重合区域较少,因此不能通过立体匹配的方式来重建出整张图片的深度,但取而代之可以用相邻帧来做匹配,如最近出现的方法BevStereo
[注4]: LIGA-Stereo: Learning LiDAR Geometry Aware Representations for Stereo-based 3D Detector
[注5]: DSGN: Deep Stereo Geometry Network for 3D Object Detection
[注6]: BEVStereo: Enhancing Depth Estimation in Multi-view 3D Object Detection with Dynamic Temporal Stereo
【自动驾驶之心】全栈技术交流群
自动驾驶之心是首个自动驾驶开发者社区,聚焦目标检测、语义分割、全景分割、实例分割、关键点检测、车道线、目标跟踪、3D目标检测、多传感器融合、SLAM、光流估计、轨迹预测、高精地图、规划控制、AI模型部署落地等方向;
加入我们:自动驾驶之心技术交流群汇总!
自动驾驶之心【知识星球】
想要了解更多自动驾驶感知(分类、检测、分割、关键点、车道线、3D目标检测、多传感器融合、目标跟踪、光流估计、轨迹预测)、自动驾驶定位建图(SLAM、高精地图)、自动驾驶规划控制、领域技术方案、AI模型部署落地实战、行业动态、岗位发布,欢迎扫描下方二维码,加入自动驾驶之心知识星球(三天内无条件退款),日常分享论文+代码,这里汇聚行业和学术界大佬,前沿技术方向尽在掌握中,期待交流!