最经典的计算机视觉问题是3-D重建。基本上可以分成两种路径:一是多视角重建,二是运动重建。前者有一个经典的方法是多视角立体视觉(MVS,multiple view stereo),就是多帧的立体匹配,这样采用CNN模型来解决也合理。传统MVS的方法可以分成两种:区域增长(region growing)和深度融合(depth-fusion)。当年CMU在美国超级碗(Superbowl)比赛展示的三维重建和视角转化,轰动一时,就是基于此路径,但最终没有被产品化(技术已经转让了)。

后者在机器人领域成为同步定位和制图(SLAM)技术,有滤波法和关键帧法两种,后者精度高,在稀疏特征点的基础上可以采用集束调整(BA,Bundle Adjustment),著名的方法如PTAM,ORB-SLAM1/2,LSD-SLAM,KinectFusion(RGB-D数据),LOAM/Velodyne SLAM(激光雷达数据)等。运动恢复结构(SFM)是基于背景不动的前提,计算机视觉的同行喜欢SFM这个术语,而机器人的同行称之为SLAM。SLAM比较看重工程化的解决方案,SFM理论上贡献大。

另外,视觉里程计(VO)是SLAM的一部分,其实只是估计自身运动和姿态变化。VO是David Nister创立的概念,之前以两帧图像计算Essential Matrix的“5点算法”而为人所知。

因为CNN已经在特征匹配、运动估计和立体匹配得到应用,这样在SLAM/SFM/VO/MVS的应用探索也就成了必然。

DeepVO

如图所示,经典VO流水线通常包括摄像机标定、特征检测、特征匹配(或跟踪)、异常值拒绝(例如RANSAC)、运动估计、尺度估计和局部优化(集束调整,BA)。



计算机视觉三维重建Python 计算机视觉三维重建cad_人工智能

DeepVO基于深度递归卷积神经网络(RCNN)提出了一种端到端单目视觉里程计(VO)框架。由于以端到端的方式进行训练和部署,因此它直接从一系列原始RGB图像(视频)中推断出姿态,而不采用传统VO流水线中的任何模块。基于RCNN,它不仅通过CNN自动学习VO问题的有效特征表示,而且用深度递归神经网络隐式地建模串联动力学和关系。

如图所示是这个端到端VO系统的架构图:采用视频片段或单目图像序列作为输入;在每个时间步,作为RGB图像帧预处理,减去训练集的平均RGB值,可以将图像尺寸调整为64的倍数;将两个连续图像堆叠在一起以形成深RCNN的张量,学习如何提取运动信息和估计姿势。具体地,图像张量被馈送到CNN以产生单目VO的有效特征,然后通过RNN进行串行学习。每个图像对在网络的每个时间步产生姿势估计。VO系统随时间推移而发展,并在图像获取时估计新的姿势。



计算机视觉三维重建Python 计算机视觉三维重建cad_计算机视觉_02

CNN具有9个卷积层,每层之后是除Conv6之外的ReLU激活,总共17层。网络中感受野的大小逐渐从7×7减少到5×5,然后逐渐减少到3×3,以捕捉小的有趣特征。引入零填充以适应感受野的配置或在卷积之后保持张量的空间维度。其中通道的数量,即用于特征检测的滤波器的数量,会增加以学习各种特征。

通过堆叠两个LSTM层来构造深度RNN,其中LSTM的隐藏状态是另一个的输入。在DeepVO网络中,每个LSTM层具有1000个隐藏状态。深度RNN基于从CNN生成的视觉特征在每个时间步输出姿势估计。随着相机移动并获取图像,这个进程随时间而继续。

UnDeepVO

UnDeepVO能够通过使用深度神经网络估计单目相机的6-DoF姿势及其视野的深度。有两个显着特征:一个是无监督深度学习方案,另一个是绝对的深度恢复。训练UnDeepVO时,通过使用立体图像对恢复尺度来,但测试时,使用连续的单眼图像。UnDeepVO还是一个单目系统。网络训练的损失函数基于时空密集信息,如图所示。



计算机视觉三维重建Python 计算机视觉三维重建cad_计算机视觉三维重建Python_03

下图所示时UnDeepVO的架构图。姿势估计器是基于VGG的CNN架构,需要两个连续的单目图像作为输入,并预测它们之间的6-自由度(DoF)变换矩阵。由于旋转(由欧拉角表示)具有高度非线性,与平移相比通常难以训练。对于有监督的训练,一种流行的解决方案是将旋转估计损失给予更大的权重,如同归一化。为了更好地无监督学习训练旋转预测,在最后一个卷积层之后用两组独立的全连接层将平移和旋转分离。这样为获得更好的性能,引入一个权重标准化的旋转预测和平移预测。深度估计器主要基于编码器-解码器架构以生成致密深度图。与其他方法不同的是, UnDeepVO直接预测深度图,这是因为以这种方式训练时整个系统更容易收敛。



计算机视觉三维重建Python 计算机视觉三维重建cad_计算机视觉_04

如图所示,用立体图像序列的时空几何一致性来定义损失函数。空间几何一致性表示左右图像对中的对应点之间的外极线约束,而时间几何一致性表示两个连续单目图像中的对应点之间的几何投影约束。这些约束构造最后的损失函数并使其最小化,而UnDeepVO学习端对端无监督方式估计尺度化的6-DoF姿势和深度图。简单提一下,空间损失函数包括光度一致性损失(Photometric Consistency Loss)、视差一致性损失(Disparity Consistency Loss)和姿态一致性损失(Pose Consistency Loss);时间损失函数包括光度一致性损失和3-D几何校准损失(3D Geometric Registration Loss)。



计算机视觉三维重建Python 计算机视觉三维重建cad_计算机视觉_05

VINet

如图是比较传统VIO(visual-inertial odometry)和基于深度学习的VINet方法。VINet时一种使用视觉和惯性传感器进行运动估计的流形(on-manifold)序列到序列的学习方法。其优点在于:消除相机和IMU之间繁琐的手动同步,无需手动校准;模型自然地结合特定领域信息,显著地减轻漂移。



计算机视觉三维重建Python 计算机视觉三维重建cad_计算机视觉三维重建Python_06

VINet的架构图见下图所示。该模型包括CNN-RNN网络,为VIO任务量身定制。整个网络是可微分的,可以进行端到端训练实现运动估计。网络的输入是单目RGB图像和IMU数据,即一个6维向量,包含陀螺仪测量的加速度和角速度的x,y,z分量。网络输出是7维向量 - 3维平移和4维四元数(quaternion)- 姿势变化。从本质上讲,它学习将图像和IMU数据的输入序列转换为姿势的映射。



计算机视觉三维重建Python 计算机视觉三维重建cad_计算机视觉_07

CNN-RNN网络执行从输入数据到李代数se(3)的映射。指数图将它们转换为特殊的欧几里德群SE(3),然后可以在SE(3)中组成各个运动以形成轨迹。这样,网络需要近似的功能仍然随着时间的推移保持受限,因为相机帧到帧的运动是由平台在轨迹过程中复杂动力学定义的。借助RNN模型,网络可以学习平台的复杂运动动力学,并考虑到那些难以手工建模的序列依赖性。下图是其中SE(3) 级联层(composition layer)的示意图:无参数层,主要连接SE(3)群上帧之间的变换。



计算机视觉三维重建Python 计算机视觉三维重建cad_神经网络_08

在LSTM模型中,隐藏状态被转移到下一个时间步,但输出本身不会反馈到输入。在里程计情况下,先前状态的可用性特别重要,因为输出基本上是每步增量位移的累积。因此,直接连接SE(3)级联层产生的姿态输出,作为下个时间步核心LSTM的输入。

SfM-Net

SfM-Net是一种用于视频运动估计几何觉察的神经网络,根据场景、目标深度、相机运动、3D目标旋转和平移等来分解帧像素运动。给定一图像帧序列,SfM-Net预测深度、分割、相机和刚体运动,并转换为密集的帧到帧运动场(光流),可以及时地对帧进行差分变形以匹配像素和反向传播。该模型可以通过不同程度的监督进行训练:1)通过重投影光度误差(完全无监督)自我监督训练,2)自身运动(摄像机运动)监督训练,或3)由深度图(例如,RGBD传感器)监督训练。

下图是SfM-Net的流程图。给定一对图像帧作为输入,模型将帧到帧像素运动分解为3D场景深度、3D摄像机旋转和平移、一组运动掩码和相应的3D刚性旋转和平移运动。然后,将得到的3D场景流反投影到2D光流中并相应地变形完成从这帧到下一帧的匹配像素。其中前向一致性检查会约束估计的深度值。



计算机视觉三维重建Python 计算机视觉三维重建cad_机器学习_09

如下图是SfM-Net的架构图:对于每对连续帧It,It+1,一个conv / deconv子网络能预测深度dt,而另一个conv / deconv子网络预测一组K个分割掩码mt;运动掩码编码器的最粗特征图通过全连接层进一步解码,输出摄像机和K个分割的3D旋转和平移;使用估计的或已知的相机内参数将预测的深度转换为每帧点云;然后,根据预测的3D场景流(scene flow)对其进行变换,由3D摄像机运动和独立的3D掩码运动组成;将变换后的3D深度再投射回2D的下一图像帧,从而提供相应的2D光流场;可差分后向变形映射将图像帧It+1到It,并且梯度可基于像素误差来计算;对逆图像帧对It+1,It重复该过程来强加“前向-后向约束”,并且通过估计的场景运动约束深度dt和dt+1保持一致性。



计算机视觉三维重建Python 计算机视觉三维重建cad_计算机视觉三维重建Python_10

如图是一些SfM-Net结果例子。在KITTI 2015,基础事实的分割和光流与SfM-Net预测的运动掩码和光流相比。模型以完全无监督的方式进行训练。



计算机视觉三维重建Python 计算机视觉三维重建cad_计算机视觉_11

CNN-SLAM

借助于CNN的深度图预测方法,CNN-SLAM可以用于精确和密集的单目图像重建。CNN预测的致密深度图和单目SLAM直接获得的深度结果融合在一起。在单目SLAM接近失败的图像位置例如低纹理区域,其融合方案对深度预测赋予特权,反之亦然。深度预测可以估计重建的绝对尺度,克服单目SLAM的一个主要局限。最后,从单帧获得的语义标签和致密SLAM融合,可得到语义连贯的单视图场景重建结果。

如图是CNN-SLAM的架构图。CNN-SLAM采用基于关键帧的SLAM范例,特别是直接半致密(direct semi-dense)法作为基准。这种方法将不同视觉帧收集作为关键帧,其姿态经过基于姿态图(pose-graph)的优化方法全局修正。同时,通过帧与其最近的关键帧之间的变换估计,实现每个输入帧的姿态估计。



计算机视觉三维重建Python 计算机视觉三维重建cad_计算机视觉三维重建Python_12

下面是一些结果:办公室场景(左)和NYU Depth V2数据集的两个厨房场景(中,右),第一行是重建,第二行是语义标签。



计算机视觉三维重建Python 计算机视觉三维重建cad_计算机视觉_13

 PoseNet

PoseNet是一个实时单目6 DOF重定位系统。它训练CNN模型以端映端方式从RGB图像回归6-DOF相机姿态,无需额外的工程或图形优化。该算法可以在室内和室外实时运行,每帧5ms。通过一个有效的23层深度卷积网络,PoseNet实现图像平面的回归,对于那些照明差、运动模糊并具有不同内参数的摄像头(其中SIFT校准失败)场景算法鲁棒。产生的姿势特征可推广到其他场景,仅用几十个训练样例就可以回归姿态参数。

PoseNet使用GoogLeNet作为姿态回归网络的基础;用仿射回归器替换所有3个softmax分类器;移除softmax层,并修改每个最终全联接层输出表示3-D位置(3)和朝向四元数(4)的7维姿态向量;在特征大小为2048的最终回归器之前插入另一个全联接层;在测试时,将四元数朝向矢量单位归一化。

如图是PoseNet的结果展示。绿色是训练示例,蓝色是测试示例和红色显示姿势预测。



计算机视觉三维重建Python 计算机视觉三维重建cad_神经网络_14

需要补充一下,姿势回归采用以下目标损失函数的随机梯度下降来训练:



计算机视觉三维重建Python 计算机视觉三维重建cad_人工智能_15

其中x是位置向量,q是四元数向量,β是选择的比例因子,以保持位置和朝向误差的预期值近似相等。

 VidLoc

VidLoc是一种用于视频片段6-DoF定位的递归卷积模型。即使仅考虑短序列(20帧),它也可以平滑姿态的估计并且可以大大减少定位误差。

如图是VidLoc的架构模型。CNN部分的目标是从输入图像中提取相关的特征,这些特征可用于预测图像的全局姿态。CNN由堆叠的卷积和池化层构成,对输入图像操作。这里主要处理时间顺序的多个图像,采用VidLoc CNN的GoogleNet架构,其实只使用GoogleNet的卷积层和池化层,并删除所有全连接层。



计算机视觉三维重建Python 计算机视觉三维重建cad_计算机视觉_16

当输入连续时间的图像流时,利用时间规律性可以获得大量的姿态信息。例如,相邻图像通常包含相同目标的视图,这可以提高特定位置的置信度,并且帧之间的运动也存在严格约束。为捕获这些动态相关性,在网络中使用LSTM模型。LSTM扩展了标准RNN,能够学习长期时间依赖性,是通过遗忘门、输入和输出复位门以及存储器单元来实现的。进出存储器单元的信息流由遗忘门和输入门调节,这允许网络在训练期间克服梯度消失问题,能够学习长期的相关性。LSTM输入是CNN输出,由一系列特征向量xt组成。LSTM将输入序列映射到输出序列,输出序列参数化为7维向量的全局姿态组成yt,包括平移向量和朝向四元数。为充分利用时间连续性,这里LSTM模型采用双向结构,如图所示。



计算机视觉三维重建Python 计算机视觉三维重建cad_机器学习_17

为了模拟姿态估计的不确定性,采用混合密度网络(mixture density networks)方法。这种方法用混合模型取代了高斯模型,可以对多模态后验输出分布建模。

NetVLAD

大规模基于视觉的位置识别问题要求快速准确地识别给定查询照片的位置。NetVLAD是一种CNN架构中的一层,帮助整个架构直接以端到端的方式用于位置识别。其主要组成部分是一个通用“局部聚合描述子向量”(VLAD,Vector of Locally Aggregated Descriptors)层,受到图像检索中特征描述子池化法VLAD的启发。该层可以很容易地插入任何CNN架构中,并且可以通过反向传播(BP)进行训练。根据一个定义的弱监督排名损失(ranking loss)可以训练从谷歌街景时间机(Google Street View Time Machine)下载的相同位置的图像,以端到端的方式学习该架构参数。

如图是带NetVLAD层的CNN结构。该层用标准CNN层(卷积,softmax,L2归一化)和一个易于实现的聚合层NetVLAD来实现“VLAD核”聚合,可在有向无环图(DCG)中连接。



计算机视觉三维重建Python 计算机视觉三维重建cad_人工智能_18

给定N个D-维局部图像特征描述符{xi}作为输入,将K个聚类中心(“视觉词”){ck}作为VLAD参数,输出VLAD图像表示V是K×D维矩阵。该矩阵可转换为矢量,归一化后可作为图像表示。V的(j,k)元素计算如下:



计算机视觉三维重建Python 计算机视觉三维重建cad_计算机视觉_19

其中xi(j)和ck(j)分别是第i个特征描述符和第k个聚类中心的第j维。ak(xi)将描述符xi的成员资格记录为第k个视觉单词,即如果集群ck是最接近解释xi的集群则为1,否则为0。

VLAD的不连续性源来自描述符xi到聚类中心ck的硬分布ak(xi)。为了使之可微分,将其替换为描述子的多个聚类软分配,即



计算机视觉三维重建Python 计算机视觉三维重建cad_计算机视觉_20

将上式的平方项展开,很容易看出exp()项在分子和分母之间消掉,导致如下软分配



计算机视觉三维重建Python 计算机视觉三维重建cad_人工智能_21

其中向量wk和标量bk



计算机视觉三维重建Python 计算机视觉三维重建cad_神经网络_22

计算机视觉三维重建Python 计算机视觉三维重建cad_机器学习_23

这样最终的“VLAD核”聚合公式变成



计算机视觉三维重建Python 计算机视觉三维重建cad_神经网络_24

其中{wk},{bk}和{ck}是每个群集k的可训练参数集。

在VLAD编码,来自不同图像但划归同一聚类的两个特征描述子对两个图像之间相似性测度的贡献是残差向量之间的标量积,其中残差向量是描述符与聚类锚点(anchor point)之间的差。锚点ck可以被解释为特定聚类k的新坐标系原点。在标准VLAD中,锚点被选为聚类中心(×),以便数据库中的残差均匀分布。然而如图所示,在监督学习设置中,来自不匹配图像的两个描述子可以学习更好的锚点,使新残差向量之间的标量积很小。

Learned Stereo Machine

伯克利分校提出的一个用于多视角立体视觉的深度学习系统,即学习立体视觉机(LSM)。与最近其他一些基于学习的3D重建方法相比,沿着观察光线做特征投影和反投影,它利用了问题的基础3D几何关系。通过可微分地定义这些操作,能够端到端地学习用于量度3D重建任务的系统。这种端到端学习能够在符合几何约束的同时共同推理形状的先验知识,能够比传统方法需要更少的图像(甚至单个图像)进行重建以及完成看不见的表面。

如图是LSM概述:一个或多个视图和摄像头姿态作为输入;通过特征编码器处理图像,然后使用可微分的反投影操作将其投影到3D世界坐标系中。



计算机视觉三维重建Python 计算机视觉三维重建cad_人工智能_25

如图给出1D图和2D网格之间的投影和反投影示意图。(a)投影操作沿光线以等间隔z值采样值到1D图像中。在z平面的采样特征堆叠成通道形成投影的特征图。(b)反投影操作从特征图(1-D)中获取特征,并沿光线放置在相应与之相交的网格块。



计算机视觉三维重建Python 计算机视觉三维重建cad_机器学习_26

然后,以递归方式匹配这些网格G以产生融合网格Gp,这里采用的是门控递归单元(GRU)模型。接着,通过3D CNN将其转换为Go。最后,LSM可以产生两种输出 - 从Go解码的体素占有网格(体素 LSM)或在投影操作之后解码的每视角的深度图(深度LSM)。

下图给出V-LSM的一些结果,



计算机视觉三维重建Python 计算机视觉三维重建cad_机器学习_27

计算机视觉三维重建Python 计算机视觉三维重建cad_神经网络_28

如图给出D-LSM的一些例子。



计算机视觉三维重建Python 计算机视觉三维重建cad_人工智能_29

 DeepMVS

DeepMVS是一种用于多视角立体视觉(MVS)重建的深度卷积神经网络(ConvNet)。将任意数量各种姿态的图像作为输入,首先产生一组平面扫描体积(plane-sweep volumes),并使用DeepMVS网络来预测高质量的视差图。其关键特点是(1)在照片级真实感的合成数据集上进行预训练;(2)在一组无序图像上聚合信息的有效方法;(3)在预训练的VGG-19网络集成多层特征激活函数。使用ETH3D基准验证了DeepMVS的功效。

算法流程分四步。首先,预处理输入图像序列,然后生成平面扫描容积(plane-sweep volumes)。接着,网络估计平面扫描容积的视差图,最后细化结果。如图所示。



计算机视觉三维重建Python 计算机视觉三维重建cad_计算机视觉三维重建Python_30

下面两个图分别显示带超参数的DeepMVS体系结构。整个网络分三部分:1)补丁匹配(patch matching)网络,2)容积内特征聚合(intra volume feature aggregation)网络,3)容积之间特征聚合(inter volume feature aggregation)网络。除了最后一层,网络中所有卷积层都跟着一个可缩放指数线性单元(Scaled Exponential Linear Unit ,SELU)层。



计算机视觉三维重建Python 计算机视觉三维重建cad_机器学习_31

计算机视觉三维重建Python 计算机视觉三维重建cad_神经网络_32

为了进一步改进性能,将全连通条件随机场(DenseCRF)应用到视差预测结果。

MVSNet

给定参考图像I1和一组其相邻图像{Ii} Ni = 2,MVSNet提出了一种端到端深度神经网络来推断参考深度图D。在其网络中,首先通过2D网络从输入图像中提取深度图像特征{ Fi} Ni = 1。然后,通过可微分的单应性(Homography)变换将2D图像特征变形到参考相机坐标系,这样在3D空间中构建特征容积{Vi} Ni = 1。为了处理任意N视角图像输入,基于方差的成本测度将N个特征容积映射到一个成本容积C。与其他立体视觉和MVS算法类似,MVSNet使用多尺度3D CNN正则化成本容积,并通过软argmin 操作回归参考深度图D。在MVSNet末端应用一个细化网络进一步增强预测深度图的性能。由于在特征提取期间缩小了深度图像特征{Fi} Ni = 1,因此输出深度图大小是每个维度中原始图像大小的1/4。

MVSNet在DTU数据集以及Tanks and Temples数据集的中间集展示了最先进的性能,其中包含具有“从外看里”的摄像头轨迹和小深度范围的场景。但是,用16 GB内存 Tesla P100 GPU卡,MVSNet只能处理H×W×D = 1600×1184×256的最大重建尺度,并且会在较大的场景中失败,即Tanks and Temples的高级集合。

如图是MVSNet网络设计图。输入图像通过2D特征提取网络和可微分单应性变形生成成本容积。从正则化的概率容积回归最终的深度图输出,并且用参考图像细化。



计算机视觉三维重建Python 计算机视觉三维重建cad_人工智能_33

下图是推断的深度图、概率分布和概率图。(a)DTU数据集的一个参考图像; (b)推断的深度图; (c)内点像素(顶部)和出格点像素(底部)的概率分布,其中x轴是深度假设索引,y轴是概率,红色线是软argmin结果; (d)概率图。



计算机视觉三维重建Python 计算机视觉三维重建cad_计算机视觉三维重建Python_34

•Recurrent MVSNet

MVS方法的一个主要限制是可扩展性:耗费内存的成本容积(cost volume)正则化使得学习的MVS难以应用于高分辨率场景。Recurrent MVSNet是一种基于递归神经网络的可扩展多视角立体视觉框架。递归多视角立体视觉网络(R-MVSNet)不是一次性正则化整个3-D成本容积,而是通过门控递归单元(GRU)网络串行地沿深度值方向正则化2-D成本图。这大大减少了内存消耗,并使高分辨率重建成为可能。

下图比较了不同正则化方案的策略。一次性全局正则化成本容积C的替代方案是串行地沿深度方向处理成本容积。最简单的顺序方法是赢家通吃(WTA)的平面扫描(plane sweeping)立体视觉法,它粗略地用较好的值替换逐像素深度值,因此受到噪声的影响(如图(a))。为此,成本聚合法过滤不同深度的匹配成本容积C(d)(如图(b)),以便收集每个成本估算的空间上下文信息。遵循串行处理的思想,这里采用一种基于卷积GRU的更强大的递归正则化方案。该方法能够在深度方向上收集空间和单向上下文信息(如图(c)),与全空间3D CNN(如图(d))相比,这实现了差不多的正则化结果,但是 运行时内存更加有效。



计算机视觉三维重建Python 计算机视觉三维重建cad_计算机视觉三维重建Python_35

计算机视觉三维重建Python 计算机视觉三维重建cad_计算机视觉三维重建Python_36

下图是R-MVSNet的框图介绍。从输入图像中提取深度图像特征,然后将其变形到参考相机坐标系的前向平行平面。在不同深度处计算成本图并由卷积GRU串行地正则化处理。网络被训练为具有交叉熵(cross-entropy)损失的分类问题。



计算机视觉三维重建Python 计算机视觉三维重建cad_计算机视觉_37

如图是R-MVSNet的重建流水线直观图:(a)DTU图像;(b)来自网络的初始深度图;(c)最终深度图估计;(d)基础事实深度图;(e)输出点云;(f)深度图滤波的概率估计图;(g)初始深度图的梯度图;(h)细化后的梯度图。



计算机视觉三维重建Python 计算机视觉三维重建cad_神经网络_38