16-889 三维视觉入门
大概是一些笔记和个人想法吧。f.r. https://learning3d.github.io/
个人想法用这种格式书写,与笔记区分。所以可以直接跳过这部分,只看正文。
本课程可能 cover 的内容:
- 三维模型的显式、隐式与 Nerual 表示
- 如何将三维的数据用可计算的方式来表示?
- 不同类型的表示方式有哪些有点和缺点?
- Image Formation
- Form 2D Images from 3D Objects
- Data-driven 3D Prediction
- 表示方法与学习目标
- 重建刚体、连接体、整个场景
- 弱监督?
- Instance-specific 3D from multi-view
- Processing and Generating 3D
- Potpurri + Project Presentations
Introduction
为什么要关注三维视觉(3D Vision)?数学家们考虑问题时,可以想象 $n$ 维空间中的情况,得出普遍性的结论之后,然后令 $n = 3$,便能得到一些有趣的结果。但是,我们所处的这个世界是三维的,针对三维的情况而特有的一些技巧或表示方法,可能比上述的普遍解法得到更优的效果。比如说,逆平方反比定律,就只有在给定三维这个条件之下才有效。
3D Representations
下面介绍一些常用的三维场景表示方法。
- 深度图(Depth Maps):传感器进行数据采集时的常用方法
- It is an image that represents how far each pixel p is.
- For every pixel $p$ in the map, it stores $D[p] \in \mathbb R^+$.
- 深度图并没有捕捉到完整的 3D 结构,其只是记录了图像像素中的深度这一属性,可以称为 2.5D 表示
Surface Representations
这几种方法关注的是如何去刻画物体的表面。
- 点云(Point Clouds):通常也是从传感器中采集,作为统一不同传感器不同输出数据格式的方式
- 通常记作 $\{p_1, p_2, \cdots, p_N\}$,无序的点列表
- 点云是一种数据结构,通常表示成 $n \times 3$ 维的数组
- 为了保证其对无序性,或者说使得数组中任意两个元素交换位置后,点云整体的不变性,需要考虑具有置换不变性的处理方法(比如 FC 就不 work,因为输入位置不同对其结果有影响)
- 扩展:Oriented Point Clouds,同样是点的集合,不过集合元素为 $(p_i, n_i)$,记录了其法向用于渲染
- 点云没有记录各点之间的连接关系:虽然增大采样率可以在某种程度上缓解这个问题,但是明明加边更有效率…
网格(Meshes):存储顶点与面的数据结构
- 维护两个线性结构:顶点(Vertices)的集合、三角形面(Faces)的集合
- 对顶点标号,每一个面定义为一个三维数组,数组的内容是相应顶点的标号
- 是三维物体表面(Surface)的线性估计
- 但是通常来说,设计能够还原出任意连接方式的方法是困难的,这是因为即使是 8 个顶点和 10 个三角形面的网格也是 Non-trivial 的
参数曲面(Parametric Surfaces)
通过一个映射 $f(u) = p \in \mathbb R^3; u \in M$ 来实现
- $f$ 需要是连续函数,$M$ 需要是二维流形
更多例子:贝塞尔曲面
同时,我们之前的想法一直是手动构造这样的二维流形 $M$ 与函数 $f$,来拟合想要的三维模型。
- 而我们可以固定流形 $M$ 为单位球面,$f$ 为函数 $\theta$ 的参数,这样我们得到 $f_\theta(u) = p \in \mathbb R^3; u \in \mathbb S^2$,是否可以让机器自己学习合适的 $f_\theta$ 满足拟合要求?
- It is a nerual network with parameter $\theta$!
参数曲面也有一些不利之处
仅靠给定的流形和函数,很难对全局结构做出把握
- 给定 $q$,$q$ 到底是在描述的三维形体之内还是之外?
有时难以渲染(光追如何与 $f$ 求交?)
Volume Representations
这些方法关注于如何描述物体自身占有的空间。
- 体素化存储(Voxelized 3D)
- 这里 Voxel 的全拼是 Volume Pixel,类比 Pixel - Picture Element,Voxel 是 3D 存储的最基本单位(如下图,红色方块便是一个 Voxel)
- Voxel 将连续的三维空间离散化
- 一个 Voxel 可以代表 $(W , H, D)$ 大小的实际空间
- 这种类图像的表示对卷积等图像处理与生成方式友好
- 缺点:增大分辨率可能会导致计算性能的需求以立方的次数增长
- 隐式曲面(Implicit Surfaces)
- 其定义:$\{ \mathbf p | f (\mathbf p) = 0 \}$.
- 我们可以对隐式曲面进行:
- 并操作:$\bigcup_i f_i(\mathbf p) = \min_i f_i(\mathbf p)$.
- 交操作:$\bigcap_i f_i(\mathbf p) = \max_i f_i(\mathbf p)$.
- 差操作:$(f-g)(\mathbf p) = \max(f(\mathbf p), -g(\mathbf p))$.
- 当然我们可以将 $f$ 看做 $f_\theta$…
- Signed Distance Function
- 为函数增加条件:$f(p)$ 要代表点 $p$ 到所表示曲面的距离
- 这种函数满足条件:$|| \nabla f || = 1$.
Other Representations
- 八元树(Octrees)
- 对于渲染和存储来说十分方便
- 很难编辑或预测
- Layered Depth Images
- Layer 1 = Visible Content
- Layer $n + 1$ = Depth and color of the “next” surface point the ray hits after Layer $n$
- Multi-plane Images
- 极其方便渲染,each layer is just a plane at fixed length
- Limited resolution for far-away ccontent
- CAD Models
- CSG Trees
- 物体的交并差组成的“计算图”
更多讨论
我们关注以下两个问题:
- 从可微性的角度,连续的变换能否拟合出相应的变化?
- 从渲染的角度,将 3D 表示添加纹理后渲染出来是否简单?
Conversions between 3D Representations
本节我们分为以下三个方面,介绍三维表示之间的不同转换方法:
- Surface Representations 之间的转换
- Volume Representations 之间的转换
- Surface Representations 和 Volume Representations 之间的转换
何谓“可微变换”
首先,变换的定义我们在《离散数学》课程中就已经学过,是一个集合到自身上的映射。那么,什么是可微变换呢?
我们假设给定图片输入 Input,其可用参数 $\theta_1$ 来表示,而经过了变换 $\mathcal T$ 之后,其得到了点云可用参数 $\theta_2$ 来表示。如果我们可以计算出 L 对两个参数的偏导,那么就可以计算出这个变换的微分。
这个 Loss 都有哪些计算方式?也就是说,怎么去衡量这个 Loss 对 $\theta$ 的微分?
Volume Representations 之间的转换
Approximating Continuous from Discrete
没错,其核心问题在于图中的注释,给定离散的网格对应的值,怎样才能将其连续化呢?没错,插值。我们早已学过一阶线性插值和双线性插值的概念,而这里我们便使用三线性插值来处理三维的问题。
From Continuous to Discrete
对于 sigmoid 函数,我们易于求 $\dfrac {\partial V}{\partial f}$.
Surface Representations 之间的转换
From Continuous to Discrete
我们首先将定义域的二维流形离散化,然后将离散化后的区域使用 $f$ 进行映射。
Sampling Points on a Triangle Mesh
接下来,给定一个三角形,该如何在其上均匀采样呢?
Volume Representation 和 Surface Representation 之间的转换
Volumes to Surface: Marching Cubes
我们本质上是要解决如何找出曲面边界的问题。比如,上面这张图绿色表示点在曲面内部,红色表示点在曲面外部,而具体该如何决定这个曲面边界所在的位置。通过这张图我们可以看到,对于每一个 Cube,决定其表面所在的边界是较为简单的。于是我们的想法便是,打表…
同时,使用 Voxel 的属性值来影响顶点的位置,这也保证了可微性。
Points to Meshes via Implicit Functions
Points to Meshes 本来是 Surface Representations 方面的内容,而直接在点云中建立不同点之间的连接关系让人感觉无从下手。
而我们可以认为,点云中的点是某个隐函数取值为 0 的点集中 sample 出来的。我们可以尝试先拟合出隐函数,然后再将其转换成 Meshes.
Poisson Reconstruction
首先,Possion Equation 的定义:
Image Formation
这一节我们关注成像相关的问题。我们关注的是几何与物理:几何是 3D 空间中的某个点该映射到图像中的什么地方,而物理是说像素的颜色该如何被计算。
- 小孔成像的原理
Geometry
正交投影与透视投影
齐次坐标
我们假设成像平面在 $Z = 1$.
将三维空间中的点映射到像平面
- $(X, Y, Z) \rightarrow (X/Z, Y/Z)$,即 $\mathbb R^3 \rightarrow \mathbb R^2$.
定义 Projective 2D Space $\mathbb P^2$ 满足 $(x,y,z) \equiv (\lambda x, \lambda y, \lambda z)$,其满足的性质:
- $(x, y) \rightarrow(x,y,1)$,这是 $\mathbb R^2 \rightarrow \mathbb P^2$
- $(x,y,z) \rightarrow(x/z, y/z)$,这是 $\mathbb P^2 \rightarrow \mathbb R^2$.
然后,定义 Projective 3D Space $\mathbb P^3$,定义 $\mathbb P^3 \rightarrow \mathbb P^2$ 的 Projection Matrix $\mathbf P$ 如下:
这个 Projection Matrix 相当于取 $\mathbb P^3$ 这个四维坐标的前三项后得到 $\mathbb P^2$ 中的元素。
$\mathbf P X_{cam} = X_{img}$.
更一般地,如果我们的像平面在 $Z = f$ 的位置,事实上我们可以把 $Z = 1$ 的这个“像”的 $x, y$ scale $f$ 倍,得出新的投影阵:
而接下来,再考虑更加一般的情况,任意的图像中心。
然后是应用一个平移 + 旋转换基变换将摄像机的中心移到原点,up 与 y 方向对齐。
注意不同的库在建坐标系时有不同的 Convention,这是可能导致 Bug 的原因之一。
Physics
熟悉的渲染方程:
Single-view 3D: History + 2.5D
我们关注的问题是,如何将一张 2D 的图像理解成 3D 的表示。上面几部分我们关注“怎样表示”,而接下来的几节我们关注以怎样的方法来进行理解。
虽然有些图像我们难以界定其三维场景(比如上面几张图中的问题),但我们所在的世界是一个有规律性的世界,见下面几张图。
虽然有些时候,我们对一个场景有无穷多种解释,但是有些解释比其他的可能性更大。几何的知识虽然信息量足够大,但有时还是不足够的,我们需要对于可能的场景结构有一些先验知识,以尽可能减小我们的“搜索空间”。
那么这些先验知识都有哪些呢?一种是面向用户(User-specific)的,不同的用户的先验知识不同,另一种是数据驱动型(Data-Driven)的。目前的研究范式是:主要为数据驱动型,加入特定的 Inductive bias.
What is inductive bias?
- https://zh.wikipedia.org/wiki/%E5%BD%92%E7%BA%B3%E5%81%8F%E7%BD%AE
- https://www.baeldung.com/cs/ml-inductive-bias
大概我的理解就是,一个模型所做的假设吧,这个假设可能正确性很高(strong)或是很低(weak))。比如后续我们提到说要对室内场景建模,给出的这个 World Model 那么就是 Inductive Bias.
3D Inference 发展的历史
- The first vision thesis: Model-based fitting
- Improving Model-fitting: A Representative Approach
- Automatic Photo Pop-up
Modeling Indoor Scenes (Given the World Model as Inductive Bias)
- 在结构方面的先验知识(Structural Prior)
Towards Data-driven Modeling: Morphable Models for Faces
- 从 3D Faces 的数据集中学习模型参数
- 然后用来推断未见过的图像
Data-driven Modeling: A modern view
- 使用 CNN 等神经网络,在大笔训练资料上训练神经网络
- Learning from direct supervision!
- 我们有数据集!比如 ImageNet,比如 COCO (Common Objects in Context)
Depth Prediction:场景深度预测任务
任务定义非常简单:输入 2D 图片,输出这个图片对应的场景中,每个点对应的深度。
Loss Function
这样设计 Loss 的核心问题:接近成像平面的较小的物体和远离成像平面的较大的物体可能最终在图像上的表现相同。绝对深度是难以确定的…于是我们的 Loss 需要满足:
这样设计出的 Loss Function 为:
From intuition we can know that, 把 log 去掉的话这个 Loss 是 $\dfrac {y_i}{y_i^\star} \times \text{avg}(\dfrac{y^\star}{y})$,如果我们只关注预测值和真实值之间的比例关系的话,预测出 $y_i^\star = \alpha y_i, \forall i$ 的结果肯定是最好的。但是在真正运作的时候,我们没法保证这个 $\alpha$ 是个常数,于是我们就索性取了平均值。这个式子越接近于 1,取个 log,原来的 Loss Function 就越接近 0,不然就会因为范数的存在变大,非常符合直觉。
Architecture Example
这是一种预测结构的例子。
为啥把 Coarse 接回来 Refine 就能 work 了?肯定是因为又有了原图的信息吧?如果改用 ResNet 会不会可能更好?有没有可能搞个大模型学习到原图的 Dense Representation?(也就是说那种 Encoder 的感觉)
Depth Datasets
这个任务常用的一些数据集。
Scale and Shift-invariant Depth Prediction
直接去翻了 1907 那篇 Paper: Towards Robust Monocular Depth Estimation: Mixing Datasets for Zero-shot Cross-dataset Transfer.
We identify three major challenges.
1) Inherently different representations of depth: direct vs. inverse depth representations.
2) Scale ambiguity: for some data sources, depth is only given up to an unknown scale.
3) Shift ambiguity: some datasets provide disparity only up to an unknown scale and global disparity shift that is a function of the unknown baseline and a horizontal shift of the principal points due to post-processing.
这里的 disparity 可以理解成图像中“相对深度”的感觉。
假设我们的图片有 $M$ 个像素,$d, d^\star \in \mathbb R^m$ 是 GT / Predicted disparity。
然后我们定义两个算子:$s: \mathbb R^M \rightarrow \mathbb R_+, t: \mathbb R^M \rightarrow \mathbb R$ 是 scale 和 translation 的 estimator.
接下来是如何解决 disparity 的 scale 和 translation 不统一的问题,论文提供两种方法。
一种是最小二乘拟合 $d_i^\star$ 和 $d_i$ 的关系($d^\star_i = s d_i + t$),找到 (s, t) 后做映射 $\hat{\mathbf{d}}=s \mathbf{d}+t, \quad \hat{\mathbf{d}}^{\star}=\mathbf{d}^{\star}$。
另一种是做 normalize:$t(\mathbf{d})=\operatorname{median}(\mathbf{d}), \quad s(\mathbf{d})=\frac{1}{M} \sum_{i=1}^{M}|\mathbf{d}-t(\mathbf{d})|$,进而 $\hat{\mathbf{d}}=\frac{\mathbf{d}-t(\mathbf{d})}{s(\mathbf{d})}, \quad \hat{\mathbf{d}}^{\star}=\frac{\mathbf{d}^{\star}-t\left(\mathbf{d}^{\star}\right)}{s\left(\mathbf{d}^{\star}\right)}$.
然后定义 scale- and shift- invariant loss:
这里 $\rho$ 可以决定这个 Loss Function 的种类:第一种就用 $\rho(x) = x^2$,第二种用 $\rho(x) = |x|.$
Lecture 6: Single-view 3D: Objects & Scenes
我们的任务是:给定一个 2D 图片,这个图片上仅有一个物体,输出其 3D 的结构。
首先我们要解决的问题是:该怎么建坐标系。
可能的方法:
- Camera Coordinate System:以相机为中心,相机轴为坐标轴
- View-aligned Object-centric Coordinate System: 以物体为中心,坐标轴与相机轴对齐
- Object-centric ‘Canonical’ Coordinate System: 物体中心,但是物体的“前面”是 -Z 方向,上方是 Y 方向
Whenever reading a 3D prediction work, understand the prediction frame!
第三种坐标系让机器学习起来更容易(Aligned shapes have less variation)
所以我们的任务变成:Given a 2D picture of a single object, how can we reconstruct the object in 3D in canonical frame?
Learning to Predict
我们可以使用合成的数据(比如上图 ShapeNet 数据集)来学习,但这样的数据既不真实,还会有偏向刚体和人造物体的 Bias。
Predict Volumetric 3D
Why not use pixel-aligned prediction? 是不是因为要求输出有连续性?而且要求有 invariant to observed viewpoint 的要求?Pixel-aligned 是否会忽略不同组件间的连接关系?
Loss Function 这个 Loss 该怎么计算?
这个就相当于把三维的场景 Flattern,然后做 cross entropy。
这样是否抹杀掉了一些“连接关系”对整体的影响?因为这个办法相当于是每个体素的权重是相同的。比如说在关注点高的地方缺了俩体素,和在一个本来就比较混乱的地方有两个体素的 difference 相比…
Training Renderings of CAD models on random backgrounds (which helps to make up for the domain-shift between real images and CAD model images)
这玩意是不是能在 Minecraft 里复现出来啊,xswl
写个插件,给它看一张二维图片,后面挂一个模型,然后直接三维重建,草草草
我记得现在只有二维复现二维的插件,颜色选择也只是逼近,绝对没有三维重建的,这不得卷爆插件区啊 :clown_face:
有空可以看下这个,看一下实现,比较好奇什么是 Context-awared,然后 fused volume 后面的 refine 经历了什么:
然后还可以 refine 一下表面,类似于 Octree 的思想。
逐层细分,对一个大体素 predict 3 个 label 其中之一:是 all empty,all occupied, 还是 mixed. 如果是 mixed,那么把这体素分成八份,每一份再递归 predict。
Paper 贴出来,回头细看:https://arxiv.org/pdf/1704.00710.pdf
Predict Implicit Volumetric Representations
Instead of decoding a volumetric representation, answer occupancy query of an arbitrary point.
也是类似于上面的 Encoder-Decoder 架构,不过上面 Decoder 在回答二分类(occupied or not)/三分类(empty, occupied or mixed),这里的 Decoder 在 answer occupancy query of an arbitrary point.
这样是不是要对空间 sample 足够多个点啊?看到下一页 PPT 确实,resolution 和 sample 的点数有关系。
Predict Point Clouds
We need permutation invariant learning objectives!
定义 Loss 的方法:
- Chamfer Distance
- Earth Mover’s Distance
怎么变图论问题了啊,离散数学我没学会啊x
Predict Parametric Point Clouds
Predict Meshes
Training Objective
Regularization: Smoothness
A vertex should get near to average of its neighbors, and that is: $\delta_{i}=\frac{1}{d_{i}} \sum_{j \in N(i)}\left(\mathbf{v}_{i}-\mathbf{v}_{j}\right)$.
于是我们把 $\sum |\delta_i|$ 作为正则项就好了。这也可以表述为 $||LV||^2$:
Learning to Deform Meshes
Evaluation Methods
- IoU: $\dfrac {\text{Intersection}}{\text{Union}}$
- Chamfer Distance
- F1-score @ t
- Precision @ t: fraction of predicted points within $t$ of some GT points
- Recall @ t: fraction of GT points within t of some predicted point
- F1 @ t = 2 $\times$ (Precision @ t) $\times$ (Recall @ t) / (Precision @ t + Recall @ t).
暂时先这样吧 有时间可能去看看另一个课 或者装一下 Pytorch3D 试着做一下 Assignments 2022-4-27 22:24:51
Single-view 3D: Scenes
Decouple prediction of objects, locations and layout.
- Objects: Last section…
- Locations
- Layout: what would the scene look like if there were no objects?
Putting it together: Factored 3D Reconstruction
然后有各式各样的论文…感觉这一块儿没有研究范式