慕尼黑工业大学多视角几何笔记-全-

慕尼黑工业大学多视角几何笔记(全)

001:引言 👁️

在本节课中,我们将要学习多视角几何(或称3D计算机视觉)领域的基本概念、重要性及其广泛应用。我们将从计算机视觉在人工智能中的核心地位讲起,探讨如何从二维图像中恢复三维世界,并了解该领域的历史发展与前沿技术。

计算机视觉的重要性 🧠

上一节我们介绍了课程主题,本节中我们来看看为什么计算机视觉如此重要。人工智能的目标之一是复现人类的智能。研究表明,人类大脑皮层约有一半的容量用于处理视觉信息。这说明了两个问题:第一,视觉对人类理解世界至关重要;第二,视觉处理是一个极其困难的问题,否则大脑不会分配如此多的资源。

与下棋等任务相比,通过摄像头理解世界要复杂得多。这对于自动驾驶、人形机器人等需要与现实三维世界交互的自主系统来说,是核心挑战。

三维重建的应用 🚗

以下是三维重建的几个关键应用领域:

  • 自动驾驶:核心挑战并非车辆的操控,而是理解并预测周围环境。人类驾驶员可以基于经验(例如,球滚到街上预示着可能有小孩追出来)进行预判,而当前的自动驾驶系统缺乏这种对世界的深刻理解和预测能力。
  • 交通行为建模:通过无人机采集数据,可以创建厘米级精度的三维环境地图,并追踪车辆、自行车和行人的运动轨迹。这些数据可用于生成模拟人类驾驶行为的生成模型,为自动驾驶系统提供宝贵的“经验”。
  • 文化遗产数字化:对于已被毁坏的历史遗迹(如巴米扬大佛),可以利用大量历史游客照片进行三维重建,实现数字复原。
  • 自由视点视频与3D摄影:通过多相机阵列捕捉动作,可以重建出带纹理的三维动态场景。观众可以从任意角度观看,获得沉浸式体验。同样技术也可用于扫描人物,创建逼真的3D模型。

三维重建的核心挑战与范式 🔄

从图像进行三维重建的基本范式是:我们从一个移动的视角观察世界,获得一系列二维图像,但我们的目标是恢复出世界的三维模型。

这个问题可以从不同学科角度理解:

  • 应用数学家会将其视为一个无限维优化问题。我们可以将初始猜测(如一个球体)表面上的每个点沿法线方向扰动,由于点有无穷多个,因此有无限个自由度。
  • 计算机科学家则倾向于离散化视图,将世界划分为大量体素。对于每个体素,只需判断它是物体还是背景。对于一个由512x512x512个体素构成的空间,可能的配置数量高达 \(2^{512^3}\),这约等于一个1后面跟着4000万个零的数字,无法通过穷举搜索解决。

因此,三维重建是一个巨大的计算挑战。

重建原理:从对应关系到颜色一致性 📐

从图像恢复三维结构,传统方法依赖于解决“对应关系估计”问题。理想情况下,如果我们知道相机的位置(运动)以及两幅图像中哪些点彼此对应(如雕像的左眼),就可以通过三角测量法计算出该点的三维位置。

但实际情况是,我们既不知道相机运动,也不知道点之间的对应关系。这形成了一个“先有鸡还是先有蛋”的问题,传统上称为运动恢复结构同时定位与地图构建

一种更直接的思路是颜色一致性。假设我们已知相机位置,对于一个三维空间中的点(如一个体素),我们将其投影到所有图像中。如果该点位于物体表面,那么在所有图像中看到的颜色应该是一致的;如果该点在物体内部或外部,颜色则可能不一致。

我们可以定义一个光度一致性函数 \(\rho\),对于表面上的点赋予小值,对于不一致的点赋予大值。三维重建的目标就是找到一个表面 \(S\),使得沿该表面积分的光度一致性损失最小:

\[\min_S \int_S \rho(x) \, dS \]

然而,这个优化问题是非凸的,存在许多局部极小值,求解困难。

技术演进:从稀疏到直接法 🛠️

上一节我们介绍了重建的基本原理,本节中我们来看看技术的演进。

  • 经典方法(运动恢复结构/SLAM):其流程通常包括:提取图像中的特征点(如角点)、在不同图像间匹配这些特征点(建立对应关系)、利用这些匹配点(如至少5对)来求解相机运动和三维点位置。这类方法被称为基于特征点的方法间接法
  • 直接法:为了克服间接法在特征提取和匹配步骤中可能引入的误差,直接法应运而生。它不依赖特征点,而是直接利用图像像素的亮度(颜色)信息。其核心思想是:寻找一个三维场景模型和相机运动轨迹,使得将一幅图像的像素投影到三维场景再重投影到另一幅图像时,它们的颜色差异最小。这样,它在一个步骤中同时解决了重建和对应关系问题,通常能获得更高的精度和鲁棒性。

慕尼黑工业大学在该领域历史悠久,早在20世纪初,像E. Krüger这样的先驱者就奠定了多视角几何的数学基础。近年来,诸如LSD-SLAMDSO 等直接法SLAM系统实现了仅用单目摄像头在复杂环境中实时、高精度的定位与地图构建。

融合与前沿:多传感器与深度学习 🤖

将视觉与其它传感器融合可以进一步提升性能:

  • 双目视觉:使用两个摄像头提供尺度信息,能实现几乎无漂移的大规模场景重建。
  • 视觉-惯性里程计:结合摄像头和惯性测量单元(IMU),类似人类的视觉-前庭系统,能在快速运动、弱纹理等挑战性场景下实现稳定跟踪。
  • 深度学习辅助:利用深度神经网络从单张图像预测深度信息,然后将预测的深度融入SLAM系统。这种方法仅需单目摄像头就能获得具有真实尺度的、稠密的三维重建,展示了在未来自动驾驶中取代昂贵激光雷达的潜力。

总结 📝

本节课我们一起学习了多视角几何(3D计算机视觉)的广阔图景。我们了解了视觉智能在AI中的核心地位,探讨了从二维图像恢复三维世界这一根本挑战及其在自动驾驶、数字化等领域的应用。我们回顾了从基于特征点的传统方法到基于颜色一致性的直接法的技术演进,并看到了与惯性传感、深度学习融合的前沿进展。这门课程将深入探讨实现这些技术背后的数学原理和算法细节。

002:数学背景 - 线性代数(第一部分)📐

在本节课中,我们将学习多视角几何课程所需的数学基础,重点是线性代数。线性代数是理解3D计算机视觉和许多其他科学领域的核心工具。我们将从向量空间的基本概念开始,逐步深入到线性变换和矩阵群。

概述

线性代数为我们提供了一套强大的工具,用于描述和处理线性空间中的对象和变换。在3D计算机视觉中,我们经常需要处理从图像中重建三维世界的问题,这本质上涉及大量的矩阵运算和线性变换。因此,扎实的线性代数基础至关重要。

向量空间与子空间

上一节我们介绍了课程的整体目标,本节中我们来看看线性代数的基石——向量空间。

一个集合 V 被称为在实数域 R 上的线性空间向量空间,如果它满足以下条件:

  • 对向量加法封闭:对于任意 u, v ∈ V,有 u + v ∈ V
  • 对标量乘法封闭:对于任意 α ∈ Rv ∈ V,有 αv ∈ V
  • 关于加法构成一个阿贝尔群(交换群),即存在零向量,且每个向量都有逆元。
  • 标量乘法满足结合律和分配律。

一个常见的例子是 (三维空间)。在该空间中,你可以将两个向量相加,或用一个实数缩放一个向量,结果仍然是一个三维向量。

子空间是向量空间的一个子集,但它本身也必须是一个向量空间。这意味着它对加法和标量乘法也必须是封闭的。例如,在 中,任何通过原点的平面都是一个子空间。如果平面不通过原点,则它不包含零向量,因此不是一个子空间。

线性无关、张成空间与基

理解了向量空间的结构后,我们需要一种有效的方式来描述其中的向量。这引出了线性无关和基的概念。

给定一组向量 S = {v₁, v₂, ..., vₖ},它们的张成空间是所有可能的线性组合构成的集合:
span(S) = { α₁v₁ + α₂v₂ + ... + αₖvₖ | αᵢ ∈ R }

这组向量被称为线性无关的,如果方程 α₁v₁ + α₂v₂ + ... + αₖvₖ = 0 的唯一解是所有系数 αᵢ = 0。直观上,线性相关意味着集合中至少有一个向量是“冗余”的,它可以表示为其他向量的线性组合。例如,如果 αⱼ ≠ 0,那么向量 vⱼ 可以表示为:
vⱼ = - (1/αⱼ) Σ_{i≠j} αᵢ vᵢ

是向量空间的一个特殊集合,它需要满足两个条件:

  1. 线性无关。
  2. 能够张成整个向量空间(即 span(基) = V)。

基也可以被定义为极大线性无关组,即无法再添加任何向量而保持线性无关的集合。向量空间的维数定义为基中向量的数量。例如, 的维数是3,一组可能的基(称为标准基)是:
e₁ = (1, 0, 0)^T, e₂ = (0, 1, 0)^T, e₃ = (0, 0, 1)^T

基的一个重要性质是,向量空间中的每一个向量都可以唯一地表示为基向量的线性组合。如果我们有两组不同的基 BB',那么存在一个唯一的、可逆的基变换矩阵 A,使得:
B' = B A
这意味着新基中的每个向量都可以表示为旧基向量的线性组合,其系数构成了矩阵 A 的列。

内积、范数与度量

在向量空间中定义了基之后,我们还可以引入度量长度和角度的工具,即内积。

向量空间 V 上的一个内积(或点积)是一个映射 <·, ·> : V × V → R,它满足以下性质:

  1. 线性: ** = α + β**
  2. 对称性: ** = **
  3. 正定性: ** ≥ 0,且 ** = 0 当且仅当 v = 0

Rⁿ 中,最常见的标准内积定义为:对于 x = (x₁, ..., xₙ)^T, y = (y₁, ..., yₙ)^T
** = x₁y₁ + x₂y₂ + ... + xₙyₙ**

由内积可以诱导出向量的范数(长度):
||v|| = √
以及向量间的距离(度量):
d(v, w) = ||v - w||
这种由内积诱导出度量的空间称为希尔伯特空间。标准内积诱导的范数称为L2范数欧几里得范数

如果两个向量的内积为零,** = 0,则称它们正交**。

当我们进行基变换 B' = B A 时,标准内积在新基下的坐标表示会发生变化。如果 x = B x_coord, y = B y_coord,且 x_coord' = A⁻¹ x_coord, y_coord' = A⁻¹ y_coord,那么内积可以写为:
** = (x_coord')^T (A^T A) y_coord'**
矩阵 A^T A 定义了在新坐标下的诱导内积

克罗内克积与向量化

在处理矩阵运算时,有两个有用的符号工具。

克罗内克积 适用于任意两个矩阵。设 Am×n 矩阵,Bp×q 矩阵,它们的克罗内克积 A ⊗ B 是一个 mp×nq 的分块矩阵:

A ⊗ B = [ a₁₁B  a₁₂B ... a₁ₙB
          a₂₁B  a₂₂B ... a₂ₙB
          ...   ...  ... ...
          aₘ₁B  aₘ₂B ... aₘₙB ]

向量化 操作 vec(A) 是将矩阵 A 的所有列依次堆叠起来,形成一个长列向量。例如,若 A = [a₁, a₂, ..., aₙ],则 vec(A) = (a₁^T, a₂^T, ..., aₙ^T)^T

这两个操作有时可以简化表达式。例如,一个双线性形式 u^T A v 可以重写为向量内积:
u^T A v = (v ⊗ u)^T vec(A)

线性变换与矩阵表示

线性代数的核心是研究线性变换。一个从向量空间 VW 的映射 L: V → W 称为线性变换,如果它满足:

  1. L(u + v) = L(u) + L(v) (保持加法)
  2. L(αv) = α L(v) (保持标量乘法)

线性变换有一个关键性质:它完全由它对基向量的作用所决定。设 {v₁, ..., vₙ}V 的一组基,那么对于任意向量 x = Σ αᵢ vᵢ,有:
L(x) = L(Σ αᵢ vᵢ) = Σ αᵢ L(vᵢ)
因此,只要我们知道了 L(v₁), ..., L(vₙ),就知道了整个变换。

如果我们为 VW 分别选定基(例如标准基),那么每个 L(vᵢ)W 的基下可以表示为一个坐标向量。将这些坐标向量作为列,就得到了线性变换 L矩阵表示 A。此时,变换运算就等价于矩阵乘法:
L(x) = A x
所有从 RⁿRᵐ 的线性变换构成的集合,等同于所有 m×n 实矩阵的集合,记作 M(m, n)

矩阵群:GL(n) 与 SL(n)

当矩阵是方阵(n×n)时,我们不仅可以做加法和标量乘法,还可以做矩阵乘法。这带来了更丰富的代数结构。

一个是一个集合 G 配上一个二元运算(如乘法),满足:

  1. 封闭性: 对于任意 g₁, g₂ ∈ G,有 g₁ g₂ ∈ G
  2. 结合律(g₁ g₂) g₃ = g₁ (g₂ g₃)
  3. 单位元存在: 存在 e ∈ G,使得对任意 g ∈ G,有 e g = g e = g
  4. 逆元存在: 对任意 g ∈ G,存在 g⁻¹ ∈ G,使得 g g⁻¹ = g⁻¹ g = e

在矩阵中,所有可逆n×n 实矩阵(即行列式非零的矩阵)关于矩阵乘法构成一个群,称为一般线性群,记作 GL(n)GL(n, R)

进一步,所有行列式为1的 n×n 可逆实矩阵也构成一个群,称为特殊线性群,记作 SL(n)。它是 GL(n) 的一个子群,因为两个行列式为1的矩阵相乘,其行列式仍为1;可逆矩阵的逆的行列式也为1。

总结

本节课我们一起回顾了线性代数的核心基础。我们首先定义了向量空间子空间,然后引入了线性无关张成空间的概念,这些是描述向量空间结构的工具。接着,我们通过内积定义了向量的长度、角度和距离,从而得到了度量空间。我们还介绍了克罗内克积向量化这两个有用的矩阵操作符号。最后,我们探讨了线性变换的实质及其与矩阵的一一对应关系,并了解了由可逆矩阵构成的一般线性群 GL(n)特殊线性群 SL(n)。这些概念是理解后续多视角几何中复杂模型和算法的基石。

004:表示动态场景(第1部分)

在本节课中,我们将要学习如何从移动的相机中重建三维世界。首先,我们需要解决一个核心挑战:如何用数学方法表示相机的运动。这是计算机视觉中的一个基本问题,因为相机在观察世界时总是在移动。本节课我们将从线性代数的基础知识出发,深入探讨如何对相机的运动进行建模。

历史背景与问题定义

上一节我们回顾了线性代数的基础知识,本节中我们来看看三维重建问题的历史背景和数学定义。

从图像中重建世界是一个历史悠久的目标。早在计算机出现之前,古希腊人(约公元前400年)就开始研究透视投影。到了文艺复兴时期,透视投影的研究催生了射影几何学这一领域。

从数学上讲,从图像进行三维重建通常被视为一个“不适定问题”。这个概念由数学家哈达玛提出。一个“适定问题”需要满足三个条件:

  1. 解存在。
  2. 解唯一。
  3. 解对输入数据的微小扰动是稳定的。

如果其中任何一个条件不满足,问题就是“不适定的”。三维重建通常是不适定的,因为仅凭稀疏的图像集,通常存在无限多种可能的三维结构都能产生相同的图像。因此,为了获得有意义的重建结果,我们通常需要引入额外的假设(例如,在所有可能的重建中,哪一个是最有可能的)。

三维重建的几何关系研究基于两个核心变换,我们将在后续章节中分别讨论:

  1. 相机运动:使用欧几里得运动或刚体运动(即 SE(3) 群)的概念建模。
  2. 透视投影:描述三维点如何投影到二维图像平面(例如针孔相机模型)。

一个里程碑式的成果是奥地利数学家埃贡·克劳尔在1913年的证明:如果已知五个点在两个图像中的对应关系,就可以重建出相机的运动(旋转和平移)以及这五个点的三维位置,尽管解可能不唯一(存在有限多个解)。这个成果远在计算机出现之前。

刚体运动

现在,让我们更具体地探讨相机(或任何刚体)的运动。这种运动被称为刚体运动

刚体运动是一种保持物体“刚性”的变换。这意味着它必须保持点之间的距离、向量之间的角度以及体积不变。更正式地说,刚体运动是一个映射 g: R³ → R³,它满足以下两个条件:

  1. 保持长度:对于任意向量 v,有 ||g(v)|| = ||v||
  2. 保持叉积:对于任意向量 u, v,有 g(u × v) = g(u) × g(v)

从这些条件可以推导出,刚体运动也必然保持点积(从而保持角度)和混合积(从而保持体积)。

一个关键的结论是:任何满足上述条件的刚体运动,其形式必然是旋转和平移的组合。也就是说,对于三维空间中的点 x,刚体运动可以表示为:
g(x) = R * x + t
其中 R 是一个 3x3 的旋转矩阵(属于 SO(3) 群),t 是一个 3x1 的平移向量

平移部分(t)很简单,只有三个自由度。而旋转部分(R)则复杂得多。一个 3x3 矩阵有 9 个参数,但它们必须满足严格的约束:RᵀR = I(正交性)且 det(R) = +1。这些是非线性约束,在优化问题中很难直接处理。因此,我们需要寻找更好的旋转表示方法。

李群与李代数

为了解决旋转矩阵的参数化问题,我们引入李群李代数的概念。这是由挪威数学家索菲斯·李提出的强大数学工具。

李群 是一个同时是光滑流形的群,其群运算(乘法和求逆)是光滑映射。简单理解,李群是一种连续的、可以平滑变化的群。SO(3)(所有 3x3 旋转矩阵的集合)就是一个典型的李群。

李代数 是与李群相关联的线性空间,它是李群在单位元处的切空间。对于 SO(3) 群,其李代数记为 so(3),它由所有 3x3 的反对称矩阵组成。
一个反对称矩阵 W 满足 Wᵀ = -W,其形式如下:

W = [  0, -w₃,  w₂]
    [ w₃,   0, -w₁]
    [ -w₂, w₁,   0]

它实际上只由三个参数 (w₁, w₂, w₃) 决定。我们可以定义一个“帽”算子 (·)^ 将向量映射为反对称矩阵:
w = (w₁, w₂, w₃)ᵀ → ŵ (即上面的矩阵)。

那么,李代数 so(3) 和李群 SO(3) 之间有什么联系呢?考虑一个随时间变化的旋转矩阵 R(t),且 R(0) = I。由于 R(t)R(t)ᵀ = I,对时间求导可得:
Ṙ(t)R(t)ᵀ + R(t)Ṙ(t)ᵀ = 0
由此可以推导出一个重要的微分方程:
Ṙ(t) = ŵ(t) * R(t)
其中 ŵ(t) 是一个反对称矩阵。在初始时刻 t=0,有 Ṙ(0) = ŵ。这意味着,旋转矩阵的瞬时变化率由一个反对称矩阵(即李代数 so(3) 中的元素)给出

这个微分方程的解可以用矩阵指数来表示:
R(t) = exp(ŵ * t)
这里,exp() 是矩阵指数函数。这个公式建立了从李代数(反对称矩阵 ŵ)到李群(旋转矩阵 R)的映射,称为指数映射

反之,从旋转矩阵 R 也可以找到对应的反对称矩阵 ŵ,使得 R = exp(ŵ)。这个逆过程称为对数映射,记为 ŵ = log(R)。需要注意的是,对数映射不唯一,因为旋转 的整数倍会回到相同的旋转矩阵。

罗德里格斯公式

在实际计算中,我们不需要用无穷级数去计算矩阵指数。对于 so(3) 中的元素,有一个封闭形式的解,称为罗德里格斯旋转公式

设有一个反对称矩阵 ŵ,其对应的向量为 w,令 θ = ||w|| 为旋转角度,v = w/θ 为单位化的旋转轴向量(对应的反对称矩阵为 )。那么,指数映射可以精确地计算为:
R = exp(ŵ) = I + sin(θ) * v̂ + (1 - cos(θ)) * v̂²
这个公式非常高效,允许我们直接用三个参数 (w₁, w₂, w₃) 生成一个合法的旋转矩阵,而无需担心正交性等约束。

参数化与优化的优势

使用李代数 so(3) 来表示旋转在优化问题中具有巨大优势:

  • 无约束优化:旋转矩阵的 9 个参数有 6 个非线性约束。而李代数的 3 个参数 (w₁, w₂, w₃)完全自由的,没有任何约束。我们可以在这三个参数上自由地进行优化。
  • 计算简便:通过罗德里格斯公式,可以轻松地从这三个参数计算出对应的旋转矩阵 R = exp(ŵ),该矩阵自动满足所有旋转矩阵的性质。
  • 物理意义清晰:参数 w 的模长代表旋转角度,方向代表旋转轴。

因此,在实践中的标准做法是:在优化时,将旋转表示为李代数 so(3) 中的三个无约束参数,通过指数映射获得旋转矩阵用于计算损失函数,从而将复杂的带约束优化问题转化为简单的无约束优化问题。

总结

本节课中我们一起学习了如何为动态场景(特别是相机运动)建立数学模型。我们从三维重建的历史和不适定性问题入手,明确了刚体运动的定义及其旋转-平移的表示形式。为了有效处理旋转矩阵的复杂约束,我们引入了李群 SO(3) 和李代数 so(3) 的核心概念。李代数是李群在单位元处的切空间,由反对称矩阵构成,它通过指数映射 exp(ŵ) 与旋转矩阵相关联,并通过罗德里格斯公式实现高效计算。这种表示法的最大优势在于,它将旋转参数化为三个无约束的自由度,极大地简化了后续基于相机运动进行三维重建的优化过程。在下一节中,我们将把这一框架扩展到完整的刚体运动(即包含平移的 SE(3) 群),并探讨其与欧拉角的关系。

005:表示动态场景(第2部分) 👁️

在本节课中,我们将继续学习如何使用李群和李代数来优雅地表示动态场景,特别是刚体运动。我们将从回顾旋转的李群(SO(3))和李代数(so(3))开始,然后将其扩展到包含平移的刚体运动群(SE(3))及其对应的李代数(se(3))。我们将学习如何通过指数映射将李代数中的元素(称为“扭转”)映射回李群中的刚体运动,并探讨其在相机运动和坐标变换中的应用。


回顾:旋转的李群与李代数

上一节我们介绍了李群是一个同时是光滑流形的群,例如旋转群SO(3)。它不是线性的,这意味着两个群元素之间的“中间值”不一定是群元素。为了参数化这种非线性空间,我们考虑群在单位元处的切空间,即李代数。

对于旋转群SO(3),其李代数so(3)是所有3x3反对称矩阵构成的空间。这个空间是三维的。我们通过指数映射将李代数中的元素映射回李群:
R = exp(Ŵ)
其中 Ŵ 是一个反对称矩阵。这保证了结果 R 自动满足正交性(RᵀR = I)和行列式为1的约束,从而将带约束的优化问题转化为无约束问题。

指数运算可以通过罗德里格斯公式以闭式解计算:
exp(Ŵ) = I + sinθ * (Ŵ/θ) + (1 - cosθ) * (Ŵ/θ)²
其中 θ = ||W||WŴ 对应的三维向量。这避免了计算无穷级数。


扩展到刚体运动:SE(3) 与 se(3)

本节中,我们来看看如何将上述概念扩展到同时包含旋转和平移的刚体运动。

刚体运动群SE(3)是一个六维李群(三个旋转自由度,三个平移自由度)。其元素可以用齐次坐标下的4x4矩阵表示:

    [ R   t ]
G = [       ]
    [ 0   1 ]

其中 R 是3x3旋转矩阵,t 是3维平移向量。

与SO(3)类似,SE(3)也有对应的李代数,称为se(3)。为了找到它,我们考虑一个随时间参数化的刚体运动族 G(t),并计算 Ġ G⁻¹。通过推导(类似于对旋转约束求导),我们可以得到:
Ġ G⁻¹ = ξ̂
其中 ξ̂ 是一个具有特定结构的4x4矩阵:

        [ Ŵ   v ]
ξ̂ = [         ]
        [ 0   0 ]

这里,Ŵ 是一个3x3反对称矩阵(来自so(3)),v 是一个3维向量。这个矩阵 ξ̂ 被称为扭转

ξ̂ 来源于一个六维向量 ξ = [v, W]ᵀ,其中 W 是角速度向量(描述旋转变化),v 是线速度向量(描述平移变化)。ξ̂ 构成了SE(3)在单位元处的切空间,即李代数se(3)。


指数映射:从 se(3) 到 SE(3)

与旋转的情况完全类似,我们可以建立从李代数se(3)到李群SE(3)的映射。

我们得到了一个微分方程:Ġ = ξ̂ G,其初始条件为 G(0) = I。这个方程的唯一解由指数映射给出:
G = exp(ξ̂)
这意味着,通过对一个扭转矩阵进行指数运算,我们可以得到对应的刚体运动矩阵。

幸运的是,这个指数运算也有闭式解(证明较长,此处给出结果):

exp(ξ̂) = [ exp(Ŵ)   V v ]
         [                ]
         [   0        1   ]

其中:

  • exp(Ŵ) 是旋转部分,可用罗德里格斯公式计算。
  • V 是一个3x3矩阵,其表达式为 V = I + ((1 - cosθ)/θ²) Ŵ + ((θ - sinθ)/θ³) Ŵ²

这个映射是满射的,意味着对于任何刚体运动 G ∈ SE(3),都存在一个扭转 ξ̂ ∈ se(3) 使得 G = exp(ξ̂)。其逆映射称为对数映射。与旋转一样,这个映射也不是唯一的(例如,旋转360度的倍数对应相同的刚体运动)。


应用:表示相机与场景运动

现在,我们来看看如何利用刚体运动表示动态场景,例如移动的相机或物体。

坐标变换

假设我们有一个世界点 X₀(在世界坐标系中)。一个运动的相机在不同时刻 t 观测这个点,该点在相机坐标系中的坐标 X_t 由刚体运动给出:
X_t = G(t) X₀ (在齐次坐标下)
或等价于:
x_t = R(t) x₀ + t(t) (在三维坐标下)
其中 x 表示三维坐标。

使用齐次坐标和4x4矩阵表示的优势在于,连续的变换可以通过简单的矩阵乘法实现。例如,从时刻 t1t2 再到 t3 的变换为:
X_{t3} = G_{t3,t2} * X_{t2} = G_{t3,t2} * G_{t2,t1} * X_{t1} = G_{t3,t1} * X_{t1}
因此有 G_{t3,t1} = G_{t3,t2} * G_{t2,t1}。这比分开处理旋转和平移要简洁得多。

逆变换也很简单:G_{t1,t2} = (G_{t2,t1})⁻¹

速度变换

考虑一个固定的世界点被运动的相机观测。该点在相机坐标系中的坐标变化率为:
Ẋ = Ġ X₀
代入 X₀ = G⁻¹ X,我们得到:
Ẋ = Ġ G⁻¹ X
Ġ G⁻¹ 正是我们之前定义的扭转 ξ̂。因此,观测到的速度可以简洁地写为:
Ẋ = ξ̂ X
在三维坐标下,这等价于:
ẋ = Ŵ x + v
这个公式描述了由于相机运动(由 ξ̂ 表示)导致的静态点在图像中表现出的速度场。

伴随映射

最后,我们简要介绍一个在文献中常见的概念:伴随映射。

假设有两个坐标系,它们之间通过一个固定的刚体运动 G 相关联。如果一个点在第一个坐标系中的速度由扭转 ξ̂ 描述(即 ẋ = ξ̂ x),那么该点在第二个坐标系中的速度则为:
ẏ = G ξ̂ G⁻¹ y
这个变换 ξ̂ → G ξ̂ G⁻¹ 被称为伴随映射。它描述了当观察坐标系发生变化时,速度的扭转表示如何相应地变换。


总结

本节课中我们一起学习了:

  1. 核心概念回顾:李群(如SO(3))是光滑流形,其李代数(如so(3))是单位元处的切空间。指数映射 exp 和对数映射 log 在它们之间建立联系。
  2. 刚体运动的李群SE(3):用4x4齐次矩阵表示旋转和平移,形成一个六维李群。
  3. 对应的李代数se(3):由称为“扭转”的4x4矩阵构成,形式为 [Ŵ, v; 0, 0],其中 Ŵ 来自so(3),v 是三维向量。它代表了瞬时旋转和平移(角速度和线速度)。
  4. 指数映射的闭式解exp(ξ̂) 可以直接计算,无需无穷级数,其中旋转部分用罗德里格斯公式。
  5. 应用
    • 使用 G(t) 表示相机或物体的运动轨迹。
    • 坐标变换通过矩阵乘法简洁完成:X_new = G * X_old
    • 静态点因相机运动而产生的观测速度:ẋ = Ŵ x + v
    • 伴随映射 ξ̂ → G ξ̂ G⁻¹ 描述了速度表示在不同坐标系间的变换。

通过使用李代数表示,我们将刚体运动的估计问题转化为对无约束的六维参数向量 ξ 的优化问题,这在实践中非常有效。

006:透视投影

在本节课中,我们将要学习透视投影的基本原理。这是图像形成过程的第二个核心要素,它描述了三维世界中的点如何被映射到二维相机屏幕上。我们将从历史背景入手,探讨其数学模型,并介绍相关的核心概念,如相机参数、径向畸变以及前像与共像。

历史背景与艺术中的透视

上一节我们介绍了刚体运动,本节中我们来看看相机如何观察世界。透视投影的研究已有数千年历史。早在公元前4世纪,欧几里得等人就已开始研究图像形成的几何原理。在庞贝古城的壁画和镶嵌画中,也能找到部分正确的透视投影实例。

然而,随着罗马帝国的衰落,许多古代知识一度失传。直到文艺复兴时期,艺术家们才重新发现了透视法则。例如,阿尔贝蒂于1435年撰写的《论绘画》阐述了透视投影的规律。艺术家们如布鲁内莱斯基、多纳泰罗、达·芬奇等,深入研究了光线与物质的相互作用以及透视原理,创作出极具真实感的作品。

透视投影在艺术中不仅用于创造真实感,有时也被用于制造视觉错觉,例如荷兰艺术家M.C.埃舍尔的作品,就巧妙地运用并超越了透视法则的极限。

透视投影的数学模型

现在,我们从艺术转向机器,探讨如何用数学建模透视投影。最简单的模型是针孔相机模型

在针孔相机中,光线通过一个小孔(投影中心)投射到后面的成像平面上。对于一个三维空间点 X = (X, Y, Z)^T,其在成像平面上的投影点 x 的坐标为:

x = f * X / Z
y = f * Y / Z

其中,f 是焦距,即投影中心到成像平面的距离。在实际相机中,成像平面位于投影中心后方,因此公式中会有一个负号,但为简化,我们通常假设成像平面前置。

这个投影方程是非线性的,因为涉及除以 Z 坐标。为了在计算中方便处理,我们引入齐次坐标

我们将三维点表示为齐次坐标 X̃ = (X, Y, Z, 1)^T。那么,投影过程可以写成一个看似线性的形式:

λ * x̃ = K * Π₀ * G * X̃₀

其中:

  • λ 是一个比例因子,实际上就是该点的 Z 坐标值。
  • G 是一个 4x4 矩阵,表示将世界坐标系下的点变换到相机坐标系下的刚体运动(外参)。
  • Π₀ 是标准投影矩阵 [I | 0],用于去掉齐次坐标的最后一维。
  • K 是相机内参矩阵,包含焦距、像素缩放等因素。

因此,完整的投影矩阵 Π 可以写为 Π = K * Π₀ * G。尽管方程形式是线性的,但关键的非线性隐藏在比例因子 λ 中,因为它依赖于三维点的深度 Z。

相机参数:内参与外参

相机参数分为内参外参

  • 外参:描述相机在世界中的位置和朝向,即刚体运动 G,包含旋转 R 和平移 t
  • 内参:描述相机内部的成像特性,即矩阵 K

内参矩阵 K 的一般形式如下:

K = [ α_x,   s,   o_x;
       0,  α_y,   o_y;
       0,    0,     1 ]

以下是各参数的含义:

  • α_x = f * s_xα_y = f * s_y:分别表示 x 和 y 方向上的焦距(以像素为单位)。它们的比值 α_x / α_y 称为图像的宽高比
  • o_x, o_y主点的坐标(以像素为单位),即光轴与成像平面的交点。通常位于图像中心附近。
  • s倾斜因子,用于描述像素非矩形时的畸变,对于标准矩形像素,其值应为 0。

在实际应用中,尤其是处理网络下载的图片或视频时,我们可能不知道这些内参,这就需要通过算法从图像本身进行估计,这是一个具有挑战性的研究问题。

透镜畸变与校正

真实的相机使用透镜而非针孔,这引入了光学畸变,最常见的是径向畸变。在使用广角或鱼眼镜头时,直线在图像中会呈现弯曲。

径向畸变可以用模型来校正。假设观测到的畸变点坐标为 (x_d, y_d),其到畸变中心(通常假设为主点)的距离为 r = sqrt(x_d² + y_d²)。校正后的坐标 (x_u, y_u) 可以通过以下模型计算:

x_u = x_d * (1 + a₁ * r² + a₂ * r⁴ + ...)
y_u = y_d * (1 + a₁ * r² + a₂ * r⁴ + ...)

参数 a₁, a₂, ... 描述了畸变的程度。要确定这些参数,通常需要已知一些对应点(例如,使用棋盘格标定板),然后通过最小二乘法拟合求解。这是一个线性拟合问题,因为待求参数在方程中是线性的。

更先进的算法可以尝试在没有标定板的情况下,通过假设图像中的直线应该是直的这一先验知识,同时进行三维重建和畸变校正。

前像与共像

透视投影是一个“多对一”的映射,我们失去了深度信息。因此,图像中的一个点可以对应三维空间中一整条射线上的所有点。这个概念引出了前像的定义。

以下是相关概念的定义:

  • 点的前像:给定图像中的一个点 x,其前像是所有能投影到该点的三维点的集合。在针孔模型中,这条线就是连接投影中心与该图像点的射线。
  • 线的共像:给定图像中的一条线 l(在齐次坐标下表示为三维向量),其前像是一个平面,该平面由投影中心和图像线 l 所张成。这个平面的法向量 l 被称为该图像线的共像

前像和共像是互补的概念。对于图像点 x,其前像是射线,共像是垂直于该射线的平面(由 的行向量张成)。对于图像线 l,其前像是平面,共像是该平面的法线 l

它们之所以有用,是因为在从多视图进行三维重建时,我们可以将来自不同视角的同一点(或线)的前像(或共像)相交,从而确定其在三维空间中的位置。

投影几何简介

我们一直使用齐次坐标,最初是为了将刚体运动 Rx + t 表示为单一的矩阵乘法 GX̃,以简化计算和 notation。但这背后连接着数学领域——投影几何

在投影几何中,一个 n 维投影空间 P^n 被定义为向量空间 R^{n+1} 中所有穿过原点的一维子空间(即直线)的集合。

例如,一个三维空间点 (X, Y, Z) 可以用齐次坐标 (X, Y, Z, 1) 表示,这等价于 R^4 中穿过原点和该坐标点的一条直线。直线上的所有点 (λX, λY, λZ, λ) 都代表同一个三维点。因此,我们关心的是直线的方向,而不是其在直线上的具体位置。

投影空间有两种常见的参数化方式:一种是使用球面(但将对跖点视为同一点),另一种是使用平面加一个“无穷远”的圆。投影几何为处理透视投影和齐次坐标提供了一个强大而统一的数学框架。

总结

本节课中我们一起学习了透视投影的核心内容。我们从历史背景和艺术应用入手,建立了针孔相机模型,并推导了其数学公式。我们详细介绍了相机的内参与外参,以及如何处理真实相机中的径向畸变。接着,我们引入了前像和共像这两个重要概念,它们是多视图几何中三维重建的基础。最后,我们简要探讨了齐次坐标背后的投影几何原理,理解了为何将三维点表示为四维空间中的直线。

透视投影是将三维世界映射到二维图像的关键步骤,理解它是后续学习多视图几何、立体视觉和三维重建的基石。

007:估计点对应关系(第一部分) 🎯

在本节课中,我们将要学习三维重建中的一个核心挑战:如何估计两张图像中对应点的关系。我们将从整体问题框架出发,理解点对应关系的重要性,并介绍解决此问题的经典方法及其背后的基本假设。


三维重建与点对应关系

上一章我们学习了如何从三维世界映射到二维图像。本节中我们来看看三维重建的完整流程。

三维重建的核心思想是:我们有一个三维世界,以及从不同视角观察这个世界的图像。当相机移动(发生旋转和平移)后,我们会在新的图像中看到相同的三维点。重建的关键在于,单张图像无法告诉我们物体离相机有多远。但通过从不同角度观察同一结构(即“运动恢复结构”问题),一旦我们知道这些点在两张图像中的位置以及相机的刚体运动,我们就可以通过三角化这些视线来确定三维结构在空间中的位置。

这个想法看似简单,但实现起来却充满挑战。其中最大的挑战之一就是对应关系问题:给定两张图像,如何确定一张图像中的某个点对应于另一张图像中的哪个点?


对应关系问题的挑战

为什么这是一个难题?如今的图像有数百万像素,任何一个像素都可能与另一张图像中的任何像素对应。人类可以轻松识别(例如,看到一个教堂塔楼,移动后依然能认出它),但对机器而言却并非易事。

这个问题的核心在于,相机记录的是光度信息(亮度、颜色值),而我们需要的却是几何信息(三维点)。因此,我们需要从光度信息转换到几何信息。

以下是解决此问题的传统流程步骤:

  1. 识别特征点:在图像中找出具有显著特征的像素点。
  2. 确定对应关系:在不同图像间匹配这些特征点。
  3. 进行重建:利用匹配好的点来恢复相机运动和三维结构。

这个经典流程虽然有效,但存在局限性。将问题分解为多个步骤通常会导致次优解。原因在于:

  • 信息丢失:只使用了图像中一部分点的信息。
  • 错误传播:在对应关系步骤中产生的错误(如匹配错误或位置偏差)会直接影响后续的重建结果,且无法从原始数据中恢复。

尽管如此,这种分步方法在工程上易于处理,并且在计算资源有限(如80年代的计算机或如今的移动设备)时,为了追求实时性,它仍然被广泛使用。


对应关系问题的类型

在估计对应关系时,我们通常区分两种情况:

  1. 小位移/小变形:假设相机移动很小,对应点只在邻域内寻找。这使得问题相对简单,并且有高效的算法(如Lucas-Kanade方法)。这在实时应用中(如增强现实、无人机导航)很常见,因为帧率很高,相邻帧间的位移很小。
  2. 宽基线/大位移:图像拍摄视角差异很大(例如相差90度),对应点可能出现在图像的任何位置。这使得问题非常困难,因为存在大量潜在的匹配候选点,并且可能遇到重复结构或非朗伯表面(如金属、玻璃)的干扰。

这两种情况具有互补性:小位移场景追求速度,宽基线场景则允许投入更多计算时间来寻找可靠的对应关系。本节课我们将重点讨论小位移这一相对简单的情况。


从三维到二维的投影关系

为了形式化地分析问题,我们引入上一章的符号。设三维空间点为 X。它在第一张图像上的投影为 x₁,在第二张图像上的投影为 x₂

设该点到第一个相机中心的距离为 λ₁(X),到第二个相机中心的距离为 λ₂(X)。在齐次坐标下,存在如下关系:

X = λ₁ * x₁

将点 X 转换到第二个相机坐标系下,需要经过旋转 R 和平移 t,然后投影得到 x₂

x₂ = (1 / λ₂) * [R | t] * X = (1 / λ₂) * [R | t] * (λ₁ * x₁)

由此可见,x₂x₁ 通过一个函数 H 相关联,该函数包含了未知的相机运动(R, t)和深度信息(λ₁, λ₂)。在估计对应关系时,我们需要对这个函数 H 进行建模或近似。


运动模型与光流

在小位移假设下,我们可以对图像中点位移(即光流)进行简单建模。光流指的是点在图像平面上的表观运动,它是三维运动在二维图像上的投影,并不完全等同于真实的三维运动。

常用的位移模型有:

  • 平移模型u(x) = b。仅有两个自由度(x和y方向的平移)。
  • 仿射模型u(x) = S * [x, y]ᵀ + b。其中S是一个2x2矩阵,b是平移向量,共有六个自由度。这可以看作是函数 H 在局部的一种线性近似。

选择合适的模型有助于我们更准确地估计点与点之间的对应关系。


Lucas-Kanade 方法简介

接下来,我们介绍解决小位移对应关系问题的经典算法——Lucas-Kanade方法(1981年提出)。其核心基于两个假设:

  1. 亮度恒定假设:同一个三维点在图像序列中移动时,其亮度保持不变。即 I(x(t), t) = constant
  2. 局部运动一致假设:在一个小窗口 W(x) 内,所有点具有相同的运动速度(光流向量)v

基于这两个假设,可以构建一个关于光流向量 v 的损失函数,并通过最小化该函数来求解 v。Lucas-Kanade方法及其扩展(如KLT跟踪器)至今仍是计算机视觉中最流行、应用最广泛的算法之一,用于在视频中跟踪点的运动。

尽管该领域的研究已超过40年,但光流估计仍然是一个活跃的研究方向。经典方法为我们奠定了基础,而现代方法(如基于深度学习的方法)正在不断推动性能的边界。


本节课中我们一起学习了三维重建中点对应关系问题的核心地位与主要挑战,区分了小位移与宽基线两种不同场景,并介绍了用于解决小位移问题的经典Lucas-Kanade方法及其基本思想。在接下来的课程中,我们将深入该方法的具体数学原理和实现细节。

008:估计点对应关系(第二部分)

在本节课中,我们将继续学习如何估计图像间的点对应关系,即光流估计。我们将从经典方法入手,理解其核心假设与推导,并简要了解现代基于深度学习的方法如何发展。

光流估计简介

上一节我们介绍了点对应关系的基本概念。本节中,我们来看看如何具体计算图像间的运动,即光流估计。

光流估计的目标是:给定两幅图像,找出第一幅图像中的某个像素点在第二幅图像中的对应位置。这不仅针对单个像素,而是希望为图像中的许多点(甚至是所有像素)找到对应关系。

根据计算范围,方法可分为两类:

  • 稀疏光流:仅为图像中一组稀疏的特征点计算对应关系。
  • 稠密光流:为图像中的每一个像素计算对应关系。这通常更具挑战性,但随着GPU并行计算的发展,已能实现实时处理。

经典方法:Lucas-Kanade 算法

要理解现代方法,回溯经典算法的根源非常有帮助。Lucas-Kanade (1981) 和 Horn-Schunck (1981) 是光流领域两个开创性的工作。其中,Lucas-Kanade 方法为稀疏点估计运动,其推导基于两个核心假设,非常直观。

核心假设

该方法建立在两个基本假设之上:

  1. 亮度恒常性:一个物体在运动过程中,其外观(亮度或颜色)保持不变。用公式表示,对于运动轨迹上的点 x(t),其亮度 I 满足:
    I(x(t), t) = 常数
    对此式求关于时间 t 的全导数,并令其为零,得到光流基本约束方程:
    ∇I(x, t) · v + I_t(x, t) = 0
    其中,∇I 是图像的空间梯度,I_t 是时间导数,v = dx/dt 是我们要求解的速度(光流)向量。这个方程表明,我们只能观测到速度 v 在图像梯度方向上的投影分量。

  2. 局部运动一致性:在一个小的图像窗口(例如一个以点 x 为中心的方块)内,所有像素具有相同的运动速度 v

构建与求解

基于以上假设,我们可以为窗口内的所有像素建立约束方程。由于噪声存在,这些方程通常不能精确满足,因此我们通过最小化一个损失函数来求解最优的 v

损失函数定义为窗口内所有像素约束方程误差的平方和:
E(v) = ∑[∇I(x') · v + I_t(x')]²,对窗口内所有 x' 求和。

这是一个关于 v 的二次函数。为了找到使 E(v) 最小的 v,我们对其求导并令导数为零:
dE/dv = 0

这导出了一个线性方程组:
M * v = -q
其中,M = ∑[∇I ∇Iᵀ] 是一个2x2矩阵(结构张量),q = ∑[2 I_t ∇I] 是一个2维向量。

最终,光流向量可通过求解该线性系统得到:
v = -M⁻¹ * q

重要讨论:可求解性

上述求解过程要求矩阵 M 可逆(即行列式不为零)。M 的可逆性取决于图像窗口内的纹理结构:

  • 平坦区域(梯度为零),M 是零矩阵,无法求解。
  • 边缘区域(梯度只有一个方向),M 秩为1,不可逆,只能求解沿边缘法线方向的运动(孔径问题)。
  • 角点区域(梯度在多个方向上变化),M 是满秩的,可以稳定地求解出完整的二维运动向量。

因此,Lucas-Kanade 方法天然地倾向于在图像中纹理丰富的角点区域提供可靠的光流估计。

算法扩展:KLT特征跟踪器

Lucas-Kanade 方法被扩展为著名的 KLT (Kanade-Lucas-Tomasi) 特征跟踪器。其工作流程如下:

  1. 在图像中寻找适合跟踪的点(即 M 矩阵行列式值大的点,通常是角点)。
  2. 对每个特征点,使用上述方法计算其到下一帧的光流 v
  3. 将该点位置加上 v,作为下一帧的初始位置。
  4. 重复步骤2-3,形成特征点的运动轨迹。
  5. 当某个点的 M 矩阵行列式过小(跟踪失败)时,丢弃该轨迹,并可能在新帧中检测新的特征点。

这种方法能够高效、实时地跟踪稀疏特征点的运动轨迹。

从特征点到特征检测器

Lucas-Kanade 方法中用于判断点是否“可跟踪”的 M 矩阵(结构张量),直接催生了早期的特征点检测器

通过计算每个像素点的 M 矩阵,并检查其行列式(或更复杂的函数,如 Harris 角点检测中的 行列式 - κ * (迹)²),我们可以快速找到图像中的“兴趣点”(通常是角点或纹理密集区域)。这类检测器在深度学习时代之前,是物体识别、图像匹配等任务的基础。

以下是经典特征检测器的发展脉络:

  • Förstner 检测器 (1984/87):基于结构张量。
  • Harris & Stephens 检测器 (1988):提出了更稳定的角点响应函数。
  • SIFT (2004):引入了基于尺度的特征描述子。
  • 现代方法:通常使用神经网络来同时检测特征点并计算其描述子。

宽基线匹配的挑战

Lucas-Kanade 方法适用于小基线情况(即相邻帧间运动很小)。当图像间视角或时间间隔很大时,会面临宽基线匹配的挑战:

  1. 搜索空间巨大:对应点可能出现在图像任何位置。
  2. 遮挡:一幅图像中的区域可能在另一幅中不可见。
  3. 外观变化:光照、视角变化导致亮度恒常性假设严重失效。
  4. 累积漂移:在KLT等增量跟踪方法中,误差会随时间累积。

应对策略

为了应对这些挑战,需要更强大的方法:

  1. 更复杂的运动模型:使用仿射或投影变换模型,而不仅仅是平移。
    v(x') = S(x') * p
    其中 p 是参数向量,S(x') 是依赖于位置的矩阵。求解思路与基础Lucas-Kanade类似,但参数更多。

  2. 更鲁棒的相似性度量:放弃严格的亮度恒常,使用对光照变化不敏感的度量。例如归一化互相关 (NCC)
    NCC(patch1, patch2) = ( (patch1 - μ1) · (patch2 - μ2) ) / (||patch1 - μ1|| * ||patch2 - μ2|| )
    它通过减去均值消除亮度偏移,通过归一化消除亮度缩放,本质是计算两个向量间的余弦相似度。

现代方法:基于学习的光流与匹配

传统优化方法虽经典,但当前最先进的光流和特征匹配技术已主要基于深度学习。

  • FlowNet (2015):首个用于光流估计的卷积神经网络,开启了端到端学习光流的时代。
  • SuperGlue (2020):一个强大的图像匹配网络。它首先用神经网络检测特征点和描述子,然后构建一个图模型,利用图神经网络 (GNN)最优传输理论来求解全局一致的点对应关系。最优传输能确保匹配的整体合理性(如一对多匹配),从而在宽基线、大视角变化下也能获得非常精确的对应结果。

这些学习方法通过海量数据训练,能够隐式地建模复杂的表观变化和几何变形,性能远超传统方法。

总结

本节课我们一起学习了点对应关系估计的核心方法。

  • 我们从经典的 Lucas-Kanade 光流法入手,理解了其基于亮度恒常局部运动一致假设的推导过程,以及它如何自然地引向特征点跟踪 (KLT)角点检测
  • 我们探讨了从小基线宽基线匹配时面临的挑战,以及相应的解决思路,如使用更复杂的运动模型和归一化互相关等鲁棒度量。
  • 最后,我们了解到,当前该领域的前沿已转向基于深度学习的方法,如 FlowNet 和 SuperGlue,它们通过数据驱动的方式,在复杂场景下实现了更精准、更鲁棒的点对应关系估计。

光流与图像匹配是计算机视觉的基石问题,历经数十年发展依然活跃,不断有新的算法推动其性能边界。理解经典方法的原理,是掌握现代技术的重要基础。

009:基于双视图的重建-线性算法(第1部分)

在本节课中,我们将要学习如何从两张图像中重建三维结构和相机运动。我们将从问题定义开始,逐步推导出核心的极几何约束,并最终介绍著名的八点算法。本节课的重点是线性算法,这意味着我们可以使用线性代数技术来求解问题。

概述与问题定义

上一章我们讨论了对应点估计。本章我们将进入双视图重建。

线性算法意味着我们可以部署线性代数技术来解决我们感兴趣的问题。与之互补的非线性优化技术则需要更复杂的迭代数值求解器。本章讨论线性算法,因为它奠定了极几何的基础,尽管这些算法在实际应用中可能不是最优选择,但其理论原理非常重要。

我们的问题是:给定一个静态场景的两张图像(由同一相机从不同位置拍摄),并且已知相机的内参,我们的目标是估计场景的三维点位置以及相机在两视图之间的相对运动(旋转和平移)。

这是一个经典的“先有鸡还是先有蛋”问题,在三维计算机视觉中常被称为“运动与结构”或“运动恢复结构”问题。如果我们已知相机运动,那么通过简单的三角化(即反向投影两条射线并求交点)就能得到三维点。然而,在实际中,对应点估计存在噪声,使得问题变得复杂。

极几何基础

在深入算法之前,我们需要引入极几何的概念和符号。

考虑两个相机中心 O1 和 O2,以及一个三维点 X。该点在两个图像平面上的投影分别是 x1 和 x2。

  • 极点:连接两个相机中心的直线与各自图像平面的交点,记为 e1 和 e2。
  • 极线:在图像中,连接极点 e 与像点 x 的直线。对于一个像点 x1,其在另一幅图像中的对应点 x2 必然位于对应的极线上。
  • 极平面:由两个相机中心和三维点 X 所确定的平面。

极几何的核心价值在于,它为对应点的搜索提供了约束:我们只需在极线上搜索,而非整幅图像。

极约束的推导

我们的目标是从投影方程中推导出一个不包含三维坐标 X 的约束,即极约束。

我们从投影方程开始:
λ1 * x1 = X (在相机1坐标系下)
λ2 * x2 = R * X + t (在相机2坐标系下)
其中 λ1, λ2 是深度,R 和 t 是相机1到相机2的旋转和平移。

  1. 将第一个方程代入第二个,消去 X:
    λ2 * x2 = R * (λ1 * x1) + t
    λ2 * x2 = λ1 * R * x1 + t

  2. 两边同时左乘反对称矩阵 [t]× (该矩阵等价于与 t 做叉乘):
    λ2 * [t]× * x2 = λ1 * [t]× * R * x1 + [t]× * t
    由于 [t]× * t = t × t = 0,右边第二项消失:
    λ2 * [t]× * x2 = λ1 * [t]× * R * x1

  3. 再左乘 x2ᵀ
    λ2 * x2ᵀ * [t]× * x2 = λ1 * x2ᵀ * [t]× * R * x1
    观察左边:[t]× * x2 是向量 t × x2,该向量与 x2 正交。因此它与 x2 的点积为 0:
    0 = λ1 * x2ᵀ * [t]× * R * x1

  4. 由于 λ1 ≠ 0,我们可以得到最终的极约束方程
    x2ᵀ * E * x1 = 0
    其中 E = [t]× * R 被称为本质矩阵

这个约束的美妙之处在于,它只包含了二维像点坐标 (x1, x2) 和相机运动参数 (通过 E),而完全消除了三维坐标和深度信息。它是一个关于 x1, x2 和 E 的双线性方程。

从几何角度看,这个约束意味着向量 tR*x1x2 是共面的(它们的标量三重积为零),这正对应了三个点(两个相机中心和一个三维点)必须共面的事实。

本质矩阵的性质

本质矩阵 E = [t]× * R 具有特殊的结构,不是任意 3x3 矩阵都能成为本质矩阵。

定理 (Huang & Faugeras):一个非零的 3x3 矩阵 E 是本质矩阵,当且仅当它的奇异值分解 (SVD) 具有两个相等的奇异值,且第三个奇异值为零。即:
SVD(E) = U * diag(σ, σ, 0) * Vᵀ

这是因为 [t]× 的秩为 2,导致 E 的秩也为 2。

另一个重要定理是,我们可以从本质矩阵 E 中恢复出相机的旋转 R 和平移 t(相差一个尺度因子)。

给定 E 的 SVD:E = U * diag(1, 1, 0) * Vᵀ(我们通常将 E 归一化,使得两个非零奇异值为 1),那么存在两种可能的 R 和 t 的组合:
[t]× = U * Rz(±π/2) * diag(1, 1, 0) * Uᵀ
R = U * Rz(±π/2)ᵀ * Vᵀ
其中 Rz(θ) 是绕 Z 轴旋转 θ 角度的矩阵。这总共会产生四种可能的 (R, t) 解。我们需要通过三角化并检查深度值(应为正数)来选出唯一正确的解。

八点算法

现在,我们利用极约束来求解相机运动。对于一对对应点,我们有一个方程 x2ᵀ * E * x1 = 0。E 有 9 个未知数(虽然只有 5 个自由度,但我们先将其视为 9 个未知数)。

我们可以将这个双线性形式重写为线性形式。将矩阵 E 按列堆叠成一个 9 维向量 e,并定义向量 a = x1 ⊗ x2(克罗内克积,即 [x1*x2, x1*y2, x1*z2, y1*x2, ...]ᵀ)。那么极约束可以写为:
aᵀ * e = 0

如果我们有 N 对对应点,我们可以构建一个矩阵 χ,其每一行是向量 aᵀ
χ * e = 0
其中 χ 是一个 N x 9 的矩阵。

我们的目标是找到满足上述方程的非零向量 e。为了使解唯一(相差一个尺度因子),矩阵 χ 的零空间需要是一维的。这就要求 χ 的秩为 8。因此,我们至少需要 8 对对应点(在非退化配置下)。这就是八点算法名称的由来。

八点算法步骤

  1. 构建并求解:给定至少 8 对对应点,构建矩阵 χ。计算 χ 的 SVD:χ = U_χ * Σ_χ * V_χᵀ。解 eV_χ 的最后一列(对应最小奇异值的右奇异向量)。将其重构为 3x3 矩阵 E
  2. 投影到本质矩阵空间:第一步得到的 E 通常不满足本质矩阵的奇异值性质。我们将其投影到本质矩阵空间:计算 E 的 SVD:E = U * diag(σ1, σ2, σ3) * Vᵀ,其中 σ1 ≥ σ2 ≥ σ3。然后,我们将其替换为最接近的本质矩阵:E‘ = U * diag((σ1+σ2)/2, (σ1+σ2)/2, 0) * Vᵀ。通常我们进一步归一化,得到 E_norm = U * diag(1, 1, 0) * Vᵀ
  3. 恢复姿态:从归一化的本质矩阵 E_norm 中,利用前述定理恢复出四种可能的 (R, t) 组合。
  4. 选择正确解:对每个可能的 (R, t),对若干点进行三角化,检查其深度值 λ 是否为正。选择那个能使大多数点具有正深度的解。

八点算法由 Longuet-Higgins 提出,是一个优雅的闭式解。然而,它对噪声和错误对应点非常敏感。

关于点数量的讨论

八点算法需要至少 8 个点。一个经典的理论(Kruppa, 1913)指出,实际上只需要 5 个点就可以确定相机运动,因为本质矩阵只有 5 个自由度。利用这个约束(例如,要求 det(E) = 0),可以设计出五点算法,但求解过程涉及更复杂的数学(如解一个多项式方程),会得到多个可能解。在实际的鲁棒估计中(如结合 RANSAC),使用更少的点有助于减少错误匹配的影响。

八点算法在纯旋转(t = 0)的情况下会失败,因为此时 E 为零矩阵,无法恢复任何信息。这也符合直觉:没有平移(视差),就无法估计深度。

总结与展望

本节课我们一起学习了双视图重建的基础。我们首先定义了从对应点恢复运动和结构的问题。然后,我们推导了核心的极几何约束,它巧妙地分离了二维观测和相机运动。接着,我们介绍了本质矩阵及其性质。最后,我们详细讲解了经典的线性解法——八点算法,它通过求解一个线性系统来估计本质矩阵,进而恢复相机姿态。

八点算法是理解双视图几何的基石。然而,它假设了完美的对应关系,在实际应用中常需与鲁棒估计方法(如下节课将提到的 RANSAC)结合使用。此外,我们提到还存在需要更少点数的非线性算法(如五点算法)。

在下节课中,我们将讨论如何从已知的相机运动进行三角化,以恢复三维点云结构,并探讨如何处理噪声和异常值。

010:基于双视图的重建-线性算法(第二部分)

在本节课中,我们将继续学习如何从两张图像(双视图)中重建三维场景和相机运动。我们将深入探讨核心的极线约束,并学习如何利用线性代数方法,通过著名的八点算法和四点算法来求解相机参数和三维结构。

上一节我们介绍了从多张图像重建三维世界的基本思想。本节中,我们来看看如何将复杂的投影方程简化为一个关键的约束条件,并利用它来设计线性求解算法。

极线约束与本质矩阵

我们观察一个三维点 X 在两个图像上的投影 x₁x₂。投影方程涉及未知的三维坐标 X、相机间的刚体运动(旋转 R 和平移 t)以及深度值 λ₁ 和 λ₂。直接求解这些方程非常困难。

通过巧妙的代数推导,我们可以消去三维坐标 X 和深度参数 λ,得到一个仅包含二维图像坐标和相机运动参数的约束,即极线约束

x₂ᵀ E x₁ = 0

其中,E = [t]× R 被称为本质矩阵[t]× 是由平移向量 t 构成的反对称矩阵。

这个约束的几何意义是:平移向量 t、以及从两个相机中心指向像点 x₁x₂ 的射线,这三个向量共面(它们张成的体积为零)。这意味着两条射线必然在三维空间中相交于某点。

八点算法

虽然极线约束包含了相机运动信息,但它本身是非线性的。为了求解,我们将其改写为线性形式。

对于一对匹配点,我们可以将方程 x₂ᵀ E x₁ = 0 重写为两个向量的内积:
aᵀ e = 0
其中,向量 ax₁x₂ 的坐标乘积构成(一个9维向量),向量 e 是将本质矩阵 E 的9个元素按行堆叠而成的列向量。

以下是构建线性方程组的步骤:

  1. 收集至少8对匹配点。
  2. 对于每一对点,计算其对应的9维向量 aᵢ
  3. 将所有 aᵢᵀ 堆叠起来,形成一个 n × 9 的矩阵 A(当 n ≥ 8 时)。
  4. 我们得到线性方程组:A e = 0

我们的目标是求解非零向量 e(零解无意义)。这等价于寻找矩阵 A 的零空间。理论上,如果数据无噪声且匹配点不在一个退化的三维结构上(如一个平面),A 的秩应为8,其零空间是一维的。

在实际中,由于图像测量总存在噪声,A 通常是满秩的。此时,我们通过奇异值分解来求解:

  1. 对矩阵 A 进行 SVD 分解:A = U Σ Vᵀ
  2. V 的最后一列(对应最小奇异值的右奇异向量),将其重构为3x3矩阵 E
  3. 由于噪声,得到的 E 可能不满足本质矩阵的性质(两个非零奇异值相等,第三个为零)。因此,我们需要将其投影到本质矩阵空间
    • E 进行 SVD:E = U Σ Vᵀ,其中 Σ = diag(σ₁, σ₂, σ₃) 且 σ₁ ≥ σ₂ ≥ σ₃。
    • Σ‘ = diag((σ₁+σ₂)/2, (σ₁+σ₂)/2, 0) 替换 Σ
    • 得到投影后的本质矩阵:E‘ = U Σ’ Vᵀ

从本质矩阵 E‘ 中,我们可以恢复出相机的旋转 R 和平移 t(存在四种可能的解)。通过后续的三角化,检查哪个解能产生所有点的正深度值,即可确定唯一正确的运动。

三维结构重建

在通过八点算法得到相机运动 (R, t) 后,我们可以重建三维点的位置。

对于每一对匹配点 (x₁, x₂),我们回到投影方程:
λ₂ x₂ = R (λ₁ x₁) + γ t
其中,我们引入了一个尺度因子 γ,因为平移 t 的模长和整个场景的尺度是无法从图像中确定的(尺度模糊性)。

为了求解深度 λ₁ 和尺度 γ,我们再次利用线性代数。对上述方程两边同时左乘 [x₂]×(即与 x₂ 做叉积的矩阵),消去 λ₂,得到:
λ₁ [x₂]× R x₁ + γ [x₂]× t = 0

对于 n 对点,我们可以构建一个大型线性方程组:
M λ = 0
其中,向量 λ 包含了所有 n 个点的深度 λ₁ 和全局尺度 γ,矩阵 M 是已知的(由图像坐标和已求得的 R, t 构成)。

同样,通过对矩阵 M 进行奇异值分解,取对应最小奇异值的右奇异向量,即可求解出 λ。最后,我们可以将尺度固定(例如,令 γ = 1),从而得到以相机基线长度为单位的完整三维场景重建。

退化情况与四点算法

八点算法在点都位于一个三维平面上时会失效(退化情况)。然而,如果事先知道场景是平面的,我们可以利用这个先验知识,使用更高效的四点算法

对于一个三维平面,其上的点满足:nᵀ X = d,其中 n 是法向量,d 是到原点的距离。可以推导出,两个视图中的像点坐标通过一个单应性矩阵 H 相关联:
λ₂ x₂ = H λ₁ x₁,其中 H = R + (1/d) t nᵀ

类似于极线约束,我们可以从方程中消去深度,得到关于单应性矩阵 H 的约束:
[x₂]× H x₁ = 0

将其线性化后,每个点对能为求解 H 提供两个独立的约束。因此,理论上只需要4个点对即可求解这个3x3的矩阵(共9个参数,但有一个尺度自由度)。求解过程与八点算法类似:

  1. 构建线性方程组。
  2. 通过SVD求最小奇异值对应的向量,得到 H
  3. H 中可以分解出 R, t/dn(同样存在尺度模糊性)。

单应性矩阵在平面场景的识别、图像拼接等应用中非常强大。

未标定重建与基础矩阵

上述所有讨论都假设相机已标定(即内参矩阵 K 已知)。如果相机未标定,我们只能得到像素坐标 x‘,它与归一化坐标 x 的关系是 x‘ = K x

此时,极线约束变为:
x‘₂ᵀ F x‘₁ = 0
其中,F = K⁻ᵀ E K⁻¹ = K⁻ᵀ [t]× R K⁻¹ 被称为基础矩阵

我们可以使用与八点算法完全相同的线性方法来估计基础矩阵 F。然而,与本质矩阵不同,基础矩阵除了秩为2(最小奇异值为0)之外,没有其他特殊的奇异值约束。从基础矩阵 F 中无法唯一地分解出旋转和平移,只能得到一个射影重建族,即重建出的三维结构可能相差一个任意的3D射影变换。要得到度量重建,需要额外的约束或信息。

本节课中我们一起学习了双视图重建的核心线性算法。我们首先从投影方程推导出了极线约束和本质矩阵,然后介绍了著名的八点算法,用于从匹配点中线性估计相机运动。接着,我们学习了如何利用求得的运动参数,再次通过线性方法三角化出三维场景结构。我们还探讨了平面场景下的退化问题及其解决方案——四点算法,最后简要介绍了在相机未标定情况下使用基础矩阵进行重建的挑战。这些线性方法是多视角几何的基石,虽然对噪声敏感,但其思想的优美和清晰为更鲁棒的非线性优化方法奠定了基础。

011:基于多视图的重建(第一部分)🚀

在本节课中,我们将开始学习第6章的内容:基于多视图的重建。我们将从两视图的几何约束扩展到三视图及更多视图,探讨如何利用多个视角的观测来获得更稳健、更一致的三维重建结果。

从两视图到多视图的动机 🔍

上一节我们介绍了双视图下的对极几何约束。本节中我们来看看,当同一个三维点被三个或更多相机观测时,情况会发生什么变化。

我们有一个三维点,被多个相机观测到,其投影点坐标分别为 x1x2x3 等。

多视角几何是三维计算机视觉领域的核心。一个关键问题是:仅使用两两视图之间的约束是否足够?答案是否定的。强制所有两两视图之间的一致性,并不能保证所有视图整体上的一致性。

以下是两个直观的例子:

在这些例子中,虽然每对相机(如相机1和2、2和3、1和3)的视线都能相交于某点,但这些交点并不是同一个三维点。这说明,仅强制执行两两视图的约束,无法保证所有视图观测到的是同一个三维点。

因此,我们需要一种能够直接强制多视图一致性的方法。这不仅能带来理论上的完备性,在实践中也能使重建结果更鲁棒、更稳定。

多视图几何的研究背景 📚

三视图一致性问题传统上通过三焦张量来解决,它由Hartley等人在上世纪90年代提出,是基础矩阵在多视图下的推广。

  • 基础矩阵描述了两个二维坐标之间的双线性约束:x2^T F x1 = 0
  • 三焦张量则描述了同一个三维点在三个图像中的二维坐标之间的三线性约束。

这个张量本身不依赖于三维场景结构,而只依赖于相机之间的运动(旋转和平移)。这个领域在80年代和90年代非常活跃,并总结在多本经典著作中。



在本课程中,我们将采用一种基于线性代数的方法,避免使用复杂的张量代数,使其更易于理解。

利用“原像”概念进行重建 💡

我们将使用“原像”这一核心概念来推导多视图约束。回忆一下,一个图像点的原像是所有能投影为该图像点的三维点的集合,在几何上是一条射线(对于透视相机)。

如果我们从多个视角观测同一个三维点,那么该点在所有视图中的原像的交集,就是该三维点的位置。因此,计算原像并求交,本质上就是三维重建。

对于点特征,其投影方程可以写为:
λ_i * x_i = K_i * [R_i | t_i] * X
其中,λ_i 是深度,K_i 是内参,[R_i | t_i] 是外参(刚体运动),X 是世界坐标系下的三维点。

为了书写简洁,我们引入一个紧凑的符号 π_i,它包含了第 i 个视图的完整投影过程(内参和刚体运动)。这样,投影方程可以简写为:
λ_i * x_i = π_i(X)

推导多视图矩阵秩约束 🧮

我们的目标是像推导对极约束一样,从投影方程中消去三维结构(X)和深度(λ_i),得到一个只包含二维观测(x_i)和相机参数(π_i)的约束。

假设有 m 个视图观测到同一个点 X,我们可以将所有视图的投影方程堆叠起来:

[ π_1 ]         [ x_1     ]   [ λ_1 ]
[ π_2 ] * X  =  [ x_2     ] * [ λ_2 ]
[ ... ]         [   ...   ]   [ ... ]
[ π_m ]         [ x_m     ]   [ λ_m ]

将其重写为齐次形式:
N(P) * [X^T, -λ_1, -λ_2, ..., -λ_m]^T = 0
其中,矩阵 N(P) 的构造如下:
N(P) = [ π_1, x_1, 0, ..., 0; π_2, 0, x_2, ..., 0; ... ; π_m, 0, 0, ..., x_m ]

这个方程意味着向量 [X^T, -λ^T]^T 位于矩阵 N(P) 的零空间中。因此,N(P) 这个 3m x (m+4) 的矩阵不可能是满秩的(满秩为 m+4),其秩最多为 m+3

这就是多视图下的秩约束。通过强制这个矩阵秩亏,我们得到了一个仅关联相机参数和二维观测的约束条件,成功消去了三维点坐标 X 和深度 λ_i。这是对极约束在多视图下的直接推广。

简化约束:构造矩阵 W(P) ⚙️

上述约束涉及一个较大的矩阵。我们可以进一步简化,引入反对称矩阵 x_i^(即 x_i 的叉乘矩阵)。由于 x_i^ * x_i = 0,我们可以用块对角矩阵 Î = diag(x_1^, ..., x_m^) 左乘原始的投影方程:

Î * [π_1; ...; π_m] * X = Î * [x_1*λ_1; ...; x_m*λ_m] = 0

定义矩阵 W(P) = Î * P,其中 P = [π_1^T, ..., π_m^T]^T。那么上式变为:
W(P) * X = 0

这意味着三维点 X 位于 W(P) 的零空间中。W(P) 是一个 3m x 4 的矩阵。在一般情况下,它的秩为4,零空间维度为0。但是,如果存在一个非零的 X 满足所有视图的投影,那么 W(P) 的零空间就必须是非平凡的,因此其秩最多为3。

因此,多视图一致性等价于强制矩阵 W(P) 的秩至多为3。这个 3m x 4 的矩阵 W(P) 包含了所有相机的参数 π_i 和所有二维观测 x_i,其秩约束为我们提供了所需的多视图几何关系。

总结 📝

本节课中我们一起学习了多视图重建的数学基础。

  1. 我们首先认识到,仅使用两两视图之间的约束不足以保证所有视图的整体一致性。
  2. 我们回顾了利用“原像”交集进行重建的核心思想。
  3. 通过将多视图投影方程转化为齐次形式,我们推导出了关键的矩阵秩约束rank(N(P)) ≤ m+3
  4. 通过引入反对称矩阵进行简化,我们得到了更紧凑的等价形式:rank(W(P)) ≤ 3

这个秩约束 rank(W(P)) ≤ 3 是多视角几何中一个非常强大的工具。它将相机运动参数和多个二维观测联系在一个简洁的线性代数框架内,是后续进行多视图运动估计和三维重建的基石。在下一节中,我们将探讨如何利用这个约束来实际求解相机运动。

012:基于多视图的重建(第2部分) 🎥

在本节课中,我们将要学习如何将双视图的极线几何约束推广到多视图场景。我们将推导出当同一个三维点被多个相机观测时,这些二维观测点与相机运动之间必须满足的约束条件。这些约束可以表述为矩阵的秩条件,并最终引导我们理解三线性约束,它比成对的极线约束更强,能确保三维重建的唯一性。


从双视图到多视图的扩展 📈

上一节我们介绍了双视图下的极线约束和八点算法。本节中,我们来看看如何将这些概念扩展到有M个视图观测同一个三维点X的情况。

观测方程可以写为:

λ_i * x_i = Π_i * X,  对于 i = 1, ..., M

其中:

  • x_i 是第i个视图中的二维观测点(齐次坐标)。
  • λ_i 是该点到第i个相机的未知深度。
  • Π_i 是第i个相机的投影矩阵。
  • X 是未知的三维点。

我们可以将这个方程组重写为一个更紧凑的矩阵形式。将所有方程堆叠起来,并重新排列项,我们得到一个形如 N_Π * u = 0 的方程,其中 u 是一个包含所有深度 λ_i 和三维点 X 坐标的向量。

这个方程的关键在于,向量 u 位于矩阵 N_Π 的零空间中。由于 u 是非零向量(包含深度信息),这意味着矩阵 N_Π 不可能是满秩的。


多视图矩阵的秩约束 🔢

矩阵 N_Π 的维度是 3M 行 x (M+4) 列。它的最大可能秩是 M+4

然而,由于存在非零解 u,该矩阵的秩必须小于 M+4。具体来说:

  • 如果秩等于 M+4:零空间只有零向量,意味着没有满足所有观测的三维点,无解
  • 如果秩等于 M+3:存在一个一维的零空间(解 u 可被缩放),意味着存在一个唯一的三维重建(在尺度意义下)。
  • 如果秩小于 M+3:零空间维度大于1,意味着存在多个可能的三维重建,解不唯一。

因此,为了得到唯一的三维重建,我们要求相机运动和二维观测必须使得矩阵 N_Π 的秩恰好为 M+3。这就是多视图情况下的基本秩约束,它类似于双视图中的极线约束。


推导更紧凑的约束矩阵

为了进一步分析,我们可以通过定义一个包含所有反对称矩阵 x_i_hat 的块对角矩阵 I_⊥,来消去方程中的深度变量 λ_i。将 I_⊥ 左乘到原始方程上,我们得到一个新的方程:

W_Π * X = 0

其中 W_Π = I_⊥ * Π 是一个 3M x 4 的矩阵。

现在,约束变成了:三维点 X 位于矩阵 W_Π 的零空间中。为了使 X 唯一(在尺度意义下),W_Π 的秩必须至多为3(因为满秩4意味着只有零解)。

通过选择第一个相机坐标系作为世界坐标系(即 Π_1 = [I | 0]),并巧妙地右乘一个满秩矩阵,我们可以将 W_Π 的秩约束转化为一个更小矩阵 M_P 的秩约束。

这个关键的矩阵 M_P 是一个 3(M-1) x 2 的矩阵,其两列如下:

  • 第一列包含项:x_i_hat * R_i * x_1
  • 第二列包含项:x_i_hat * t_i

其中 i 从2到M。

最终的结论是:矩阵 W_Π 的秩 ≤ 3 等价于矩阵 M_P 的秩 ≤ 1


多视图约束的几何与代数解释

矩阵 M_P 只有两列。它的秩有三种可能:

  • 秩 = 2:两列线性无关。这意味着不存在一个三维点能同时满足所有M个视图的投影方程,即无重建
  • 秩 = 1:两列线性相关。这意味着存在一个标量 λ_1(恰好是点X到第一个相机的深度的倒数),使得两列成比例。这对应着存在唯一重建(在尺度意义下)。
  • 秩 = 0:矩阵为零矩阵。这是一种退化情况,对应着存在重建但不唯一

当秩为1时,线性相关条件 M_P * [λ_1, 1]^T = 0 可以写为对每个视图 i

x_i_hat * (R_i * x_1) * λ_1 + x_i_hat * t_i = 0

与极线约束的联系

让我们看看这个多视图约束如何包含双视图极线约束。对于第 i 个视图,上述方程要求向量 x_i_hat * t_ix_i_hat * (R_i * x_1) 线性相关(成比例)。

这等价于说向量 t_i(平移)、R_i * x_1(第一个像点在第二个相机系下的方向)和 x_i 本身是共面的。而这正是第一个相机与第 i 个相机之间的极线约束的几何表述:

x_i^T * (t_i_hat * R_i) * x_1 = 0

因此,多视图矩阵 M_P 的秩为1的条件,隐含了第一个相机与每一个其他相机之间的所有成对极线约束


更强的约束:三线性约束

然而,多视图约束包含的信息比所有成对的极线约束之和还要多。关键点在于,秩为1要求存在同一个标量 λ_1,使得所有 M-1 个方程同时成立。而成对的极线约束只要求每个方程各自存在一个(可能不同的)比例因子。

利用线性代数中关于两列矩阵秩的性质,秩 ≤ 1 的条件等价于一组三线性约束。对于任意两个不同的视图 iji, j > 1),必须满足:

( x_i_hat * R_i * x_1 ) * ( x_j_hat * t_j )^T - ( x_i_hat * t_i ) * ( x_j_hat * R_j * x_1 )^T = 0

这个约束同时涉及了三个视图(视图1、i、j)的观测和运动参数。

重要结论:多视图秩约束等价于对所有可能的三元组视图施加三线性约束。这意味着,考虑三个视图就能获得多视图情况的全部约束力,考虑更多视图不会增加新的独立约束。


退化情况与唯一性

三线性约束比成对极线约束更强,能排除一些极线约束无法处理的退化情况,从而保证重建的唯一性。

以下是两种退化情况:

  1. 三点共面:如果三个相机的光心与三维点X位于同一平面(称为三焦平面),则满足所有成对极线约束,但可能不存在唯一的交点(预像不唯一)。三线性约束可以排除此情况。
  2. 光心共线:如果所有相机光心沿一条直线运动(如高速公路上的汽车),观测路边的点时,成对极线约束也无法保证唯一重建。三线性约束同样可以处理此情况,除非点也恰好位于光心的连线上(这是完全退化的)。

因此,在非退化情况下,满足三线性约束能确保从三个或更多视图观测一个点,可以唯一地确定其三维位置。


多视图重建算法思路

类似于从极线约束推导出八点算法,我们也可以从多视图约束出发,设计多视图下的结构和运动恢复算法。

假设我们有 N 个三维点 P_j,每个点在 M 个视图中的观测为 x_{ij}。对于每个点 j,我们都有之前推导的方程:

x_{ij}_hat * (R_i * x_{1j}) * α_j + x_{ij}_hat * t_i = 0

其中 α_j = 1 / λ_{1j} 是点 j 到第一个相机深度的倒数。

由此可以构思一个交替优化算法

  1. 已知结构(α_j):对于每个相机 i(i>1),上述方程关于运动参数 R_i, t_i 是线性的。我们可以为所有 N 个点构建一个线性方程组,并通过奇异值分解(SVD) 求最小二乘解,来估计 R_i, t_i。这至少需要6个点。
  2. 已知运动(R_i, t_i):对于每个点 j,上述方程关于 α_j 是线性的。我们可以利用所有 M 个视图的观测,通过最小二乘法直接求解 α_j

算法流程

  • 初始化:可以使用八点算法处理前两个视图,得到初始的三维点深度估计(即 α_j 的初始值)。
  • 交替迭代:固定 α_j,用SVD求解所有相机运动;固定相机运动,用最小二乘求解所有 α_j。重复直至收敛。

需要注意的是,与闭式解的八点算法不同,这是一个迭代算法。此外,像八点算法一样,这种基于SVD的“谱方法”对观测噪声比较敏感,通常假设数据无噪声。在实际应用中,更鲁棒的方法是后续章节会介绍的光束法平差


线特征的多视图重建

对于空间直线在多视图中的观测,可以推导出完全平行的理论。观测直线会带来其普吕克坐标的约束,最终也能导出一个多视图矩阵 M_L,并得到其秩必须 ≤ 1 的约束。

同样地,这个秩约束等价于一组三线性约束,涉及三个视图中的直线观测。对于直线,仅凭两个视图的约束非常弱(两个平面的交总是存在一条线),而三视图的三线性约束能确保三条视线平面相交于同一条空间直线,从而实现唯一重建。


总结 📝

本节课中我们一起学习了多视图几何的核心约束。

  1. 核心思想:将双视图极线约束推广到多视图。通过分析多视图投影方程,我们推导出,存在唯一三维重建的充要条件是一个特定构造的矩阵 M_P 的秩必须为1。
  2. 约束形式:秩约束等价于两组约束:
    • 隐含了所有与第一视图相关的成对极线约束
    • 显式地要求所有可能的三元组视图满足三线性约束。三线性约束更强,能保证在更多情况下重建的唯一性。
  3. 算法启示:基于此约束,可以设计交替优化算法来估计多视图的运动和结构,但这是一种对噪声敏感的迭代方法,而非闭式解。
  4. 特征扩展:类似的理论框架也适用于空间直线等多视图重建。

多视图秩约束为我们理解多个图像间的几何一致性提供了坚实的基础,是连接双视图几何与真正多视图三维重建(如SFM、SLAM)的重要桥梁。

013:捆绑调整与非线性优化 - 第1部分

在本节课中,我们将要学习一种解决相机三维重建问题的更实用方法——捆绑调整。我们将探讨如何通过建立并最小化一个损失函数,来同时估计相机运动和三维结构,并处理观测数据中的噪声和不确定性。

上一章我们以多视角几何的内容结束,这部分内容技术性较强且较为紧凑。现在,我们将进入第7章:捆绑调整。捆绑调整是一种解决相机三维重建问题的方法,在某些方面比我们之前讨论的八点算法及其多视角扩展更为实用。本章篇幅较长,并且相比往年授课内容,我进行了一些修订,特别是加入了关于捆绑调整数值计算方面的一些最新进展。

动机:为何需要捆绑调整?

在之前的章节中,我们讨论了解决结构与运动问题的线性方法,特别是八点算法。该算法利用奇异值分解这一线性代数技术,提供了一个闭式解来同时估计相机运动和三维结构。

其核心思想是:我们观测到两幅图像中的八个对应点,然后尝试从这些对应观测中恢复相机运动和三维结构。关键挑战在于,我们做了一个非常强的假设——我们恰好看到了八个对应点。我们之前讨论过估计对应关系本身的挑战,并指出这并非易事,存在光流算法来计算这种成对对应关系。

但随之而来的问题是:如果一开始的对应关系在某种程度上并不完美,该怎么办?实际上,我们可以区分几种不完美的情况:

  • 首先,如果你观察的是具有重复结构的东西,比如这里的墙壁、天花板上的瓷砖或棋盘格图案,那么你有可能找到一个点并能精确定位它,但你分配为对应点的可能是错误的那个。因为你看到的不是同一块瓷砖,而是旁边的一块。这可以看作是一种错误匹配
  • 另一种情况是,你找到了正确的点,但定位并不精确。这可能发生在图像中纹理较少的区域(如地板),在这些区域找到一个点并在另一幅图像中重复找到它非常困难,因此你可能会略有偏差。

那么问题来了:如果在八点算法中使用的对应点对集合受到了扰动而不精确,会发生什么?用符号表示,我们可以说我们有真实的点 x1x2,但我们实际观测到的是带噪声的数据 x1_tildex2_tilde。它们并不精确地位于应有的位置,而是略有偏差。它们可能不精确,甚至可能是错误的。

在八点算法中,我们面临的问题是:旋转和平移的解可能无法尽可能接近正确解,并且重建结果可能不一致。因此,问题是:我们如何确保即使在有噪声的条件下,这些重建方法仍然有效?要解决这个问题,你需要更明确地对噪声进行建模。但一旦这样做,你就会得到无法用最小二乘法或线性代数技术求解的损失函数,这时就需要转向更复杂的非线性优化技术

在本章中,我们将首先介绍捆绑调整这一框架,它允许考虑观测中的噪声和不确定性。然后,一旦建立了这个损失函数,我们将讨论非线性优化技术,包括梯度下降、最小二乘估计、牛顿法、高斯-牛顿法、列文伯格-马夸特算法等大量用于求解损失函数的数值算法。这些算法非常重要,因为它们是许多当前最先进重建方法的核心。之后,我们将回到捆绑调整问题,讨论如何将这些技术应用于捆绑调整,并进行总结,最后展示这些捆绑调整技术在实际图像中的应用。

应对噪声的统计方法

如前所述,我们在上一章讨论的线性方法(特别是八点算法)非常优雅,因为它们为问题提供了最优解。我们可以闭式求解,可以说,如果你计算与最小奇异值相关的特征向量,就能得到解,这被称为闭式解。这类方法通常很好,因为你不需要近似,可以直接计算精确解。

但问题是,你计算的解是针对一个并非真正“正确”的代价函数。这是计算机视觉中的一个普遍问题,不仅在三维重建中,在许多其他领域也是如此。你基本上面临两种选择:要么找到可以精确求解但可能并非你想解决的问题;要么找到你想解决但无法获得精确解的问题。这是一个常见的困境,我们必须在可以闭式求解的问题和我们真正想解决的问题之间做出妥协。

换句话说,你可以尝试解决你真正想解决的原始问题,但只能找到近似解;或者你可以找到一个与你想要的损失函数相似但不完全相同的损失函数,并找到它的精确解。这里存在一种权衡:如果我们近似损失函数,我们可以找到精确解;如果我们不想近似损失函数,就必须计算近似解。

因此,这里的核心挑战是确保方法在嘈杂的真实世界条件下仍然有效。像八点算法这样的谱解法通常不考虑噪声和不确定性,这种现象实际上远不止于三维重建领域。事实上,在很多不同问题的报告和演示中,都有人提倡谱解法,声称将问题以某种方式表述后,解就是最大或最小特征值对应的特征向量。这是一种非常常见的解决问题策略,但它几乎总是忽略了不确定性和噪声。

你可以考虑这些因素,并且存在许多框架允许你这样做。如果你对此有更深入的阅读兴趣,有所谓的贝叶斯公式最大后验估计等方法。我不想过多深入细节,但它们都建立在19世纪牧师托马斯·贝叶斯提出的所谓贝叶斯公式之上,这是非常古老的思想。

他的思想是:给定这些带噪声的二维坐标观测值 x_tilde,希望估计或最大化具有真实二维坐标 x 和相机运动 RT 的概率。也就是说,在给定这些噪声观测的情况下,找到正确的二维坐标和正确的相机运动。然后,你可以基于所谓的贝叶斯公式重新表述这个问题,即最大化两个概率的乘积:一个是在给定真实观测和相机运动的情况下观测值的似然概率,另一个是二维坐标和相机运动的先验概率。

这有点复杂,因为如果要应用它,你必须对旋转、平移和二维坐标的空间建立先验概率模型。这并不容易,因为正如我们之前讨论的,旋转存在于一个流形中,即刚体运动的流形(旋转和平移)。人们可以尝试处理这个问题,并在这些空间上对这些概率分布进行建模,这是一种方法。

但如果你假设这里的似然是高斯分布的,即观测点围绕真实二维点呈高斯分布,那么这种方法会导致一个如下形式的优化问题:最小化观测二维坐标与真实坐标之间的二次差异。其中,pi(Xj) 是三维点 Xj 在第一幅图像中的透视投影,pi(R, T, Xj) 是点 Xj 在第二幅图像中的投影(需要先进行旋转和平移)。这些是通过将三维点投影到图像中得到的二维坐标,而 s 函数表示它们应该接近我观测到的位置。

这是与八点算法的关键区别。在这里,我们明确地有一个代价函数,它表示模型预测的二维点应该接近测量到的二维点。它们不必完全相同,但应该在一定范围内,并通过这里的二次损失来衡量。因此,我们有一个损失函数,它表示:我有一个三维点,将其投影到成对的图像中,然后说在第一幅图像和第二幅图像中观测到的二维坐标应该接近,在最小二乘意义上接近。因此,你最小化的是观测二维坐标 x_tilde 与投影的三维坐标(相对于相机1或相机2)之间的所谓投影误差重投影误差

如前所述,pi(R, T, Xj) 基本上意味着 pi(R * Xj + T),这是投影到第二幅图像。目前这是针对两幅图像的损失函数,这被称为捆绑调整。我稍后会谈到捆绑调整的历史,它实际上是一个相当古老的方法,直到几个月前我才知道这种捆绑调整方法至少有110年的历史,比计算机的出现要早得多。人们可能会好奇为什么在计算机出现之前人们就研究这个,我稍后会讲到。

这是针对两幅图像的损失函数:这是投影到第一幅图像,这是投影到第二幅图像。你可以看到一个损失函数,它告诉你这些端点的投影与两幅图像中的匹配程度,它们与二维观测的一致性如何。因此,我们现在要做的是:找到相机的旋转和平移,并找到你的端点(三维点 X1XN)的三维位置,使得这些点投影到这些图像中与我们所拥有的二维观测一致。

这是针对两幅图像的情况,并且很容易推广。你可以看到这是对端点的求和,有两个残差测量与投影到两幅图像的差异。你可以通过求和从1到M(所有图像)来推广到M幅图像。对所有图像求和,然后对你的端点求和,然后说 x_tilde_ij 是点 j 在图像 i 中观测到的二维坐标,它应该与点 X 在图像 i 中的旋转、平移和投影 pi 一致,然后使用二次惩罚来衡量这种差异。

这里有一个小方面使其在实践中更适用:如果你有端点并在图像中观测它们,显然你通常不会在每个图像中都看到每个点。当你移动相机时,你会在一段时间内看到一定数量的点,每个点将在一定数量的相机中被观测到。你可以在损失函数中通过变量 theta_ij 来考虑这一点,如果点 j 在图像 i 中可见,则 theta_ij 为1,否则为0。问题显然是你如何知道一个点是否可见?一种方法是,如果你有一组图像,你可以手动确定点是否在图像中;或者你必须通过对应关系估计算法来估计这一点,如果你没有找到对应的伙伴,那么你只需将此变量设为零。但在实践中,你可能也想与所有其他参数一起估计这些变量,但有一个注意事项:如果你将这个变量 theta 放入损失函数(即未知数中)并估计它,显然你不希望算法将所有点的 theta 都设为零,因为那样整个损失函数将变为零。所以你必须以某种方式强制规定一定数量的点实际上是可见的,否则这将无法工作。但原则上,这就是损失函数。因此,你可以联合估计所有图像的所有旋转和平移,以及从1到n的所有点。

就像在八点算法中一样,我们试图估计相机运动和三维结构,并且能够先解耦估计相机运动,再估计三维结构。在这里,我们也估计相机运动和三维结构,但它是在一个单一的优化问题中。实际上并不容易解耦,甚至不可能在这里分离结构和运动。我们必须小心一点。现在,我们进入了一个人们主要使用深度网络来解决问题的时代,我发现这种通过最小化损失函数来确定解决方案的方法变得不那么常见了,因此学生们通常不太熟悉最小化损失函数或能量的概念。这个想法确实是建立这个损失函数,然后计算参数(旋转、平移和三维坐标),使这个损失变小。

一旦你这样做,任何部署优化技术的人都需要问一个关键问题(这被称为优化技术,因为你建立了一个损失函数,然后说你的未知数是使这个损失最小化的参数):损失函数是凸的吗? 因为如果损失函数是凸的,那么你可以找到最优解。如果你的损失函数不是凸的并且有很多局部最小值,那么就困难得多。我认为凸损失函数是这样的:凸的。所以这里是你的解空间,这里是你的损失(通常称为 E 表示能量)。如果这是凸的,那么最优解可以被找到,你只需从任何地方开始,基本上就是滚下山坡,这可以在机器中建模,然后你可以找到成本最低的配置。

但如果你的损失函数不是凸的,那么实际上就不那么容易找到这个最优解了。困难在于,通常解空间不像这张图片中那样是一维的,而是有很多维度。如果我们想计算最小值,当然,在一维中,你可以直接采样这个损失函数并评估它,直到找到一个点,至少在某个离散化程度上,你可以说,我将尝试所有这些解,然后取成本最低的那个。如果你对整个空间采样足够精细,在一维中你可以做到。但在高维中,这种所谓的完全搜索策略不再有效。

那么维度是多少?有两件事你需要问自己:首先,我解决的问题的维度是多少?其次,问题是凸的吗?这基本上是因为如果只是一维,那么你不在乎,你可以进行完全搜索;如果是二维,仍然可以;三维,也许也可以。但在某个点上,它开始变得棘手。这里的维度是多少?让我们看看。这是我们的损失函数。旋转和平移。这是六个参数,对吧?三个用于旋转,三个用于平移。所以未知数的数量等于每个相机的旋转和平移的六个参数,我们有 M 个相机,所以乘以 M。加上,然后我们有三维坐标,那是一个三维向量乘以大 N 个点。因此,如果你有成千上万个点或数百万个点以及成千上万个相机,这就是一个大问题。而且,不幸的是,它不是凸的。

如果我们看这个损失函数,有两个缺点。首先,我们有很多未知数。其次,损失函数不是凸的。它看起来是凸的,因为你这里有一个二次项。正如你所知,二次项看起来像那样。这是一个函数,本质上是 s 的平方。二次项是好的,但需要注意的是,它并不真正是二次的。你知道,在外表上是二次的,因为你这里有平方,但在这个残差内部。这以高度非线性的方式依赖于旋转、平移和三维坐标。这里有刚体运动,有透视投影。我们讨论过的所有东西都包含在这里。因此,如果你将其绘制为未知数的函数,它不再是凸的。这是一个大问题。

在某种程度上,这就是人们开发线性八点算法的原因,因为它规避了这个问题。它将一切都表述为一个特征值问题,然后你就完成了。一步到位,很简单。这里,它很棘手。但问题是,正如我提到的,这个八点算法并不最小化正确的损失函数。它不最小化这个特定的损失。所以我们必须研究如何最小化这种损失函数。

但在我们这样做之前,也许让我提一下,有不同的方法来参数化这个问题。这是一种方式,在某种意义上是最明显的方式:你有三维坐标,你有相机运动,你有这个二次差异。我们也可以采取一个稍微不同的观点。我们也可以说,与其估计三维坐标,我将在第一幅图像中参数化所有东西,并估计图像1中的二维坐标。所以我们有这个问题,我们在两幅或更多图像中观察这个世界,然后与其存储三维坐标大 X,我们也可以存储,比如说 x。我必须确保索引位置正确。

之前我们讨论的是三维坐标 Xj。你也可以有图像1中的二维坐标,然后用这个深度 lambda_1j 来缩放它们。那么,大 Xj 就等于 lambda_1j * xj。然后,真实的二维坐标应该接近图像1中测量到的坐标。我通过取这个点大 X(即 lambda 乘以小 x),旋转、平移,然后透视投影,得到图像2中的对应点。因此,我现在做的是取这个小 x_j,在这里缩放它,然后投影到另一个图像中。然后它应该匹配二维观测,或者在相同的最小二乘意义上接近。所以,正如你所看到的,这确实是完全相同的损失函数:两个残差测量点在图像1和图像2中的差异,只是不是从这里开始,而是从这里开始,然后我寻找二维点和未知的深度。

这是一种替代方案,至于它是否更容易或更困难是另一个问题。但正如你所看到的,我们也可以用这种方式表达它。对于两幅图像的情况,显然对于M幅图像的情况也类似。另一件我们可以做的事情是,我们可以基本上说,我们有测量到的二维坐标和真实的坐标,对于所有图像 i(从1到2,在两幅图像的情况下)和所有点,这些应该在最小二乘意义上一致,然后我们知道这些二维坐标满足极线约束。所以这里是对所有点 j 从1到 n 的极线约束。然后我们说,此外,如果我们用齐次坐标表示它们,图像1和图像2中的点的第三个分量应该是1。

这是参数化它的另一种方式。这里的不同之处在于,我们有一个损失函数,然后受限于一组约束。在优化中,通常你可以指定一个损失函数,并指定某些约束,这被称为约束优化问题。这里你有一个无约束损失函数。原则上,是无约束的,但如果你仔细观察,你会发现我们正在对旋转和平移进行优化。问题是你如何表示它们。如果你将 R 表示为一个3x3矩阵,那么它也必须满足约束,它必须在 SO(3) 中,对吧?因此,根据你如何参数化 R,这也会成为一个约束优化问题。

所以你可以看到有不同的方式,我向你展示这些是因为根据你阅读的论文,有时他们会这样介绍捆绑调整,有时针对M幅图像像这样,但有时也像那样,但本质上都是同一件事。这是一个很好的问题:哪种表示更可取?我必须说我最喜欢最下面这个。因为它最简单。因为我不是从2D开始,然后到3D,再回到2D,而是直接用它我关心的参数来表述:我想知道三维点,所以我把它们放在这里;我想知道相机运动,然后我有这个相当紧凑的损失函数。

然后,我通常不太喜欢约束优化,无约束优化问题通常更容易处理,你只需有你的参数,它们可以取任何值,你不必担心它们是否会离开可行配置的空间。所以你可以这样做:无论哪里有 R,你都会插入这个李代数编码,基本上将所有 R 写成这个反对称3x3矩阵 w_hat 的指数,然后将你的旋转的三个自由度参数放入这个反对称矩阵 w_hat 中,然后将其插入到损失函数中 R 出现的任何地方。这样你就得到了一个完全无约束的问题,每个相机的旋转有三个自由度,平移有三个自由度,每个点的三维坐标有三个参数。然后这是一个完全无约束的问题。然后你必须找出部署哪种算法来解决它。

所以那将是我的偏好。那么你有了一个损失函数,比如说最下面这个,对吧?问题是我现在如何估计这些未知数?这把我们带到了一个非常普遍的领域……哦,等一下。在我进入非线性优化之前,我确实想提一下捆绑调整的历史,因为它很有趣,因为它很悠久,而且令人惊讶的是,它与慕尼黑工业大学紧密相连,因为你会发现很多这方面的研究实际上大约100年前就在慕尼黑工业大学开创了。所以我们很大程度上是追随我们祖先的脚步。

捆绑调整这一领域或主题出现在传统上称为摄影测量学大地测量学的领域。为了给你更多信息,摄影测量学(Photogrammetry)中,“photo”是照片,“grammetry”意味着你测量某些东西,即从照片中测量某些度量数量。事实上,这一切始于人们将相机放在飞机上,飞越这里的阿尔卑斯山,并尝试询问:我们能否使用这些照片从图像中重建阿尔卑斯山的三维结构?因为如果我们能做到,那将省去很多麻烦,你不必亲自去大自然中用尺子之类的东西测量。一百年前,你如何获得世界地形图?那时没有激光扫描仪,但你有照片,所以问题出现了:我们能否利用这些照片来了解我们生活的世界?大地测量学是关于测量我们生活的世界的。

至今,慕尼黑工业大学仍有摄影测量学和大地测量学的教席。所以从一开始,这就是慕尼黑工业大学的核心。事实上,慕尼黑工业大学的创始人,我直到最近才意识到,他是一位地质学家,他创建了慕尼黑工业大学,所以当他创立我们的大学时,他显然已经考虑到了这个挑战。

捆绑调整方法的思想是,你试图估计点的三维坐标和相机运动。通常是刚体运动,但你也可以估计内参校准参数,比如径向畸变等许多我们讨论过的东西。你可以把它们全部放入同一个损失函数中,并一起估计所有参数。我们看到,你可以用概率分布对这些不确定性、噪声进行建模,零均值高斯噪声是最常见的假设,这给出了我们看到的二次损失函数。在某种意义上,这里我有一个残差的平方。

为什么它被称为捆绑调整?在德语中是“Bündelausgleich”。人们使用的这个术语的想法是,你有一束光线击中你的相机图像,你尝试调整它们,使它们与某些东西一致。所以你有从这里和这里来的光束,它们应该匹配正在被观测的一些三维点,你同时优化刚体运动和这些点的正确位置,使得二维观测一致。这被称为捆绑调整。

通常我们会看到,为了推断三维位置和相机运动而出现的这些优化问题是非凸的,并且它们是用所谓的非线性最小二乘方法解决的。有一篇经常被引用的综述论文,来自1999年,其中一些作者仍然活跃在社区中,比如Bill Triggs、Richard Hartley、Andrew Fitzgibbon。例如,我相信Richard Hartley上周就在CVPR,不过我不太确定。

以下是开创这些工作的一些人。首先,我提到了慕尼黑工业大学的创始人Karl Max von Bauernfeind。他不仅是慕尼黑工业大学的创始人,还是一位大地测量学家。所以他对测量地球相关的事物感兴趣,并且他坚信,这也是创建慕尼黑工业大学的核心,他相信将工程师和数学家聚集在一起实际解决这类问题。因为你需要工程师来了解现实世界的挑战,并可能以优化问题的形式表述它,但然后你可能需要应用数学家来展示如何实际最优地解决这些问题。

然后是Eduard Dolezal,他在1910年在离这里不远的维也纳创立了国际摄影测量与遥感学会。所以110多年前,人们就在摄影测量学领域工作,并创建了第一个国际学会,这通常真正显示了某个主题的重要性。

然后有一个人被认为是解析摄影测量的先驱,一位名叫Sebastian Finsterwalder的研究员。他发展了从特征点估计相机方向的思想。它被称为解析摄影测量,因为人们没有计算机,对吧?我们说的是100年前。所以他们实际上建立了这些损失函数,并尝试用纸和笔解析地计算,通常需要很多年才能从一组图像中重建出某些东西。Sebastian Finsterwalder曾是慕尼黑工业大学这里的教授。同样,下面的Otto von Gruber,他开发了解决这些非线性最小二乘问题的技术。他也曾是慕尼黑工业大学的教授。然后是叫做Reer的人,他提倡使用向量代数、代数和射影几何。

还有一个叫Helmut Schmid的人。他不在慕尼黑工业大学,但我想在苏黎世联邦理工学院。他在1945年第二次世界大战后去了美国。所以捆绑调整的整个历史与20世纪的历史紧密相连。他在战后移民了。与一群火箭科学家一起,他们从德国去了美国。在那里,他们与一个名叫Duane Brown的人合作,并将这些在欧洲开发的非线性最小二乘技术部署在他们那个时代最大的计算机上,时间在1952年到1955年之间,地点在弹道研究实验室。

事实上,当我开始研究捆绑调整时,我在维基百科上读到,通常,你可能也认为维基百科什么都知道,它会告诉你一切的起源。嗯,结果既是也不是。但当我开始查阅维基百科时,大多数资料只是说,哦,捆绑调整是在20世纪50年代发展起来的。这就是我在社区里多年来听到的:捆绑调整方法是在20世纪50年代发展起来的。如果你深入研究,人们会说,哦,是一个名叫Duane Brown的人发明的。然后你下载Duane Brown的论文阅读,他会以某种方式说,嗯,这一切在20世纪50年代之前就已经发展起来了。但“到20世纪50年代”与“在20世纪50年代”不同,对吧?然后我开始深入研究。你知道,我发现资料往往很肤浅,不幸的是,人们经常写关于某事的论文,但并不真正披露这些想法的来源。但我认为追踪想法出现的地方很重要。

这就是为什么我深入研究,并发现了所有这些先驱者,他们实际上为后来Duane Brown和Helmut Schmid所采纳并在他们时代的超级计算机上部署的工作奠定了基础。以下是其中一些先驱者。正如我所说,这是Helmut Schmid和Duane Brown,他们是首先在计算机上部署这些技术的团队。但这些非线性最小二乘方法的基础实际上是由像Sebastian Finsterwalder和Otto von Gruber这样的人奠定的,他们都是慕尼黑工业大学的教授。关于它的历史就讲这么多。你知道,在计算机视觉中我们很少追溯这么远的历史。但在这里,故事开始于计算机出现之前很久。

现在我们有了这个非线性最小二乘估计问题,即捆绑调整问题,我们如何解决它?有很多文献关于它,这里只是几本书,如果你决定对它更感兴趣的话。有许多数值技术来解决优化问题,这些是经典教科书,比如Bertsekas的《非线性规划》、Nocedal和Wright的《数值优化》或Luenberger的《线性与非线性规划》。

问题是,并非只有一种算法能做所有事情。嗯,有一种算法能做很多事情,但不是所有事情——梯度下降算法。谁听说过梯度下降?哦,每个人。很好,因为你知道,当你训练神经网络时,你应用的核心也是梯度下降,对吧?这是优化的标准主力。你可能会问,如果你有梯度下降,为什么还需要其他方法?嗯,梯度下降的好消息是它总是有效,如果你的损失函数是可微的。所以如果你能计算梯度,你就可以应用梯度下降,它会让你下坡。你可以从这里开始,你会到达这个点,你知道这不是正确的解,但这是一个还不错的解,对吧?所以梯度下降总是有效,但通常不是最快的算法。

所以在优化中,你关心两件事:一是你想要最优解,而不仅仅是局部最优,最好是全局最优;其次,你想要快速得到它们。因为,你知道,你不想永远等待机器计算出解。对于这两点,梯度下降通常不一定是首选方法。所以梯度下降通常是你不知道更好的方法时的选择,这有点像你总是从它开始的普通算法。一旦你对正在优化的损失函数有了更多了解,你就会转向更有针对性的算法,这可能是牛顿法、高斯-牛顿算法或其变体列文伯格-马夸特算法。还有更多优化算法,但为了简单起见,我将重点介绍这些,因为它们都以某种形式相关。即使其他算法,也有所谓的非光滑优化技术,可以应用于不可微问题,但最终它们都包含梯度下降的元素。所以梯度下降是优化的典型方法。

梯度下降法

以下是它的工作原理,我会保持简短,因为显然你们都听说过这种技术。它旨在计算一个通常是非凸的代价函数的局部最小值,它所做的是迭代地向下走,直到损失不再进一步减少。你想朝着损失下降最快的方向前进。所以,如果这些是等损失线,你想下山。这很像如果你在阿尔卑斯山徒步旅行,你想到达山谷底部,最快(但不一定最好)的方式是直走。可能会在半路上出事,所以如果你在多洛米蒂山,不要尝试梯度下降,你知道的。但如果你的目标是最快下山,那么是的,当然,你可能在下山时就没命了,但会很快。

那么它在数学上是如何工作的呢?这是我经常注意到的一点:人们有直观的理解,但往往没有数学表达式来形式化这个过程。你有一个损失函数 E,你有未知数 x(假设只是一个,或者如这里所示可以是n维的),你想找到一个向量 x 使得 E 最小化。所以你从一个初始 x 开始,并引入一个时间 t。这里,最初在时间0,你从某个初始解 x0 开始,例如在这个例子中,你从 x0 = 2 开始。然后你有一个这种形式的微分方程,它说 x 随时间的变化由能量的负梯度给出:dx/dt = -dE/dx

这个随时间的变化 dx/dt,你实际上可以近似为 x 在时间 t+1 减去 x 在时间 t。如果你代入这个并解出 x 在时间 t+1 或这里写的 k+1,那么你得到 x_{k+1} = x_k - ε * dE/dx,这里的 ε 是一个步长。所以它基本上是说:取旧的估计值,减去 ε 乘以 dE/dx,这个 ε 在神经网络中通常称为学习率,或一般称为步长。这就是思想。然后你可以迭代它,它基本上会让你下山。然后你可以问,我如何选择步长 ε?这本身是一门艺术。

这是梯度下降的更新方程。所以从 x0 开始,你迭代地估计 x1, x2, x3, x4,并持续迭代这个方程。你可以在每次迭代中选择不同的步长。如果损失函数是凸的,就像这个例子中一样,这最终会让你达到最优解。

如前所述,梯度下降很流行,它是一种广泛适用的方法,但通常不是计算最小化器的最快解决方案。你可以研究算法的收敛速度。我认为这个领域的领先先驱之一,我也曾见过一次,是Yurii Nesterov,他研究了所谓一阶方法的收敛速度。“一阶”意味着使用损失函数一阶导数(如这里的梯度)的方法。如果你使用二阶导数,这些被称为牛顿法,然后你谈论二阶方法。但这些基于梯度的方法被称为一阶方法,有大量关于一阶优化方法的文献,然后你可以研究不同的收敛速度,即用相应方法达到最优解的速度,而梯度下降通常不是最快的。

此外,如果你的损失函数是高度各向异性的,并且你有一个,比如说,看起来像这样的能量景观(这些是弯曲的等能量线),那么如果你做梯度下降,也许你的最小值在这里,但如果你从这里开始,它会先进入这个山谷,然后沿着这个山谷走很多步,几乎要花永远才能到达那里。这是所谓的“之字形”现象。所以人们在不同背景下对此进行了大量研究,即梯度下降在其普通形式下可能需要很多次迭代。

有更聪明的技术,例如,像线搜索这样的技术。如果你不知道如何选择 ε,你可以说:好的,我从迭代 x_k 开始。这是我的 x_k。然后梯度说最小值应该在这个方向的某个地方。假设这是负的能量梯度,那么我可以做的是,与其采取一个特定的 ε,我可以进行完全搜索,正如我在一维中提到过的,完全搜索很快。我只是沿着这个方向尝试所有可能的解。这被称为线搜索,原因很明显,因为你沿着这条线搜索。所以你可以进行带线搜索的梯度下降,那可能会快得多,因为你不是在那个方向上采取启发式步长,而是采取该方向上的最优步长。

但还有很多其他损失优化技术,例如,所谓的共轭梯度法是一个流行的候选方法,你总是试图在每次迭代中找到彼此正交的方向;还有牛顿法,正如我提到的,这些是二阶方法;另一个流行的方法是BFGS方法。因此,根据你正在处理的损失函数,不同的算法可能更合适。

本节课中我们一起学习了捆绑调整的基本概念及其重要性,它通过建立考虑噪声的损失函数来改进三维重建。我们探讨了该损失函数的多种参数化形式,并回顾了其悠久的历史渊源。最后,我们介绍了解决此类非线性优化问题的基本方法——梯度下降法,并指出了其优缺点,为后续学习更高效的优化算法奠定了基础。

014:捆绑调整-非线性优化(第二部分)

在本节课中,我们将继续学习捆绑调整,并深入探讨用于解决非线性最小二乘问题的几种核心优化算法。我们将从简单的线性最小二乘问题出发,逐步介绍梯度下降、牛顿法、高斯-牛顿法以及莱文贝格-马夸特算法,并理解它们如何应用于像捆绑调整这样的复杂问题。

从梯度下降到更高效的方法

上一节我们介绍了梯度下降法,它是一种通过迭代地向梯度反方向移动来寻找函数最小值的通用方法。然而,对于许多实际问题,损失函数并非凸函数,这意味着可能存在多个局部极小值,梯度下降法可能只会收敛到其中一个。

本节中,我们将关注具有特定结构的损失函数,并探索更高效的优化算法。

线性最小二乘估计:一个基础案例

以下是线性最小二乘估计的基本概念。假设我们有一个线性模型,其中输入向量 b 与输出向量 a 的关系由参数向量 x 描述,并附加了高斯噪声 η

a = bᵀx + η

通常,我们假设噪声 η 服从均值为零、协方差矩阵为 Σ 的高斯分布。为了简化,我们常假设 Σ 是对角矩阵,即 Σ = σ²I

通过最大似然估计来求解未知参数 x,等价于最小化一个二次损失函数,即普通最小二乘问题:

minₓ ||a - Bx||²

其中,B 是由所有输入向量 b 组成的矩阵。

当考虑更一般的噪声协方差矩阵 Σ 时,问题变为广义最小二乘:

minₓ (a - Bx)ᵀ Σ⁻¹ (a - Bx)

如果协方差矩阵 Σ 是对角矩阵,则称为加权最小二乘问题,其对角元素(权重)为 σᵢ⁻²

迭代重加权最小二乘法

有时,权重本身依赖于解 x。一个重要的例子是鲁棒估计,其损失函数不是平方误差,而是绝对误差:

minₓ Σᵢ |aᵢ - fᵢ(x)|

这可以改写为一个加权最小二乘问题,其中权重 wᵢ(x) = 1 / |aᵢ - fᵢ(x)|。由于权重依赖于 x,我们可以采用迭代求解策略:

  1. 固定当前迭代的权重 wᵢ(xᵗ)
  2. 求解加权最小二乘问题以更新 xᵗ⁺¹
  3. 用新的 x 重新计算权重。

这种方法称为迭代重加权最小二乘法。虽然它在实践中效果很好,但需要注意的是,由于问题整体通常是非凸的,算法只能保证找到局部最优解。

非线性最小二乘与捆绑调整

现在,我们来看更一般的形式:非线性最小二乘估计。其目标是:

minₓ Σᵢ rᵢ(x)²

其中,rᵢ(x) 是依赖于参数 x 的残差函数。这正是捆绑调整问题的形式:rᵢⱼ(x) 表示第 j 个三维点在第 i 个相机视图中的投影位置与观测到的图像位置之间的差异。

通过将导数设为零,我们得到最优性条件:

Σᵢ rᵢ(x) * (∂rᵢ(x)/∂xⱼ) = 0, 对于所有 j

由于这个方程通常无法直接解析求解,我们需要迭代算法。

牛顿法:利用二阶信息

牛顿法的核心思想是:在当前位置 xᵗ,用二阶泰勒展开(抛物线)来局部近似损失函数 E(x)

E(x) ≈ E(xᵗ) + gᵀ(x - xᵗ) + ½ (x - xᵗ)ᵀ H (x - xᵗ)

其中,g 是梯度向量,H 是海森矩阵(二阶导数矩阵)。然后,我们直接跳到这个抛物线的极小值点,该点可通过求解线性方程组得到:

xᵗ⁺¹ = xᵗ - H⁻¹ g

与梯度下降法 xᵗ⁺¹ = xᵗ - ε g 相比,牛顿法用海森矩阵的逆 H⁻¹ 替代了固定步长 ε,实现了自适应的、通常更快的收敛。然而,牛顿法需要计算并求逆海森矩阵,这在问题规模很大时计算代价高昂,并且要求海森矩阵正定才能保证更新方向正确。

高斯-牛顿法:针对最小二乘的简化

对于非线性最小二乘这一特殊形式,我们可以推导出一个更实用的算法:高斯-牛顿法。它是对牛顿法的近似。

回顾我们的损失函数 E(x) = Σᵢ rᵢ(x)²。其梯度和海森矩阵为:

  • 梯度 g = 2 Jᵀ r,其中 J 是残差 r 对参数 x 的雅可比矩阵。
  • 海森矩阵 H = 2(JᵀJ + Σᵢ rᵢ ∇²rᵢ)

高斯-牛顿法的关键近似是忽略海森矩阵中涉及残差二阶导数 ∇²rᵢ 的项。这基于两种合理假设:

  1. 在最优解附近,残差 rᵢ 很小,使得该项可忽略。
  2. 残差函数 rᵢ(x) 接近线性,其二阶导数本身接近零。

在此近似下,海森矩阵变为 H ≈ 2 JᵀJ。代入牛顿法的更新公式,得到高斯-牛顿法的更新规则:

xᵗ⁺¹ = xᵗ - (JᵀJ)⁻¹ Jᵀ r

高斯-牛顿法的优势在于:

  • 只需计算残差的一阶导数(雅可比矩阵 J),无需计算二阶导数。
  • 近似的海森矩阵 JᵀJ 总是半正定的,这保证了更新方向的合理性。

莱文贝格-马夸特算法:自适应混合策略

莱文贝格-马夸特算法可以看作高斯-牛顿法与梯度下降法之间的一个自适应混合。它在高斯-牛顿法的更新公式中引入了一个阻尼因子 λ

xᵗ⁺¹ = xᵗ - (JᵀJ + λ I)⁻¹ Jᵀ r

算法行为分析

  • λ → 0 时,更新规则退化为高斯-牛顿法。
  • λ → ∞ 时,矩阵 JᵀJ 的影响可以忽略,更新规则近似为梯度下降法,步长为 1/λ

策略:在优化开始时,使用较大的 λ 值(更像梯度下降),以确保在远离最优解的区域稳定下降。随着迭代接近收敛,逐渐减小 λ 值(更像高斯-牛顿),以加速收敛。

马夸特进一步提出了一种改进,将阻尼项改为 λ * diag(JᵀJ),即使用 JᵀJ 对角线元素的比例进行阻尼。这使得算法在损失函数呈各向异性(例如狭长的山谷状)时能更有效地调整不同参数方向上的步长,从而加快收敛。

总结与展望

本节课中我们一起学习了非线性优化的核心算法。我们从基础的线性与加权最小二乘出发,探讨了牛顿法如何利用二阶信息实现快速收敛,并针对非线性最小二乘问题推导出了更实用、只需一阶导数的高斯-牛顿法。最后,我们介绍了莱文贝格-马夸特算法,它通过自适应地混合高斯-牛顿法和梯度下降法的优点,成为解决像捆绑调整这类实际问题的强大且鲁棒的工具。

下一节,我们将具体讨论如何将这些算法应用于捆绑调整问题,并处理其大规模、稀疏的特性。

015:捆绑调整-非线性优化 第3部分 👨‍🏫

在本节课中,我们将学习捆绑调整问题的数值求解方法。我们将深入探讨如何通过非线性最小二乘优化,联合估计相机运动和三维结构,并介绍一种名为“幂捆绑调整”的新型高效求解算法。


概述

捆绑调整的核心思想是通过最小化一个损失函数,来联合优化相机运动参数和三维场景结构。这是一个典型的非线性最小二乘问题,因为观测到的投影点与根据相机参数和三维点计算出的投影点之间的残差,与未知参数(相机位姿、三维点坐标)之间的关系是非线性的。

上一节我们介绍了捆绑调整的基本数学模型,本节中我们来看看如何高效地求解这个大规模非线性优化问题。


损失函数与问题规模

捆绑调整的损失函数定义如下:

其中:

  • m 是图像数量。
  • n 是三维点的数量。
  • θ_ij 是一个指示变量,如果第 j 个点在图像 i 中可见则为1,否则为0。
  • x_ij 是在图像 i 中观测到的第 j 个点的二维坐标。
  • π(·) 是透视投影函数。
  • R_i, t_i 是第 i 个相机的旋转和平移参数。
  • X_j 是第 j 个三维点的坐标。

我们需要估计的参数总数是 6m + 3n(每个相机6个参数,每个三维点3个参数)。观测值的数量最多可达 m * n。随着图像和点数的增加,观测值的数量增长快于未知参数的数量,这有助于更好地约束重建问题。


非线性最小二乘求解算法

由于残差 r 是参数的非线性函数,我们面临的是一个非线性最小二乘问题,其一般形式为:
min Σ || r(x) ||²

对于这类问题,高斯-牛顿法及其变种是常用且强大的求解工具。

高斯-牛顿法

牛顿法通过在当前估计点拟合一个二次曲面(抛物面),并直接跳到该抛物面的最小值来进行更新,更新公式为:
x_new = x_old - H⁻¹ * ∇f
其中 H 是海森矩阵(二阶导数矩阵),∇f 是梯度。

对于我们的平方和损失函数,精确的海森矩阵计算涉及两项:
H = JᵀJ + Σ (r * ∂²r/∂x²)
其中 J 是残差对参数的雅可比矩阵(一阶导数)。

高斯-牛顿法的核心思想是忽略上述公式中的第二项(即残差乘以二阶导数的和)。这个近似在残差较小或接近线性时是合理的。因此,我们用 JᵀJ 来近似海森矩阵 H

这样,高斯-牛顿法的更新步骤变为:
x_new = x_old - (JᵀJ)⁻¹ * (Jᵀr)
这既利用了二阶信息(近似海森),又只需计算一阶导数(雅可比矩阵),在计算上比完整的牛顿法更高效。

莱文贝格-马夸特算法

高斯-牛顿法在远离最优解或近似海森矩阵 JᵀJ 病态时可能不稳定。莱文贝格-马夸特算法通过引入阻尼项来改进它。

其更新公式为:
x_new = x_old - (JᵀJ + λI)⁻¹ * (Jᵀr)
或更一般的形式:
x_new = x_old - (JᵀJ + λ diag(JᵀJ))⁻¹ * (Jᵀr)

  • 阻尼参数 λ:控制更新步长。
    • λ 很大时,(JᵀJ + λI)⁻¹ ≈ (1/λ)I,算法类似于小步长的梯度下降法,适合在初始阶段或远离解时使用。
    • λ 很小时,算法接近高斯-牛顿法,在接近解时能快速收敛。
  • 各向异性阻尼:使用 diag(JᵀJ) 可以根据不同参数方向的曲率进行自适应阻尼,在平坦方向迈大步,在陡峭方向迈小步。

选择高斯-牛顿、莱文贝格还是马夸特变体,取决于具体问题。有时简单的高斯-牛顿法效果也很好。


捆绑调整的特定结构与舒尔补

将捆绑调整的未知参数向量 x 分为相机位姿参数 x_p 和路标点参数 x_l。通过线性化残差,并加入阻尼项,我们得到一个关于参数增量 Δx = [Δx_p; Δx_l] 的二次损失函数,最小化它导出一个线性方程组,称为正规方程

[ U W ] [ Δx_p ] = [ b_p ]
[ Wᵀ V ] [ Δx_l ] [ b_l ]

其中:

  • U 与相机-相机参数相关,规模较小 (6m x 6m)。
  • V 与路标点-路标点参数相关,规模巨大 (3n x 3n)。
  • W 表示相机与路标点参数之间的耦合。

由于三维点通常不会出现在所有图像中,矩阵 V 具有块对角结构,这意味着非零元素仅出现在主对角线附近的块中,这使得 V 的求逆非常高效。

直接求解这个庞大的系统矩阵是不现实的。这里的关键技巧是使用舒尔补进行消元。通过线性代数变换,我们可以将原方程等价地转换为:

[ S 0 ] [ Δx_p ] = [ b_p - W V⁻¹ b_l ]
[ Wᵀ V ] [ Δx_l ] [ b_l ]

其中 S = U - W V⁻¹ Wᵀ 称为舒尔补矩阵。

这个变换的美妙之处在于产生了零块矩阵。现在我们可以分两步高效求解:

  1. 求解简化相机系统S * Δx_p = b_p - W V⁻¹ b_l
    这是一个只涉及相机参数增量 Δx_p 的方程,规模大大减小。
  2. 回代求解路标点Δx_l = V⁻¹ (b_l - Wᵀ Δx_p)
    由于 V 是块对角矩阵,其求逆和乘法运算都非常快。

因此,捆绑调整的计算瓶颈就变成了求解简化相机系统 S * Δx_p = ...


幂捆绑调整:一种新型高效求解器

传统上,简化相机系统使用共轭梯度等迭代法求解。然而,一种名为幂捆绑调整的新方法显著提升了求解效率。

该方法的核心是利用矩阵的几何级数(幂级数) 来近似舒尔补矩阵 S 的逆。

回顾一下,对于标量 r (|r| < 1),有:
1 / (1 - r) = Σ_{i=0}^{∞} rⁱ

这个性质可以推广到矩阵。如果矩阵 M 的谱半径(最大特征值模)小于1,那么:
(I - M)⁻¹ ≈ Σ_{i=0}^{k} Mⁱ,当 k 足够大时近似程度很高。

在我们的问题中,舒尔补矩阵 S 可以写成 S = U (I - M) 的形式,其中 M = U⁻¹ W V⁻¹ Wᵀ。因此,S⁻¹ 可以近似为:
S⁻¹ ≈ ( Σ_{i=0}^{k} Mⁱ ) * U⁻¹

这种方法的巨大优势在于:

  • 无需矩阵求逆:只需要进行矩阵乘法运算。现代计算硬件(如GPU)对矩阵乘法有极高的优化。
  • 内存效率高:可以原地进行矩阵运算,无需存储庞大的稠密矩阵。
  • 速度快、精度好:通过选择适当的截断阶数 k,可以在速度和精度之间取得良好平衡。

实验表明,幂捆绑调整在广泛使用的基准数据集上,相比传统方法(如平方根捆绑调整、Cholesky求解器)具有显著优势:

  • 速度更快:在达到相同优化精度时,耗时显著减少。
  • 精度更高:在相同时间内,能达到更低的损失函数值。
  • 内存占用更少:内存消耗可比最快竞争者少5倍,比通用求解器少2倍,这对于处理超大规模问题至关重要。


性能对比图显示,幂捆绑调整(橙色、蓝色曲线)在大多数精度要求下都优于传统方法。


应用实例

捆绑调整技术是许多现代计算机视觉应用的核心。

从网络照片集进行三维重建

研究人员提出了一种方法,通过输入搜索词(如“巴黎圣母院”),自动从互联网收集相关照片,经过严格的图像筛选(剔除颜色不一致、无相机参数等信息或内容不相关的图片),然后使用捆绑调整等技术,重建出地标建筑物的三维点云模型。这证明了仅从网络图像即可重建世界的能力。

并行跟踪与建图

PTAM 是一个里程碑式的工作,它首次在移动设备上实现了实时的相机跟踪和场景地图构建。该系统通过并行线程处理跟踪(估计当前相机位姿)和建图(优化三维点云和关键帧位姿),为增强现实应用奠定了基础。基于此,可以稳定地将虚拟物体叠加到实时视频流中。


这些技术也直接推动了如微软HoloLens等消费级增强现实设备的发展。


总结

本节课中我们一起学习了捆绑调整的数值求解全流程:

  1. 我们首先回顾了捆绑调整的非线性最小二乘问题形式。
  2. 接着,介绍了求解此类问题的高斯-牛顿法及莱文贝格-马夸特阻尼算法。
  3. 然后,深入分析了捆绑调整问题特有的稀疏块矩阵结构,并利用舒尔补技巧将大规模问题分解为更易求解的简化相机系统和路标点更新两步。
  4. 最后,我们重点介绍了一种前沿的高效求解器——幂捆绑调整。它利用矩阵幂级数近似求逆,避免了传统直接求逆法的计算和内存瓶颈,从而实现了更快、更准、更省内存的优化,为处理超大规模三维重建问题提供了强有力的工具。

捆绑调整作为联合优化结构和运动的核心技术,历经百年发展,至今仍是研究热点,并持续推动着三维视觉、机器人、增强现实等领域的进步。

016:视觉SLAM的直接方法 🎥

在本节课中,我们将学习视觉SLAM(同时定位与地图构建)中的“直接方法”。我们将探讨这些方法如何绕过传统的特征点提取与匹配步骤,直接从图像像素亮度信息中联合估计相机运动和三维结构,从而实现更鲁棒、更密集的重建。

概述

在之前的章节中,我们学习了经典的多视角重建方法,它们通常遵循一个多步骤的流程。然而,这种“间接”方法存在信息丢失和误差累积的问题。本节介绍的“直接方法”旨在通过一个统一的优化框架,直接从原始图像数据中求解相机运动和三维几何,从而克服这些局限性。

经典间接方法的局限性

上一节我们介绍了光束法平差,它是一种强大的优化框架。然而,在到达光束法平差之前,经典的视觉SLAM流程包含多个可能出错的步骤。

以下是经典多视角重建的典型步骤:

  1. 特征点提取:从图像中识别并提取特征点(如角点)。
  2. 特征点匹配:在不同图像间寻找特征点的对应关系(可使用光流或SIFT、BRIEF等描述子)。
  3. 运动估计:基于匹配点对,使用如八点法或五点法等算法估计相机运动。
  4. 光束法平差与稠密重建:利用估计的运动进行光束法平差优化,并最终可能计算稠密三维模型。

这个流程存在几个关键问题:

  • 信息丢失:第一步就丢弃了图像中大部分像素信息,仅使用一小部分特征点,这从信息利用的角度看并非最优。
  • 鲁棒性差:特征匹配步骤中的任何错误都会传播到后续的运动估计和重建中,导致结果恶化。
  • 流程割裂:运动估计、匹配和三维重建本质上是耦合的问题,分开求解并非最佳策略。

为了处理匹配错误,实践中常在步骤2和3之间加入RANSAC(随机采样一致性) 等启发式步骤来剔除误匹配,但这增加了算法的复杂度和计算成本。

直接方法的核心理念

鉴于间接方法的不足,直接方法应运而生。其核心思想是跳过特征提取与匹配的中间步骤,直接利用图像像素的亮度信息来联合优化相机运动和三维几何

直接方法的主要优势包括:

  • 更高的鲁棒性:利用所有像素信息,对噪声和图像变化(如光照)更不敏感。
  • 半稠密/稠密重建:能生成比稀疏点云更丰富、更连续的三维模型。
  • 潜在的高效性:省去了特征提取和匹配的计算开销,通常能在CPU上实现实时运行。

直接方法与间接方法的关键区别在于优化的目标函数:

  • 间接方法最小化重投影误差,即三维点投影到图像上的位置与观测到的特征点位置之间的差异。
  • 直接方法最小化光度一致性误差,即假设同一三维点在两个不同视角下的像素亮度应该相同。

其核心公式可以表示为:寻找相机运动 G 和深度图 D,使得对于图像 I1I2 中的像素 x,满足:
I1(x) ≈ I2( π( G · D(x) · x ) )
其中 π 是投影函数。这本质上是用三维空间的光度一致性来驱动整个估计过程。

直接方法的发展历程

慕尼黑工业大学是直接方法研究的重要推动者。以下是几个里程碑式的工作:

  1. 实时稠密几何重建 (2010):这项工作假设相机运动(由PTAM等工具提供)已知,专注于从单目视频流中实时估计稠密深度图。其损失函数包含光度一致性项和深度图平滑项(正则项),通过由粗到精的高斯-牛顿法在GPU上实时优化。
  2. RGB-D相机跟踪 (2011):这项工作假设深度信息已知(由RGB-D相机提供),专注于估计相机运动。它同样使用光度一致性误差,并通过高斯-牛顿法求解,实现了高精度的实时相机位姿跟踪。
  3. 位姿图优化:为了获得全局一致的相机轨迹,引入了位姿图优化。它通过优化整个相机序列的位姿,使其与所有帧间相对运动估计保持一致,有效消除了累积漂移,特别是在回环检测时。
  4. LSD-SLAM (2014):首个大规模、实时的单目直接法SLAM系统。它联合估计相机运动(在相似变换群Sim(3)上)和半稠密逆深度图,并集成了位姿图优化进行回环检测,能够重建大尺度场景。
  5. DSO (2017):直接稀疏里程计。它是对LSD-SLAM的进一步改进,实现了真正意义上的联合优化(窗口式光束法平差)。DSO显式建模了相机的光度标定(如伽马响应、渐晕效应),并在大量序列上展示了相比特征点方法(如ORB-SLAM)近一个数量级的精度提升,成为当时最先进的视觉里程计方案之一。

技术细节与优化

直接方法的核心是一个非线性最小二乘优化问题。以估计相机运动为例,其损失函数为:
E(ξ) = Σ [ I2( π( G(ξ) · D(x) · x ) ) - I1(x) ]²
其中 ξ 是李代数表示的相机运动参数。

为了求解,通常采用高斯-牛顿法

  1. 将残差函数在当前估计值 ξ 处进行一阶泰勒展开(线性化)。
  2. 求解线性化后的正规方程 (JᵀJ) δξ = -Jᵀ r,得到增量 δξ。其中 J 是残差对 ξ 的雅可比矩阵。
  3. 更新参数 ξ ← ξ + δξ,并迭代直至收敛。

雅可比矩阵的计算涉及链式法则,包括图像梯度、投影函数导数和李群导数等。虽然推导复杂,但最终通常归结为求解一个6x6的线性系统,计算效率很高。

总结

本节课我们一起学习了视觉SLAM中的直接方法。我们从经典间接方法的局限性出发,探讨了直接方法如何通过最小化光度误差,直接从像素亮度联合估计相机运动和三维结构。我们回顾了从稠密深度估计、RGB-D跟踪到位姿图优化,再到里程碑式的LSD-SLAM和DSO的发展脉络。这些方法因其更高的鲁棒性、精度和潜力,为当今许多增强现实和机器人视觉系统奠定了坚实基础。直接方法的核心在于将视觉重建视为一个整体的优化问题,充分利用了图像中的全部信息。

017:视觉SLAM的直接方法回顾 🎥

在本节课中,我们将回顾视觉SLAM(同时定位与建图)中的直接方法。我们将探讨其核心思想、发展历程、关键算法以及当前面临的挑战。

上一节我们介绍了多视角几何的基础概念,本节中我们来看看如何绕过特征点提取,直接从图像像素亮度值进行三维重建。

概述:从数据到模型

直接方法的核心思想非常简单:直接从原始传感器数据(即相机获取的亮度值)出发,重建相机运动和三维结构。这与传统的特征点方法形成对比。

传统方法(如光束法平差)的流程是:提取特征点 -> 建立点对应关系 -> 匹配 -> 计算重投影误差并最小化。直接方法则避免了第一步的抽象,其关键驱动力是光度一致性颜色一致性

换句话说,我们希望找到一个数据模型(描述世界如何通过相机运动投影为图像),使得该模型能够最好地解释观测到的数据。这本质上是概率推断和贝叶斯推断的思路:在给定数据(即传感器亮度值)的情况下,寻找最可能的世界解释。

核心思想:光度一致性

直接方法基于一个基本假设:一个三维点在所有观测到它的图像中,其颜色或亮度应该是一致的。

以下是其数学表述的核心:

对于一个参考图像 I1 中的像素点 x(齐次坐标),其强度为 I1(x)。该点对应的三维点可通过逆深度 h(x) 得到:X = h(x) * x。将该三维点通过第 i 个相机位姿的刚体变换 G_i 和透视投影 π 映射到图像 I_i 中,得到投影点 x' = π(G_i * (h(x) * x))。那么,光度一致性要求:

I1(x) ≈ Ii(x')

我们的目标是找到所有像素的逆深度图 h(x) 和所有相机位姿 G_i,使得所有对应点之间的光度差异总和最小。

早期工作:实时稠密重建

以下是早期直接方法的一个里程碑式工作。

  • 实时稠密几何 (2010): 这是首个已知的能够从手持相机进行实时稠密重建的方法。它直接在GPU上运行,优化整个稠密深度图。
    • 方法:为图像中每一个像素 x 估计其逆深度 h(x)
    • 优化目标:最小化所有像素在所有图像中的光度误差之和。
    • 正则化:引入空间平滑正则项,使深度图在相邻像素间变化平缓,类似于在场景表面覆盖一层“肥皂膜”。这在缺乏纹理的区域(如白墙)能产生合理的填充效果。
    • 性质:这是一种变分方法,通过设置关于 h 的损失函数并求解其最小化问题来得到深度图。

重要发展:LSD-SLAM 与 DSO

直接方法随后朝着大规模、实时、联合优化的方向发展。

  • LSD-SLAM (大规模直接法SLAM):
    • 创新点:首次实现了使用单个灰度相机进行大规模、实时的同步定位与地图构建。
    • 特点:在CPU上实时运行,生成半稠密地图(约50%的像素有深度值)。它避免在无纹理区域“幻想”深度值,只在梯度明显的区域估计深度。
    • 优化方式:采用交替优化策略,轮流估计深度图和相机运动。

  • DSO (直接稀疏里程计):
    • 改进一:光度校准:精确建模相机传感器特性(如光圈变化、渐晕效应),从假设“亮度恒定”推进到假设“辐照度恒定”,从而得到更精确的模型。
    • 改进二:联合优化:采用类似光束法平差的高斯-牛顿框架,联合优化相机位姿和三维点(逆深度),而不是交替优化。
    • 策略:使用滑动窗口优化,只联合优化最近的一系列关键帧,在保证精度的同时满足实时性要求。
    • 性能:在精度和鲁棒性上显著超越LSD-SLAM和当时流行的ORB-SLAM等方法,尤其对动态物体更鲁棒。

现实挑战与当前研究方向

尽管直接方法性能优异,但在实际部署中仍面临挑战,这也是当前的研究热点。

以下是直接方法在实际应用中遇到的主要问题。

  1. 相机标定需求:DSO等方法需要事先进行光度校准,而普通用户往往希望即插即用。
  2. 全局快门 vs. 滚动快门:大多数消费级相机(如智能手机)使用滚动快门,图像每行曝光时间不同,在相机运动时会导致图像扭曲。传统特征点法通过最小化几何(重投影)误差对此有一定容忍度,而直接法处理原始亮度值,受其影响更大。
  3. 视频压缩:许多相机输出的是压缩后的视频,而非原始亮度数据,这会影响基于原始亮度的算法精度。

当前,计算机视觉领域,特别是3D视觉和SLAM,正经历着深度学习带来的变革。一个核心挑战是:

如何将神经网络应用于SLAM问题?

虽然深度学习在物体识别、光流、深度估计等任务上取得了巨大成功,但构建纯粹基于学习的、性能超越经典方法的SLAM系统仍是尚未完全攻克的难题。目前的研究集中在利用深度学习增强SLAM系统,并朝着完全学习化的方向发展。

总结

本节课中我们一起回顾了视觉SLAM中的直接方法。我们从其核心思想——光度一致性出发,了解了它如何绕过特征提取,直接从像素亮度重建三维世界。我们回顾了从早期实时稠密重建,到LSD-SLAM实现大规模实时半稠密建图,再到DSO通过光度校准和联合优化实现高精度的演进历程。最后,我们探讨了直接方法在实际部署中面临的挑战(如标定、滚动快门)以及当前结合深度学习的研究趋势。直接方法因其紧密联系数据本质的特性,仍然是三维视觉领域中一个强大且活跃的研究方向。

018:变分多视图重建(第一部分)🚀

在本节课中,我们将要学习变分方法在多视图三维重建中的应用。我们将探讨如何将三维重建问题表述为一个在无限维空间(即所有可能表面的空间)中的能量最小化问题,并介绍不同的表面表示方法及其优缺点。


变分方法简介

上一节我们介绍了稀疏重建方法(如光束法平差)。本节中我们来看看如何实现密集重建,即推断出整个三维世界的稠密结构。

变分方法的核心思想是:我们希望找到一个表面 S 来表示场景中的物体。为此,我们为所有可能的表面定义一个能量函数损失函数 E(S)。然后,我们的目标是在所有可想象的表面空间中,找到使该能量最小的那个表面。

这个过程之所以被称为“变分”,是因为我们从一个初始表面 S_init 开始,然后通过无穷小地变化这个表面,沿着梯度下降的方向,逐步降低能量,最终找到最优表面。这与我们在数值优化和光束法平差中学到的梯度下降原理相同。

关键区别在于,这里的优化空间是无限维的。表面上的每个点都可以独立移动,因此存在无限多个自由度。这是一个无限维优化问题

形状优化与表面表示

当我们把三维重建视为变分问题时,首要问题是:如何表示表面 S? 选择何种数学表示至关重要,这个领域被称为形状优化

形状优化在数学中是一个广泛的领域,不仅用于三维重建,还用于飞机机翼、汽车外形等工业设计,旨在找到满足特定物理属性(如稳定性、空气动力学)的最优形状。

以下是选择表面表示时需要考虑的两个关键属性:

  • 紧凑性:表示形状所需的内存大小。
  • 计算效率:基于该表示,优化问题是否可解。

不幸的是,没有一种表示方法在所有方面都是最优的。不同的表示各有优劣。

显式与隐式表示

所有表面表示方法大致可分为两类:显式表示隐式表示

显式表示

显式表示直接存储构成表面的点。常见的例子包括多边形网格或样条曲面。

样条曲面(如B样条)使用一组控制点 C_i 和固定的基函数 B_i 来定义表面。表面上的点由控制点与基函数的线性组合给出:

公式:S(u, v) = Σ_i Σ_j C_ij * B_i(u) * B_j(v)

其中 (u, v) 是二维参数坐标。

显式表示的优点是非常紧凑。例如,一条复杂曲线可能仅由十几个控制点(几十个变量)就能精确表示。通过移动控制点,可以平滑地变形整个表面。历史上,样条正是为了优化汽车外形而被发明的。

然而,显式表示存在一些缺点:

  1. 难以处理拓扑变化:一个样条曲面具有固定的拓扑结构(如球面、环面)。如果物体在变形过程中需要分裂或合并(例如,从球体变成两个分离的物体),用样条表示会非常困难。
  2. 参数化不唯一:同一个几何形状可以有多种不同的控制点配置来表示,这给形状比较和识别带来了困难。

隐式表示

隐式表示不直接存储表面点,而是对表面所处的整个环境空间进行标记。主要有两种流行的方法:

  1. 指示函数:为空间中的每个体素(或点)分配一个标签。例如,定义函数 U(x),在物体内部 U(x)=1,在外部 U(x)=0。表面即位于 01 之间的边界处。
  2. 有符号距离函数:为空间中的每个点存储其到最近表面点的距离。在物体内部距离为正,外部为负。表面位于距离为零的等值面上。

隐式表示具有显著优势:

  • 拓扑无关性:可以轻松表示具有任意数量孔洞的物体,并能自然地处理拓扑变化(分裂、合并)。
  • 表示唯一性:对于给定的形状,其指示函数或有符号距离函数是唯一的。
  • 可能实现凸优化:当能量函数基于隐式表示构建时,优化问题有时可以转化为凸问题,从而保证找到全局最优解。

隐式表示的主要缺点是内存消耗大,因为它需要标记整个空间。但可以通过八叉树等自适应数据结构来缓解——只在表面附近进行精细划分,在远离表面的均匀区域使用粗划分,从而高效管理内存。

基于光一致性的变分重建

现在,我们来看看如何将多视图重建构建为一个形状优化问题。核心思想是利用光一致性

假设相机已标定。对于三维空间中的任意点 x,我们可以将其投影到所有图像中。如果 x 位于物体表面上,那么它在所有图像中的颜色(或图像块)应该是一致的。如果 x 在物体内部或外部,不同视角看到的颜色很可能不同。

因此,我们可以为每个三维点 x 计算一个光一致性函数 ρ(x),其值在 01 之间。ρ(x) 值低表示颜色一致(可能位于表面),值高表示不一致。

一个直观的想法是:寻找一个表面 S,使得其上的光一致性总和最小(即表面尽可能通过颜色一致的点):

最小化:∫_{S} ρ(x) dA

然而,这个简单的公式存在一个严重问题:收缩偏差。因为 ρ(x) 非负,通过缩小表面积(甚至缩小到空集)总能降低总能量。因此,该能量的全局最优解是空表面,这显然不是我们想要的。

加入轮廓一致性约束

为了解决收缩问题,我们必须利用从图像中获得的另一个强约束:轮廓一致性

在每个图像中,我们可以分割出物体的轮廓(前景区域)。正确的三维表面 S 投影到每个图像上时,必须完全覆盖该图像的轮廓区域,并且不能投影到轮廓外的区域。

因此,我们将重建问题表述为一个带约束的优化问题

最小化:∫_{S} ρ(x) dA
约束条件:对于每个图像 i,投影 Π_i(S) = 轮廓区域 S_i

这个约束确保了重建表面不是空的,并且与所有观测到的轮廓一致。

基于指示函数的凸优化公式

为了实现高效的优化,我们采用隐式表示中的指示函数 U(x)。可以证明,上述优化问题可以重新表述为:

最小化:∫_{Ω} ρ(x) ||∇U(x)|| d³x
约束条件:

  1. 线性轮廓约束(对于每个图像像素射线):
    • 若像素在轮廓内:∫_{射线} U(x) ds ≥ 1
    • 若像素在轮廓外:∫_{射线} U(x) ds = 0
  2. U(x) ∈ [0, 1] (允许模糊隶属度时,这是一个凸约束)

这里的关键在于:

  • ∫ ρ(x) ||∇U(x)|| d³x 项是全变分,它精确地等价于加权表面积 ∫_{S} ρ(x) dA,并且是凸函数。
  • 轮廓约束是线性约束,也是凸的。
  • 因此,整个优化问题是一个凸优化问题,我们可以计算出全局最优解

这种方法能够产生非常精确且细节丰富的重建结果,因为它既利用了光一致性,又通过轮廓约束防止了表面收缩,保留了精细结构。

超分辨率纹理映射

在获得几何表面后,我们还需要为其赋予颜色(纹理)。简单的做法是从图像中投影颜色并平均,但这会导致纹理模糊。

我们可以再次利用变分方法进行超分辨率纹理重建。其思想是寻找一个高分辨率、清晰的纹理 T,使得该纹理在经过模拟相机成像过程(模糊和下采样)后,与所有观测图像匹配。这可以表述为另一个凸优化问题:

**最小化:Σ_i || B ∘ T ∘ Π_i^{-1} - I_i ||² + λ ∫ ||∇T|| **

其中 B 是模糊和下采样算子,I_i 是第 i 张输入图像,λ 是一个小的正则化权重。通过求解这个问题,我们可以从多张低分辨率输入图像中,复原出远超单张图像分辨率的清晰纹理。


本节课中我们一起学习了变分多视图重建的基本框架。我们了解到,通过将重建问题转化为在无限维表面空间中的能量最小化问题,并巧妙地将轮廓约束与光一致性结合,可以构建出可求解凸优化问题,从而获得精确且稠密的三维重建结果。同时,基于变分思想的纹理映射方法还能实现超分辨率纹理恢复,获得极其逼真的三维模型。

019:变分多视图重建(第二部分)🎥

在本节课中,我们将继续学习变分多视图重建。上一节我们介绍了变分方法的基本思想及其在三维重建中的应用。本节中,我们将深入探讨其在超分辨率纹理、动态动作捕捉以及单视图三维重建等具体场景下的应用与效果。

超分辨率纹理重建

上一节结束时,我们展示了超分辨率纹理重建的结果。以下是其核心原理的解释。

输入图像中的每个像素值,实际上是场景中一个小区域(patch)内颜色值的平均值。我们可以用一个网格来理解这个过程。

当从不同视角观察同一场景时,投影的网格会发生偏移。这意味着同一个三维点会出现在不同图像的不同像素网格中。

因此,我们获得了同一个三维点在不同图像中的多个“平均颜色”测量值。通过收集大量这样的测量值,我们可以建立一个线性方程组来反推出原始的高分辨率颜色信息。

核心公式
设我们关心的原始高分辨率颜色值为 X_i,在图像中测量到的平均颜色值为 Y_iY_iX_i 及其邻域 N(i) 内其他颜色值的平均:
Y_i = (1 / |N(i)|) * Σ_{j in N(i)} X_j
通过从多个不同视角获得大量 Y_i 的观测,我们可以求解出 X_i

这种方法之所以有效,是因为同一个三维点的颜色信息被多次观测,每次都以略微不同的“平均”形式出现,从而提供了足够的信息来消除模糊性。

动态动作的三维重建

接下来,我们看看如何将变分方法应用于动态场景的三维重建。

使用激光或结构光扫描仪获取静态物体的精确几何是有效的,但对于动态物体则非常耗时。相比之下,多相机同步拍摄可以捕捉随时间变化的动作。

通过同步的多视角视频,我们可以重建出随时间变化的三维动作模型,并将颜色纹理投影回模型表面。这种技术常被称为“自由视点电视”。

以下是该方法的一些应用实例:

  • 视频会议:未来的3D视频会议系统可以使用多个摄像头重建通话者的三维模型,并根据观看者的视线位置实时渲染对应视角,创造“隔窗相望”的沉浸感。
  • 体育分析:例如,在体操或足球运动中,通过三维重建可以精确分析运动员的肢体动作和关节位置,用于技术纠正和战术分析。
  • 自由视点电视与沉浸式体验:观众可以在播放过程中自由选择观看视角,仿佛置身于场景之中,极大地增强了沉浸感。

技术细节与挑战

  • 时间一致性:对于每一时间步,我们独立进行三维重建,但会引入轻微的时序平滑约束,例如要求体素(voxel)的占用状态在相邻帧之间不应变化过大。
  • 朗伯体假设:该方法的核心假设是场景满足朗伯反射,即物体表面颜色不随视角改变。这对于大多数自然物体成立,但对于镜面反射强烈的物体(如光滑的球体),重建质量会下降。
  • 轮廓提取:准确从图像中提取前景轮廓( silhouette )是关键挑战之一。即使在绿幕环境下,光线反射等因素也会使轮廓提取变得复杂。需要快速、自动化的算法来处理海量的图像数据。

基于单张图像的三维重建

现在,我们探讨一个更极端的场景:仅从单张图像进行三维重建。这展示了变分方法在特定约束下的强大能力。

问题定义:给定一张单个物体的图像(例如下图中的石拱门)及其轮廓,能否重建出其三维模型?仅凭单视图,物体的厚度信息是未知的,因此问题本身是不适定的。

解决方案——“吹气球”模型
我们可以想象在物体轮廓内放置一个气球并向内吹气。气球会膨胀并贴合轮廓,形成一个三维表面。这个表面有一个自然属性:在给定体积下,其表面积最小(就像真实的气球一样)。我们将此表述为一个变分优化问题。

数学模型
我们需要找到一个三维表面 S,使其满足以下条件:

  1. 表面积最小化:这对应于最小化表面的总面积。
  2. 体积约束:表面所包围的体积等于用户指定的参数 V0(即“吹入的空气量”)。
  3. 轮廓一致性:将表面 S 投影到图像平面上,必须与输入的物体轮廓 S0 完全匹配。

使用二值指示函数 u(x)(在物体内部为1,外部为0)来表示三维空间 occupancy。那么:

  • 表面积可以表示为函数 u全变分(Total Variation)TV(u) = ∫ |∇u| dx。对于二值函数,该积分恰好等于表面的面积。
  • 体积约束为:∫ u(x) dx = V0
  • 轮廓约束为:Π(u) = S0,其中 Π 是投影算子。

因此,优化问题为:

min_u TV(u)
s.t. ∫ u(x) dx = V0
     Π(u) = S0

实现与效果
通过高效的数值方法,可以在几分之一秒内求解此优化问题,并允许用户交互式地调整体积参数 V0

以下是该方法的一些结果展示:

  • 对于拱门、茶壶、甲虫等物体,仅从单张图像就能生成视觉上合理的三维模型,并能渲染出新颖视角。
  • 重建出的模型遵循“最小表面”原则:在轮廓狭窄处体积小,在轮廓宽大处体积膨胀,这与许多自然物体的形态相符。
  • 获得三维模型后,可以进一步改变其材质属性(如金属、光泽等),进行虚拟渲染。

方法特点与局限

  • 无需学习:该方法不依赖任何训练数据集,完全基于几何和物理原理(最小表面)。
  • 适用性:适用于形状接近“膨胀体”或自然紧凑的物体。对于具有尖锐棱角的人造物体(如老式汽车),重建效果可能不理想。
  • 交互需求:通常需要用户简单交互(如涂鸦)来提供前景/背景线索,以提取精确的物体轮廓。

总结

本节课中,我们一起深入学习了变分多视图重建技术的几个高级应用。我们首先解释了超分辨率纹理重建如何通过多视角下的平均颜色观测来反推高分辨率细节。接着,探讨了如何将重建技术应用于动态动作捕捉,以实现自由视点电视、体育分析和沉浸式通信等应用,并讨论了其中的朗伯体假设和轮廓提取挑战。最后,我们展示了一个巧妙的变分方法应用——仅从单张图像出发,通过“最小表面”模型重建出视觉合理的三维形状,这体现了变分方法在强先验约束下解决不适定问题的强大能力。这些内容表明,三维重建领域依然充满活力,结合几何原理与优化方法,能够不断产生创新且实用的解决方案。

020:多视图重建的最新进展(第一部分) 📸

在本节课中,我们将探讨基于相机的三维重建和从图像中获取三维信息领域的最新进展。本章有两个主要目标:首先,展示该领域正在发生的许多令人兴奋的事情;其次,指出一些可能对您完成毕业论文(例如硕士论文)有价值的潜在研究方向。因此,我决定在本课程中前所未有地引入大量最新发展,一方面概述正在发生的研究进展,另一方面邀请我的多位学生准备简短的研究报告,以突出他们自己的研究,并宣传可能与之相关的硕士论文课题。

上一节我们介绍了课程的目标和结构,本节中我们来看看一个核心的研究领域:视觉SLAM(即时定位与地图构建)。

视觉SLAM与传感器融合

我讨论过SLAM、运动恢复结构(SfM)和视觉SLAM。其中一个工作是LSD-SLAM。我也讨论过直接稀疏里程计(DSO)。

直接稀疏里程计这类方法能够以高精度实时恢复相机的运动和世界的三维结构。

现在,我们可以对这些系统进行多方面的优化。这里展示的只是一个现成的灰度相机系统。但显然,一旦进入机器人、自动驾驶汽车或自主无人机等应用领域(这是我们几十年来一直在做的),我们可能希望集成更多传感器。

例如,在我上一家初创公司Artisense,我们开发了多传感器系统。这些系统通常包含两个同步、时间戳对齐且经过校准的相机,板上还有惯性测量单元(IMU),甚至可能包含GPS信息。然后,所有这些信息被收集起来,我们可以创建运行在板载设备或云端的空间AI实时算法来处理这些数据。显然,如果接入更多传感器,就能同时提升这些系统的精度和鲁棒性。

视觉惯性里程计(VIO)

以下是一个例子,由我团队的Lucas Fontomberg开发,称为DMVIO。它解决了使用IMU跟踪相机的问题,类似于智能手机上的配置:一个相机和一个惯性测量单元。

惯性测量单元类似于人类耳朵里的前庭系统,它能告诉你关于方向和加速度的信息。这个系统就是导致有人在车里晕车呕吐的原因(就像我小时候和我儿子现在会经历的那样)。为什么会发生这种情况?这很有趣。当你坐在车后座看书,然后车子开动(比如开往罗马市中心),有些人就会开始感到恶心。大约一半的人会有这种反应。在我的家庭里,我儿子会吐,我女儿不会。我一直想知道原因。有一天,有人向我解释了:人类有多个感官来感知世界,在这个例子中,主要是眼睛告诉你如何运动,前庭系统测量加速度并告诉你如何运动。如果这两个感官的输入不匹配(比如你在看书,眼睛告诉你没有动,但前庭系统感觉到了车的运动),感官就会失调。感官失调的一种情况是当我们吃了有毒的东西时。从进化角度看,当感官失调时,本能的反射是将毒物呕吐出体外。因此,在行驶的车里呕吐的人,在进化上可能更接近他们的祖先。但作为人类,我们利用所有感官在空间中定位自己。那么,我们能否用类似智能手机上配备的相机和IMU的系统做同样的事情呢?这被称为视觉惯性里程计。

Lucas开发的方法在这里进行了演示。他在二楼行走,上到三楼。


然后他进入楼梯间。我们经常在楼梯间评估算法,在楼梯间里,中途光线很暗,视觉上结构很少,因为墙壁很光滑。尽管如此,这个系统仍能以前所未有的精度进行跟踪。在我们评估时,没有其他方法能做到他所做的。你可以看到他下了三层楼,又上了三层楼,回到他来的走廊,几乎没有漂移,非常精确,轨迹完全对齐。



这个系统实时运行,并且在室内、车上都能工作。视觉惯性系统非常有用,因为它是即插即用的。传感器方面非常小巧,只需要一个相机和一个IMU,非常轻便、小巧、廉价。你可以把它安装在任何地方,它就能跟踪并高精度地绘制三维世界。

现在你可以在一个全新的层面上玩增强现实游戏了。



我们还可以将这些传感器部署在汽车上,并广泛进行了测试。在这个项目中,我们将其部署在整个车队上,行驶了大约8000公里,绘制了整个广阔世界及其语义信息。你在这里看到的是可行驶区域、人行道、汽车、建筑物、植被等。我们可以利用在云端运行的神经网络来处理所有这些数据的语义信息。




这非常有用,因为你可以用非常廉价的基于相机的传感器实时绘制三维世界。

你不需要激光雷达传感器,只需要安装相机进行绘制。你可以提取语义信息,这对于自动驾驶很重要,因为你需要知道可行驶区域在哪里、人行道在哪里、潜在的行人、骑自行车的人等在哪里。我们可以提取所有这些信息,而且现在的神经网络非常擅长从图像中提取语义信息。我们在这里做的是标记我们通过这些图像看到的三维世界,而不仅仅是图像。

我认为我们在这个项目中更进一步,做了真正应该做的事情。计算机视觉在很长一段时间里都局限于处理图像。但事实是,在大多数应用中,我们并不关心图像本身,我们关心的是相机背后或前方的世界。这正是我们在这里能得到的:我们可以从语义上理解三维世界。而实现这一点的关键就是SLAM。

关于位置精度评估的问题:我们一直关注的是跟踪相机位置的精度。另一个问题是,我们恢复的三维世界有多精确?我认为精度稍低一些,但应该说足够精确以实现自动驾驶。精度应该在厘米级范围内。但如果你想要超精确的表面结构,那么激光雷达可能仍然更精确,因为它能提供毫米级精度。然而问题是,如果你想避开道路上的障碍物,你真的需要毫米级精度吗?一两厘米的精度难道不够吗?我认为我们目前的精度水平已经足够支持驾驶了。因此,我们在这里开发的许多实时语义建图技术都是为了推进自动驾驶技术。

神经网络革命

接下来,我们谈谈神经网络。我在课堂上没有过多涉及神经网络,但它们在过去的13年里彻底改变了计算机视觉。

这一切始于我的同事斯坦福大学的李飞飞和她的学生发布的一个名为ImageNet的数据集。这个数据集包含数百万张不同物体的图像,其中大多数物体是人类熟悉的,比如这张图。你可能认出这个物体是什么。总有一个主导物体,有人知道吗?这里的主导物体是什么?一只狗。哪只狗?这很重要,因为有不同的犬种。斑点狗,没错。

就是身上有黑点的那个。那这个呢?有人认出这是什么类别的物体吗?那是海星,对吧?不是狗,是某种植物。哪一个?有人知道吗?斐济果,是的,就叫这个名字。它是一种水果,但在德国我长大的时候不常见,现在可以买到。因此,如果你在树上看到它们(实际上可能不是树,是灌木丛之类的),大多数人只在超市的盒子里见过,通常不会在树上看到。所以,人类在这方面 notoriously 并不擅长。因此,当被要求对图像中的物体进行分类时,人类也难免会犯错,至少普通人是这样。

长期以来,人们提出了这个挑战:你能设计一个算法来识别图像中的物体吗?算法和人类都只能从有限数量的类别中选择。在2011年,最好的算法在某些数据集上会犯26个错误,而普通人类平均只犯5个错误。这是机器性能和人类性能之间的巨大差距,也是计算机视觉领域最大的谜团之一:我们能否达到人类水平的性能?

现在,如果你看看整个人工智能的历史,几十年来,人类一直试图构建表现出某种智能的机器。你可以从下棋之类的事情开始,但人类并非为下棋而进化。我们不是生来就会下棋,任何学过下棋的人都知道,这需要多年大量的练习。相比之下,用眼睛识别事物是我们与生俱来的能力。经过数千年的进化,我们被训练用眼睛理解周围的世界。为什么?因为你能越早发现面前的狮子,你就活得越久。这是一种非常强大的进化驱动力,驱使人们识别世界中的事物,甚至是伪装的事物。因此,对我来说,这才是真正的智能。我们需要以某种方式超越这种用感官理解世界的能力。因此,我认为计算机视觉是人工智能的核心,比其他任何东西都重要。为什么?因为对人类来说,视觉是主导感官。哺乳动物大脑的50%基本上在不断处理视觉信息。你的一半大脑皮层都在处理视觉信息处理。这告诉你两件事:首先,它很重要,否则我们不会把一半的脑力用在这个挑战上;其次,它并不容易,否则我们只需要5个神经元就能搞定。但识别事物、理解世界、感知事物是困难的,而重现这种能力正是计算机视觉。所以这是核心挑战之一。

在2011年,整个社区觉得我们永远无法接近人类水平的性能。然后,几乎神奇的事情发生了。Alex Krizhevsky和Jeff Hinton及其合作者提出应用深度神经网络。神经网络已经存在多年,并经过不断完善。在90年代末,我来自物理学背景,想做一些能影响世界的事情。所以在1997年完成物理学硕士后,我转向了神经网络。我对这个主题非常着迷,觉得它超级令人兴奋,因为它能重现人类认知和感知等能力。我记得在1997年给Jeff Hinton发了一封电子邮件,说:“亲爱的Hinton教授,我想攻读神经网络的博士学位,您需要人手吗?”他没有回复我的邮件。我知道这个事实,因为那时候我每天不会收到成百上千封邮件。也许我应该坚持并发送后续邮件。我给该领域的其他人发了邮件,有些人回复了,他们说:“年轻人,你看起来很有才华,为什么想进入一个完全死寂的领域?”我很震惊。那是1997年,确实是人工智能的冬天,也许是第二个或第三个冬天,取决于你怎么算。我非常失望,因为我确实相信深度网络和神经网络(当时还不深),我相信神经网络的这种方法。所以实际上我没有听劝,还是进入了神经网络领域,但不是和Jeff Hinton一起。

这是Jeff Hinton团队的一项工作,他们展示了深度网络的能力。你可能知道它们的工作原理:图像信息从左侧输入,然后通过不同的滤波和池化步骤逐层处理,最后在右侧得到分类输出。其思想是,你可以通过监督或某种自监督方式训练权重,使其达到最佳分类效果。最初,这些网络是为分类而设计的。你看,这个后来被称为AlexNet(以第一作者Alex Krizhevsky命名)的网络,将性能从26%的错误率大幅提升到16.4%。于是,我的整个社区都转向了神经网络,认为这是一种似乎很有前景的新形式主义。

因此,在接下来的几年里,人们设计了越来越深、越来越复杂的架构,使得在2015-16年左右,我们甚至能够在人类为进化而设计的任务上超越人类。所以对我来说,这张幻灯片标志着人工智能的真正突破:能够在人类为进化而设计的挑战上击败人类,而不是像下棋这样的人工挑战。当然,这并不是故事的结束,因为除了看到狮子,人类还能做更多的事情:他们能预测狮子下一步会做什么、它会如何移动等等,并且能预测最佳的生存反应。因此,人类拥有许多至今机器所不具备的技能,所以仍有改进的空间。但至少在识别物体这个特定挑战上,我们设法击败了人类。

话虽如此,不知为何,我从未觉得检测图像中的物体这件事很吸引人。我不太关心图像中是飞机、猫还是狗,这个挑战从来不是我的兴趣所在。我关心的是,在2012年那篇论文之后,我和我的团队以及世界上许多其他人开始研究的是:我们还能用神经网络做什么?我们能解决哪些其他挑战?

例如,在2015年(我们大约在2014年开始研究深度网络的多种应用),我们展示了可以用神经网络进行光流估计。我相信这是最早用深度网络做光流的工作,所以我们毫不意外地称之为FlowNet。今天几乎任何光流算法都可以追溯到那篇FlowNet论文。

我们进一步展示了其他问题也可以用深度网络解决。这应该说明,不是我们的工作,但我们也有其他工作表明可以用深度网络做立体视觉和场景流等。这是我剑桥大学的同事Robert T. Chipolla的工作,叫做SegNet,用于图像分割。也是在2015年出现。所以所有这些低层图像分析任务,如分割、光流估计、立体视觉等,我们都展示了可以用深度网络解决。我们还展示了像这个蛋白质结构预测的问题(也是2016年),可以用深度网络来预测蛋白质结构。

如果你关注新闻,就会知道这项工作最近获得了诺贝尔奖。令我们沮丧的是,AlphaFold团队从未引用我们的工作,尽管我们早了两年。

回到本课程的主题,出现的一个问题是:我能利用深度网络进行三维重建吗?在某种程度上,可以说在计算机视觉领域,直到今年,三维重建一直是传统方法的圣杯。

已经有基于学习的方法出现。这些是基于学习的方法的例子,大约在2017-18年开始出现,用于即时定位与地图构建。

它们大多数表明可以用深度网络来做,但都没有展现出最先进的性能。所以你可以做,但无法获得比我们已有的方法(如我的团队和其他团队开发的LSD-SLAM和DSO等SLAM方法)更好的性能。传统方法更好:它们更快,不需要训练数据,并且具有更高的精度、准确性和鲁棒性。

基于学习的方法为什么不如传统方法,这有点难以解释,但在某种程度上,将视频中的一组图像扔进某个黑盒深度网络,并希望它能神奇地给出轨迹和三维世界,可能期望过高了。也许它需要太多的训练数据,因为它可能需要所有种类的三维世界、所有种类的相机、所有种类的运动组合的训练数据,这种多样性太大了。也许数百万张图像都不足以训练它,我不知道。所以,在某种程度上,挑战在于适当地约束问题,并部署深度网络,使其真正超越基线方法。

这正是我们在这项工作中着手做的事情。这项工作建立在可以预测深度的神经网络之上。事实证明,这是2017年Krizhevsky本人及其合作者的一个例子:给定单张图像,可以预测深度。现在你会说,这怎么可能?原则上,我怎么知道物体有多远?它们可能在任意距离。但实际上,显然,当你在特定场景(如自动驾驶)中训练时,你知道汽车、物体、路灯等,它们都以特定的大小出现。所以我知道,即使对人类来说,如果我问你那辆车有多远,你也能告诉我。也许不是厘米级的精确,因为人类对数字从来都不擅长,但你可以说大约10米左右。所以,我可以训练一个神经网络来做完全相同的事情。我可以用监督方式训练它,或者像我们在这系列论文中所做的那样,用自监督方式训练。这是如何工作的?我们假设汽车中有一个立体相机系统。这意味着我们可以说,找到一个场景的深度,使得如果我将颜色投影到世界中,再投影回另一个相机,我应该得到颜色一致性。就像在SfM方法中一样,这种亮度或颜色一致性可以用来以自监督方式训练深度预测。这意味着我们不需要真实值(ground truth),也就是说,我们不必携带激光雷达扫描仪来告诉我们实际距离是多少。我们可以使用立体设置,这意味着它是廉价的。立体相机很便宜,你只需把它们安装在汽车上,可以连续行驶数天,创造无限量的训练数据。

因此,总的来说,我认为当今科学界的关键挑战是开发不需要真实值的自监督学习技术。正如你所见,我们的深度网络预测出非常清晰的深度,远优于基线方法。然后我们更进一步,将这些深度预测输入到SLAM方法中。所以我们有一个像DSO或LSD-SLAM这样的优化方法,然后将所有这些预测输入到SLAM流程中。更具体地说,给定两个连续图像 I_t 和 I_{t+1},我们训练一个神经网络来预测每张图像的深度,预测两帧之间的相对相机运动(位姿预测),我们还训练一个网络来预测不确定性。然后我们将所有这些预测输入到SLAM流程中。更具体地说,我们预测深度,预测相对相机运动(T代表相机在两帧之间的平移和旋转),一旦我们可以基于这个刚体运动进行相机对齐,我们就可以扭曲这两张图像并对齐亮度值。然后我们可以得到一个用于训练系统的残差,这是自监督的。这基本上是说,一旦我将图像投影到世界中,再投影回另一个相机,这些图像的颜色应该一致。我可以测量颜色差异或亮度差异,这就是我用来训练这些网络的残差。

一旦你对真实的相机这样做,它实际上并不奏效,因为真实的相机有光圈变化。所以同一张图像,一旦被扭曲,亮度就会非常不同。正如你在这里看到的,这是同一张图像,对人类来说看起来一样,但如果你比较实际的亮度值,它们非常不同,因为光圈改变了。但好的是,你也可以训练一个网络来预测整个图像的仿射亮度校正(强度的偏移和缩放),使其与另一张图像最一致。好的是,你可以训练网络来预测这两个参数,以模拟这种校正。然后你就有了可以用于训练DepthNet和PoseNet的一致亮度作为残差。

这对于朗伯世界(Lambertian world)有效。但正如我提到的,真实世界并不总是朗伯的,因为我们有闪亮的金属结构、镜面反射、玻璃窗等。整个人类世界有大量非朗伯结构。然后你必须问自己,在这一点上我能做什么?有不同的方法可以尝试:你可以尝试模拟世界的反射特性(BRDFs),可以尝试推断材料参数来模拟光线通过窗户的传输、衍射等光学现象,你可以尝试反转这个过程,从图像中重建三维世界和材料属性。我们在某种程度上尝试过,可以使其工作,但无法实时进行,因为模拟光传输的物理过程是一个非常复杂的现象,实时建模这些我认为是不可行的。

那么,我们能做什么呢?事实是,我们想跟踪相机,不关心周围事物的反射特性,我们只关心跟踪相机。所以我们可以训练一个神经网络来告诉我们哪些区域的亮度被保留,哪些区域没有。事实证明,你可以训练一个网络,对于测试图像,你得到的是这里看到的:汽车上的金属结构和窗户会亮起来,其他部分则较暗。这基本上告诉系统,你应该依赖较暗的区域来进行亮度一致性检查。所以你要做的是,通过所谓的异方差不确定性(sigma)来降低残差的权重。显然,如果你只这样做,那么它会降低所有像素的权重,因为这样会使成本降低。所以你需要一个正则化项,这都基于高斯假设,然后你会有log(sigma)项,基本上是说,你不能只是降低每个像素的权重,否则该项会变得很大。最终,你得到了一个自监督学习方法,它可以告诉你深度、相机运动、仿射亮度校正和不确定性。它只是告诉你哪些区域是朗伯的,哪些不是。

所以问题是:深度预测与深度相机或立体视觉相比如何?出人意料地好。目前社区存在分歧。有些人说深度预测不是很好,应该预测法线信息或相对深度(例如,哪个点更近,而不给出绝对深度)。显然,如果我输入一个乐高世界的相同图像,而网络是在真实世界(物体在10米外)上训练的,那么它不会给出正确的深度。所以在某种程度上,你可以预期这些系统只做它们被训练做的事情。如果你在自动驾驶场景的道路上训练,它会学习所见不同物体的大小。但如果你把这个系统带到森林里,那里有各种大小的树叶,你可能不知道,同样的叶子可能有不同的大小。那么,它们可能不会工作得很好。它们仍然出人意料地有效,但没那么好。简而言之,它们是否工作良好,取决于观察者的角度。但我最近看到我的同事说,深度相机已经过时了,因为我可以拿一个普通相机,在上面运行深度预测网络,就能得到类似的东西。我认为在某些场景下它们确实过时了。在自动驾驶世界,我认为这个问题已经解决了。我们可以做深度预测,我们通过我们的工作和其他工作展示了这一点。如果你想要能为完全随机环境(森林、丛林)提供深度的东西,那就是另一回事了。换句话说,能否预测深度取决于应用场景。如果是一个受限的世界(自动驾驶就是一个非常受限的世界),甚至世界的几何结构对于每张图像来说深度几乎相同。为什么?因为道路往往是平坦的,所以我可以不看图像就告诉你深度。不开玩笑,我们和其他人都展示过,如果你训练一个深度预测网络,要超越一个超级简单的方法(取所有训练数据,只平均深度,然后预测这个平均值)并不容易。它会给你道路,给你两侧,所以它会给你一个相当好的深度预测,除了实际停在路上的汽车,其他一切都很好。令人惊讶的是,用神经网络击败这个基线并不容易。

当事情开始时。所以这个自动驾驶世界,你看,深度总是相同的,除了几米的来回变化。正如我所说,所有这些预测,你以自监督方式训练,一旦运行,它会预测相对相机运动,预测深度。现在,这个方法的关键来了:我们不完全信任这些预测,但我们把它们作为先验使用。我们说,找到一个相机运动和三维世界的重建,使得对于每一帧,尽可能与深度网络的预测一致。所以我们把这些预测输入到损失函数中。因此,我们有一个基于亮度一致性的经典SLAM算法在运行,然后我们在损失函数中有一些项,说一切都应该与深度网络的预测兼容。

这大大提高了精度和鲁棒性。你在这里看到的是其中一个方法,仅使用一个单目相机,没有立体视觉,没有GPS,没有IMU,只有一个灰度相机。正如你所见,仅用一个单目相机,我们就可以绕街区行驶。这是一个我们以前从未见过的世界,来自测试集。



你可以看到,与标准的单目SLAM算法(会产生尺度漂移)相比,这里几乎没有漂移,轨迹几乎完美对齐。



因此,在发表时,这项工作是迄今为止世界上最精确的单目SLAM系统,一个深度学习增强的经典SLAM系统。我相信,经常有人问我,结合两个世界最佳之处的技术和方法有光明的未来:从经典方法中汲取所能,从基于学习的方法中引入所能。

例如,我在多视角几何课上一直说,你无法从一个相机估计世界的尺度。我告诉过你们,对吧?在浴缸里,你可以拍摄泰坦尼克号,它看起来相当真实,因为一切都是尺度模糊的。那实际上并不正确。如果你知道你正在行驶的世界,你可以从一个移动的单目相机确定世界的尺度。然后神经网络可以进行深度预测。即使一个预测不好,但平均整个序列,它们会聚合成非常精确的东西。所以这里没有尺度漂移。深度网络预测带来的巨大好处是,深度预测是以米为单位的度量预测,它们进入并固定了尺度。随着时间的推移,所以这里没有发生尺度漂移。我们定量评估了它,毫不奇怪地发现它效果非常好,无论是与ORB-SLAM等经典方法相比,还是与Stereo DSO等立体方法相比,这个单目方法仍然优于它们。

所以,使用一个相机加一个神经网络,比使用两个相机但没有网络更好。所以所有这些论文的普遍信息是,深度网络可以补偿缺失的传感器信息,它们可以“幻觉”出其他传感器本应测量的东西。事实上,这就是为什么我们发表的第一篇方法称为DVSO(深度虚拟立体里程计)。本质上,我们用立体视觉训练它,系统被训练来“幻觉”第二个相机。当你应用它时,它只会“幻觉”出第二个相机并给你深度。

所以这解决了自动驾驶中最大的问题之一:自动驾驶技术的认证对每个在该领域的人来说都是一个臭名昭著的挑战。你能证明它是安全的吗?有两种方法来证明系统是安全的。一种方法是,你以某种方式预先保证深度预测的误差总是在2厘米以内。我相信这种认证对于当今的机器学习和AI算法(尤其是深度网络这种在某种程度上是黑盒的系统)是不可能的。但还有第二种方法来认证它们,这非常实用且有效:你让它们运行数英里,展示它们实际犯了多少错误。然后你希望在尽可能广泛的应用范围内进行测试。特别是,你希望自动驾驶不仅在美国西海岸(据我的经验,那里总是蓝天、阳光明媚,道路足够宽,交通非常规范),还要在像罗马、西西里、孟买或北京这样的地方展示其功能,据我的经验,那里的交通要混乱得多,并且可能有你在美国道路上见不到的障碍物,尤其是在中国,我见过有趣的车辆,比如自行车上堆满东西。如果你的网络从未见过这样的结构,它可能会非常困惑。所以这种认证正在进行中,这是可以做到的。你可能还想开车穿过森林,确保它仍然有效。所以这都是可以解决的。我们自己也在不同的街道、城镇、环境(包括森林或人造世界)中进行了大量评估,表明它仍然有效。但通常,与任何深度学习方法一样,对我来说,基于学习的方法最大的缺点是,当你远离训练集时,它们的性能会下降。这是可以预期的自然现象。但当你远离训练集时,性能下降的速度取决于你如何形式化方法。例如,这个方法性能下降非常平缓,为什么?因为它内置了经典的SLAM流程,深度网络的预测不被视为真实值,它们作为约束输入。如果它们对于几帧图像不正确,这不会损害性能。有一个整体的全局优化确保结果是最优的。因此,这个方法在远离训练数据时性能下降非常平缓。我认为,这通常是混合方法的优点:一旦你遇到所谓的领域偏移或超出训练数据领域,它们通常仍然有效。

现在,正如你所见,这一切都基于深度预测。这让我有点困惑,我建议我的学生:让我们做深度预测,并将其输入到SLAM流程中,然后这个成果就出来了,它可以非常精确地跟踪相机。


但世界不是稠密的,是稀疏的。然后我说,等等,网络的深度预测是稠密的,你不能从中构建出稠密的世界吗?


嗯,我认为为了跟踪相机,他只关注了最精确的点。但在某种程度上。

然后我们更进一步,这是Felix Wiba及其合作者的后续工作,我们更专注于深度预测。我们说,获取所有深度预测,并将它们聚合成一个稠密的三维世界,因为我想看看我们能否从一个移动的单目相机重建稠密世界?这是一个非常经典的计算机视觉挑战。一旦你在这些自动驾驶场景中这样做,有汽车在行驶,一旦你预测了它们的深度,但随着时间的推移它们会移动,那么如果你随着时间的推移聚合这些深度预测,你会将移动的障碍物“涂抹”在世界中,你可以想象,看起来真的很酷。我喜欢这些被涂抹的移动汽车。但我的学生们不喜欢,他们说我们不想要任何被涂抹的障碍物。所以他们在其中添加了一个模块,一个所谓的掩码模块。这个掩码模块旨在基于亮度不一致性过滤掉物体。所以我们使用多帧之间的亮度一致性来预测深度,然后我们使用相同的亮度一致性来说,如果深度与我们估计的相机运动不一致,那么很可能是因为某个物体移动了。因为那样颜色就不一样了。所以我可以基于相机运动扭曲所有图像,然后亮度应该一致;如果不一致,那么可能物体移动了,我们可以将其输入到一个掩码模块中,该模块识别移动物体的区域,这些区域被过滤掉,所以移动物体从重建中被过滤掉了。然后我们得到最终的深度模块,它只预测静态世界的深度,而不是移动世界的深度。

因此,我们得到了一种称为MonoRec(单目稠密重建)的技术。正如你所见,我们可以恢复一个相当令人满意的三维世界,仅从一个移动的单目相机行驶通过世界重建而来。

这里你可以再次问,这个重建有多精确?我认为它不如激光雷达点云精确,但点云要稠密得多。它是一个彩色点云,所以我们实际上可以识别物体,这在激光雷达点云中要困难得多,在那里你看到点但不知道在看什么。

如果你有一个停车标志,你可以用激光雷达扫描它,但你永远读不到上面写的是什么,因为你需要颜色才能做到。而这里我们得到了所有东西的彩色重建。

精度可能不如激光雷达点云,但我想说,足以进行避障、路径规划以及安全驾驶所需的一切。你可以看到,重建的视觉效果还不是完全稠密的,这是因为深度是从一个视角预测的,当你从不同视角看时,会有这些离散化伪影,所以最终有点稀疏。

一旦你有了三维相机运动,有更好的方法来创建新视角,我提到过其中之一是NeRF(神经辐射场)。这是五年前由Ben Mildenhall及其合作者发表的工作,在社区引起了巨大轰动,我认为部分原因是它能够生成非常美观的新视角。它通常需要大约100张物体的视图。它假设你有相机位置,人们常常忘记这一点。我经常被问到,你为什么做三维重建,为什么不做NeRF?嗯,NeRF使用三维重建,它们需要某种前端算法来告诉它们相机在哪里。所以NeRF真正设计的是在有了相机位置后创建新视角。它训练一个神经网络来预测,对于给定的体素和给定的观察方向,如果你看它,你应该在那里看到什么颜色。所以它试图拟合所谓的辐射场。它训练一个多层感知机来从体素和观察角度预测颜色。由于它使用了观察角度,它实际上也可以建模非朗伯物体,即我所看到的颜色取决于我看某个盒子的角度。所有这些都可以从大量示例中训练。我可以拟合一个神经网络来做这个预测,然后我可以拍摄很多像这样的物体图像。

然后,你可以看到如何得到非常好的重建。他们通过虚拟移动相机来可视化它。

但你看,这需要数百帧。相比之下,正如我提到的,我展示的跳绳女孩的例子只用了16个相机。我认为NeRF不能用这么少的相机工作,你真的需要更多相机。这是神经辐射场的一个大缺点。此外,它们创建新视角,并不显示实际的表面几何形状。首先没有显式的表面几何形状,它实际上模拟光线沿射线的传播,以及通过沿辐射场积分你会期望看到什么颜色。然后你训练一个神经网络,使用大量训练数据来预测从给定视点看给定体素的颜色。

这是2019年Vincent Ititzman的工作,他实际上是我的一个本科生,做了基础工作,现在是MIT的教授。这就是神经辐射场。这篇论文的论点是展示他们可以做得更好。

但你可以看到,在比较中,有一整套人们提出的神经方法,如神经体积等。

来解决这个挑战。现在,NeRF的一个关键缺点是它们是针对每个实例训练的。所以你有一个物体,你拍摄100张图像,然后训练一个神经网络来预测从给定角度看给定体素会看到什么颜色。它做了一种非常巧妙的光场空间插值。但关键问题是,这个神经网络是针对每个场景训练的,它学到的任何东西都不能应用到新场景。这意味着如果你有一个带有新图像的新物体,你必须从头开始训练一个新的NeRF。所以,尽管它是一种基于学习的方法,但不像经典意义上的学习,从示例中学习一些东西然后应用到新设置。不,你必须这样做,所以它实际上只是拟合函数来估计这个光场。

而你可以做的,也是我们在这项名为“Behind the Scenes”的工作中着手做的,是训练一种以自我为中心视角的密度场,并以一种能推广到新环境的方式训练它。所以这种方式的工作原理,有点受神经辐射场的启发,我们也使用这些射线,并尝试估计沿射线的密度(材料密度)。但这种方法的好处是,它以自监督方式在训练数据上训练,可以应用到新的测试数据,然后你可以从单张图像预测三维世界。所以它是单视图重建,我们使用密度场,我们可以训练它。我们如何训练?我们使用视频中的连续图像来确定不同位置的颜色,并确定能预测这张图像的密度。一旦我们应用它,我们可以应用到一张新图像,它会预测密度,这意味着对于这条射线上的每个像素,它不仅告诉我们物体在什么距离(那将是深度预测),还预测物体在哪里结束。这是我们人类可以做到的:如果我看到一辆车,我不仅能告诉你车有多远,还能告诉你车有多大,因为我以前见过车。如果你能看到车后面,这就是为什么我们称之为“Behind the Scenes”。在训练数据中,你可以从经验中学习物体通常有多大。

因此,结果是,这只是逐帧应用这个方法。在顶部,你看到输入图像,总是只有一张图像。在底部,你看到预测。你看到它显示了物体在哪里结束,相比之下,深度预测网络看不到物体的结束。我们的方法可以看到结束。这是MonoDepth,它显示物体在哪里,但每条射线只有一个深度,而我们对于射线有整个密度。

一旦我们对这个密度进行二值化阈值处理,我们可以给出这些三维重建,即使在完全90度的视角下,你也能看到一个相当令人满意的、可能有点过度重建的世界。一旦你有了密度,你可以像在NeRF中一样,进行新视角合成,然后从不同的视点得到非常令人满意的新视角。然后你可以问,这仅在自动驾驶上有效吗?答案是否定的。所以我们也可以展示它在其他随机环境(室内或室外环境)上有效,我们可以做密度预测,得到三维,并生成新视角。

也许你明天会听到更多关于这个的内容,根据计划,你可以更进一步,做所谓的语义场景补全。所以你可以拿一张彩色图像,以及来自深度预测网络或激光雷达扫描仪的深度(无所谓),然后你可以补全场景。这意味着你从单张图像得到一个语义场。这就是想法:只有图像和深度,你得到一种三维语义分解。在我们的案例中,关键创新是我们可以仅用2D损失来训练它,所以我们不需要3D语义的真实值。

然后我们可以生成语义标记的三维世界,全部从单张图像和深度计算而来。

在这里你可以看到可行驶区域、汽车等。它更准确。这是真实值,你可以看到我们实际上有更好的重建,甚至比真实值或许多其他网络更好。通常,训练数据的一个问题是,我们世界中的真实值几乎从来都不完美。我们经常看到,我们的重建实际上比被认为是给定问题真实值的东西更准确。

好了,考虑到时间,我今天就讲到这里。正如我所说,明天我们将有三位学生的研究报告,他们将介绍他们目前正在做的工作。非常感谢。顺便说一下,下周三没有课,因为下周三我正在组织慕尼黑AI日,这是慕尼黑机器学习中心(我负责运行)组织的年度AI活动。所以我们全天都有很多演讲和主题演讲,所以下周三没有课,明天我们将有研究报告。

![](https://github.com/OpenDocCN/dsai-notes-zh/raw/master/docs/tum-mtvw-geo/img/6ce81af182b0b845b

021:多视图重建的最新进展(第7部分)

在本节课中,我们将探讨3D计算机视觉领域的最新研究进展,特别是从静态场景重建转向动态世界理解的关键挑战与方法。我们将介绍神经辐射场、高斯泼溅等新兴技术,并讨论如何从视频中推断物理规律。


概述

上一节我们介绍了基于学习的多视图重建方法。本节中,我们将深入探讨该领域的前沿研究方向,包括如何从单目视频中重建动态的3D世界,以及如何利用生成式AI和物理模拟来增强重建的完整性与合理性。这些进展正推动计算机视觉从理解2D图像迈向理解我们身处的3D动态世界。

从静态重建到动态理解

传统的多视图重建主要关注静态场景。然而,真实世界是动态的,物体和相机都在运动。一个关键挑战是如何在重建中处理运动物体。

早期方法(如MonoRec)的策略是过滤掉运动物体,仅重建静态背景。其核心思想是:如果一个物体在3D空间中运动,其在不同帧间的投影颜色将不一致。通过检查这种亮度一致性,可以识别并掩蔽运动物体。

# 伪代码:基于亮度一致性检测运动物体
if color_discrepancy(projected_point, current_image) > threshold:
    label_pixel_as_moving_object()

然而,更理想的目标是不仅识别,还能重建运动物体及其3D结构和运动轨迹,即实现动态重建。

神经场景表示:神经辐射场(NeRF)

神经辐射场是近年来引起轰动的技术。其核心思想不是显式重建物体表面,而是用一个神经网络隐式地编码整个场景的光场

  • 输入:一个3D空间点 (x, y, z) 和一个观察方向 (θ, φ)
  • 输出:该点在给定方向上的颜色 (r, g, b) 和体密度 σ

通过沿着视线方向积分体密度和颜色,可以合成任意新视角的图像。其渲染公式可简化为:

C(r) = ∫ T(t) σ(r(t)) c(r(t), d) dt

其中 T(t) 表示累积透射率,r(t) 为射线,c 为颜色,σ 为密度。

神经辐射场能生成非常逼真的新视角,但它存在一些局限:

  1. 需要大量(约上百张)已知相机位姿的图像。
  2. 重建的是隐式的光场,而非显式的物体表面和几何,不利于机器人交互等任务。
  3. 每个场景都需要从头开始训练一个网络,缺乏泛化能力。

迈向显式与泛化:单图像3D预测

为了获得更显式的3D理解并实现泛化,研究转向了能从单张图像预测完整3D信息的网络。

例如,“Behind the Scenes” 工作旨在从单张图像预测沿每条视线的完整体密度分布,而不仅仅是深度(即第一个相交点)。这使得网络能预测物体的完整占据空间,包括被遮挡的后部。这种方法通过大量视频以自监督方式训练,学会了关于物体形状和规模的先验知识,因此能泛化到新场景。

与仅预测深度(2.5D)的方法相比,这种全3D预测对于自动驾驶等应用至关重要,因为需要知道物体的完整3D范围。

语义场景补全

在自动驾驶等应用中,仅有几何信息还不够,还需要语义理解。语义场景补全任务旨在从一张RGB图像和一个(可能稀疏的)深度图出发,同时完成密集的3D几何重建并赋予每个体素语义标签(如道路、车辆、行人)。

这项工作将3D重建与语义分割相结合,实现了对环境的密集3D语义理解。

高效的替代方案:高斯泼溅

高斯泼溅是神经辐射场的一个高效替代方案。其核心思想是用一系列3D高斯椭球体来显式表示场景。每个高斯函数具有位置、协方差(控制形状和大小)、颜色和不透明度。

渲染时,将这些3D高斯投影到2D图像并进行泼溅渲染。这种方法的主要优势是渲染速度极快,因为高斯投影和混合是高度可并行化的操作。

关于神经辐射场与高斯泼溅孰优孰劣,取决于具体需求:神经辐射场在新视角质量上可能更优,而高斯泼溅在速度与显式控制上更有优势。

处理真实世界视频的挑战

将实验室算法应用于网络上的随意拍摄视频是一大挑战。这类视频通常:

  • 相机运动剧烈且不可预测。
  • 缺乏相机内参等先验信息。
  • 包含大量动态物体。
  • 没有任何真实3D标注数据。

2025年CVPR会议上出现了多篇相关论文(如MegaSFM、Catera、AnyT)。其中,AnyT方法采用了一种完全自监督的训练范式。它仅需大量无标注视频,通过优化亮度一致性来同时学习预测深度、光流、相机位姿、内参甚至运动物体分割。这使模型能够利用海量的互联网视频数据进行训练,并泛化到新的随意拍摄视频上。

从几何到物理:推断世界动力学

理解动态世界的更高层次是推断其背后的物理规律。例如,给定一个物体落地的深度视频,能否推断出它的弹性、质量等物理参数?

相关工作通过将可变形物体的物理模拟(使用有限元方法等)与观测数据相结合来实现。其核心是优化物理模拟的参数(如杨氏模量、泊松比),使得模拟产生的运动与观测到的视频序列尽可能一致。这标志着从被动重建向主动物理理解迈进了一步。

4D重建与生成式AI

对于非刚性物体的动态重建(4D重建),一个常见问题是从稀疏的关键帧(如起始和结束形状)生成合理的中间变形序列。

最新研究利用隐式神经表示(如符号距离函数)和物理约束(如体积保持、最小化形变能)来建模形状的连续变形。通过训练神经网络来预测变形场,可以生成既符合观测又物理合理的4D序列。

更进一步,结合生成式AI,现在仅从两张不同姿态的物体图片,就能生成一个合理的、变形的3D模型序列,从而“想象”出中间的运动过程。这展示了生成模型在数据极度匮乏情况下的强大能力,但目前仍存在生成结果与输入图像投影不完全匹配的控制难题。


总结

本节课我们一起探讨了多视图重建领域从静态到动态、从实验室到真实世界的最新进展。我们了解了神经辐射场等隐式表示方法,也看到了向显式、可泛化单图像3D理解的发展趋势。我们讨论了处理随意拍摄视频的自监督技术,并展望了通过结合物理模拟和生成式AI来理解世界动力学与生成合理4D内容的未来方向。这些研究正推动着计算机视觉系统像人类一样,真正地理解和交互于动态的三维世界。

posted @ 2026-03-26 13:10  布客飞龙IV  阅读(12)  评论(0)    收藏  举报