3D 视觉

RPChe_

本文简要介绍了处理 3D 视觉问题的一些基本技术。

问题背景

  • 基本上,2D Vision 的大部分问题都可以被扩展到 3D Vision 上。包括但不限于:

    1. 3D Classification.
    2. 3D Reconstruction.

    需要指出的是,截止2019年,3D vision 领域仍然有不少活跃的非深度学习方法。

3D 物件的表示方式

  • 不同于图片,3D 物件有很多不同的表示方式,相应的处理方式也是不同的,以下我们将简要介绍。

Depth Map

  • 简单的说,对于给定的图片,我们计算每一个像素点对应的物品到观察点(摄像头)的距离,并以热度图的形式将其作出。要处理这类逐像素点的问题,一个常用的方式是采用类似于 Semantic Segmentation 的下采样再上采样到原图尺寸的方式,而损失函数则是与 ground truth 的 loss 。
  • Depth Map 有一个显著的问题,就是我们往往较难分辨小而近的物品与大而远的物品。针对此,有一个较为聪明的解决方法是,采用具备 Scale Invariant 性质的损失函数,即,损失函数在整体乘常数时并不会改变。1
  • 另一个类似的表示方法是 Normal Predicting ,即预测每一个像素点所处平面的法向量,而损失函数则是与 Ground truth 的夹角大学,使用内积计算。

Voxel Grid

  • Voxel Grid 的思想是,将世界建模成 3 维网格,并标记每一点处是否被物件占据。2这样做的坏处非常明显,即在捕捉物件细节时对分割粒度的要求非常高,而且很难提高分辨率。

    要对 Voxel Grid 表示的物件做 Classification 是一个简单的问题,一般的做法是使用带有 3D Convolution 的 CNN 。而要对给定的二维图建立 voxel grid 则相对更难。我们可以考虑先使用 2D CNN 提取二维图片的特征,再使用 3D CNN 通过上采样建立 voxel grid ,中间使用全连接层连接。这样做的坏处是其计算开销极大。另一个折衷的办法是,仍然采用先下采样再上采样的网络,并强制最后一层的 channel 等于第三维的大小,将其视作 voxel grid 。3这样做可以节约算力,但其缺陷是在第三维上不具备平移不变性,即我们无法通过滑动卷积核的方式提取这一维的特征。

  • 另一个问题是 Voxel Grid 对于存储空间的开销极大。一个解决方案被称作 OctTree ,这里不会深入,其大致思想是,对于物件内部的部分,我们使用较低的分辨率,而越靠近表面,我们就使用越高的分辨率。而另一个解决方案则被称作 Nested Shape Layer ,大致思想是我们只关注物件的表面,所以我们只需刻画物件的内外表面即可。4

Implicit Surface

  • Implicit surface 的思想则是通过概率函数建模空间中各处被占据的概率。可以想象真实的物体占据体积是一个 的函数,而我们希望拟合出一个相应的 的函数,并判定 处对应了物体的边界。5而要学习这样的分布,我们可以考虑用其拟合给定物件在三维格点处的值,而在被物体占据的格点附近,我们使用更高的分辨率以期学习到更准确结果。6

Point Cloud

  • Point Cloud 的思想是,通过一系列离散的点来描述物体的形状。这样做的好处节约了点数,然而要可视化点云,我们需要一定的后处理,例如将每个点视作一个球。

    要基于 Point Cloud 做 3D Classification ,可以考虑使用一种被称作 PointNet 的技巧。我们希望模型对点的顺序具备不变性,可选的方法是令每个点经过一个 FCNN 得到其特征向量,然后做 Global Average Pooling 得到单一 Pooled vector 7,然后我们将其拼接到原先特征的末尾,重复以上特征若干次,直到得到最后的 Pooled vector ,再令其经过一 FCNN 得到分类结果。

    再考虑如何由 2D 图像得到 Point Cloud ,我们略过对应的网络结构8,而考虑如何设计损失函数,即比较点云(点集)之间的相似度。对此有一个比较简单而好用的方法,称作 Chamfer distance :

Mesh

  • Mesh 指的其实是三角网状结构,也就是你所熟知的3D建模。Mesh 的好处是节约了点数,并且可以直接表示相对平滑的表面。

    现在考虑如何将 2D 图片转为 Mesh ,这是一个相对困难的问题。首先我们考虑如何对 mesh 做调整,一个不错的思路是,从一个 mesh 形式的规则几何体(例如椭圆9)出发,将其塑性以尽量接近物件的形状,然后对点进行 up sample ,然后继续下一轮塑性,直到得到足够好的结果。而我们的塑性方式则是类似于卷积的方式,被称作图卷积。具体的,我们为以特征向量表征每个点,单次迭代时,我们通过该点所有邻居的特征向量的线性变换的和加上该点特征向量的线性变换得到下一个点的特征向量10,形如: 另一个问题是,我们要如何将图像特征注入到 Mesh 当中,可选的方式被称作 vertex align ,类似于 Object detector 中的 RoI align 。简单的说,我们使用 CNN 提取图像的特征,然后我们将 mesh 投影到 feature map 上,并使用 bilinear interpolation 计算每一点的特征。一个问题是课上没有详说如何将对齐得到的特征注入 Mesh ,我猜可能是每一个图卷积后都做 align ,再相加。11

    最后的问题是我们要如何设计损失函数。直接比较 mesh 其实是相对困难的,因此我们考虑将 mesh 转化为 point cloud ,再使用 Chamfer distance 。具体的转化方式则是对 Mesh 的三角面取随机的采样点。12

三维表示的度量

  • 三维度量的一个简单方式是直接考虑类似于 IoU 的方式,但这样的指标在三维下并不好。另一个方法是先前提到的 Chamfer Distance ,但这个方法的问题是由于 范数的存在而受坏点影响大,Robustness 不佳。一个相对好的方式是所谓的 F1 Score ,这仍然是基于 Point Cloud 的度量。简单的说,对于给定的 Prediction 和 Ground truth ,我们为每个点设定一个可接受的范围,并分别计算 Precision 和 Recall ,而 F1 Score 就是这两者的调和均值。

视角系统

  • 即 Camera System 。常见的 Camera System 包括 Canonical system 和 View system ,即标准 3 维坐标和基于视角的系统。前者的好处是方便,但是似乎会导致输入和输出的视角不对齐(输入内容往往是 view system),且容易产生过拟合。而后者似乎和先前 voxel tube 具备一定的适配性。

数据集

  • 一些常用的 3D 数据集包括:
    1. ShapeNet. 合成的 3D 物件。
    2. Pix3D. 这个比较厉害,是从家具网站里的真实数据里标注出来的。

最后 Justin 介绍了一些他自己的工作,即 Mesh R-CNN ,思想基本和 Mask R-CNN 相同,这里就不打算详谈了。


  1. 这里无意详细说明。请见 Eigen, Puhrsh and Fergus, Depth math prediction from a Single Image using a Multi-Scale Deep Network, NeulIPS 2014.↩︎

  2. 和 Minecraft 差不多。↩︎

  3. 这种方法称作 Voxel tube 。↩︎

  4. 类似于俄罗斯套娃,具体的方式和此处所示也许存在差异,但我们也不打算深入。↩︎

  5. 一个类似的方法是考虑 signed distance function ,即空间中点到物体边界的带号欧式距离。↩︎

  6. 折衷方法也被称作 OctTree。我猜大概的意思就是每次选择一个当前部分的子部分施以更高的分辨率以期学习到更准确的细节。↩︎

  7. 感觉有点怪。难道将特征相加就能期待将点的位置合成为物体的形状吗?↩︎

  8. Justin 没讲。反正只是技术细节而已。↩︎

  9. 当然初始形状的拓扑性质应当和目标物件相同。为了实现这一点,可以考虑先建立一个大致的 voxel grid 。↩︎

  10. 似乎也存在不同的实现方式。↩︎

  11. 这部分没有细讲。技术来自 Wang et al, Pixel2Mesh: Generating 3D Mesh Models from Single RGB Images, ECCV 2018↩︎

  12. 你可能注意到这个办法并不是可微的。具体的技术细节请见 Smith et al, GEOMetrics: Exploiting Geometrics Structure foor Graph-Encoded Objects, ICML 2019.↩︎

  • 标题: 3D 视觉
  • 作者: RPChe_
  • 创建于 : 2025-04-10 00:00:00
  • 更新于 : 2025-04-15 00:53:21
  • 链接: https://rpche-6626.github.io/2025/04/10/DL/3DV/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论