1. 简介

随着自动驾驶、AR & VR 等技术的发展,3D 视觉的研究正方兴未艾。目前 3D 视觉的两个主要问题是:

  • 从一张 2D 图像预测得到 3D 表示
  • 处理 3D 表示数据来实现下游任务(分类、检测、分割等)

2. 3D 表示

目前 3D 视觉表示主要有 55 种方法:深度图(Depth Map)、体素(Voxel Grid)、隐表面(Implicit Surface)、点云(Point Cloud)、网格(Mesh)。

2.1 深度图

深度图(Depth Map)表示是指在原来的 2D 图像基础上,再增加一个深度图信息。

2.1.1 RGB-D

一种直接的方式是测量 2D 图像中每个点到相机的距离作为深度图,也即:

  • RGB image + Depth image = RGB-D image (2.5D)
RGB-D

然而这种方式其实不是完全的 3D,因此我上文写的是 2.5D。因为这样表示的深度图缺乏尺度信息,因而会对实际的深度产生歧义:

RGB-D Depth Ambiguity

针对这个问题,Eigen 等人[1]提出了一种 scale-invariant MSE 损失,来训练其提出的深度图预测网络。scale-invariant MSE 损失的主要思想如下:

D(y,y)=1ni=1n(logyilogyi+α(y,y))2, 其中 α(y,y)=1ni(logyilogyi)=1ni=1n((logyilogyi)(1ni(logyilogyi))2)2=1ni=1n(di(1nj=1ndj)2)2, 其中 di=logyilogyi=1nidi21n2(jdj)2(1)\begin{align*} D\left(y, y^{*}\right) & =\frac{1}{n} \sum_{i=1}^{n}\left(\log y_{i}-\log y_{i}^{*}+\alpha\left(y, y^{*}\right)\right)^{2},\text{ 其中 } \alpha\left(y, y^{*}\right)=\frac{1}{n} \sum_{i}\left(\log y_{i}^{*}-\log y_{i}\right) \\ & = \frac{1}{n} \sum_{i=1}^{n}\left(\left(\log y_{i}-\log y_{i}^{*}\right) - \left(\frac{1}{n} \sum_{i}\left(\log y_{i}^{*}-\log y_{i}\right)\right)^2\right)^{2} \\ & = \frac{1}{n} \sum_{i=1}^{n}\left(d_i - \left(\frac{1}{n}\sum_{j=1}^n d_j \right)^2 \right)^2,\text{ 其中 } d_i = \log y_{i}-\log y_{i}^{*} \\ & = \frac{1}{n} \sum_i d_i^2 - \frac{1}{n^2}\left(\sum_j d_j\right)^2 \tag{1} \end{align*}

其中,y,yy, y^* 分别表示网络预测的深度图和 ground truth。

yyyy^* 的尺度缩放时,即 y=Cyy = C y^* 时,有 d=logCd = \log{C},代入 (1)(1) 可计算得 D(y,y)=0D(y, y^*) = 0。因此,该损失函数即为 scale-invariant 的。

Eigen 等人提出的神经网络结构如下:

Eigen-NIPS2014

2.1.2 RGB + Surface Normal

另一种类似表示 3D 视觉信息的方法是对 RGB 图像中的每个像素,给出其所在物体表面的法向量,也用 33 个通道进行表示,即 Surface Normal。这样也能在一定程度上表示 3D 物体的空间结构信息。

RGB-Surface Normal

Eigen 等人[2]在第二年又提出了从 RGB 图像预测 Depth Map、Surface Normal 和 Semantic Label 的统一神经网络模型,其结构如下图所示:

Eigen-ICCV2015

在这篇文章[2:1]中,Eigen 等人分别针对 Depth Map、Surface Normal 和 Semantic Label 给出了不同的损失函数:

  • 如果使用该模型来预测 Depth Map,则给出的损失函数为:

    Ldepth(D,D)=1nidi212n2(idi)2+1ni[(xdi)2+(ydj)2](2)\begin{align*} L_{\mathrm{depth}}(D, D^*) = \frac{1}{n} \sum_i d_i^2 - \frac{1}{2n^2} \left(\sum_i d_i\right)^2 + \frac{1}{n} \sum_i \left[ (\nabla_x d_i)^2 + (\nabla_y d_j)^2\right] \tag{2} \end{align*}

    其中,D=logy,D=logyD = \log{y}, D^* = \log{y^*}y,yy, y^* 分别表示网络预测的深度图和 ground truth。与式 (1)(1) 一样,d=DDd = D - D^*。相比于式 (1)(1),式 (2)(2) 增加了两个梯度项,xdi\nabla_x d_iydj\nabla_y d_j 分别表示 ddx,yx,y 轴上的梯度,从而使得 yyyy^* 不仅在数值上相近,在结构上也相近。

    不难证明,当 yyyy^* 的尺度缩放时,即 y=Cyy = C y^* 时,依然有 Ldepth(D,D)=0L_{\mathrm{depth}}(D, D^*) = 0,因此该损失也是 scale-invariant 的。

  • 如果使用该模型来预测 Surface Normal,则给出的损失函数为:

    Lnormal(N,N)=1niNiNi(3)L_{\mathrm{normal}}(N, N^*) = -\frac{1}{n} \sum_i N_i \cdot N_i^* \tag{3}

    其中,NNNN^* 分别表示网络预测的 Surface Normal 和 groud truth,NiN_iNiN_i^* 都是 33 维的单位法向量,()(\cdot) 为向量间的点积。

    两个单位法向量之间的点积其实就是二都的角度余弦,当二者重合时值最大,当二者反向时值最小,故损失函数加了一个负号。

  • 如果使用该模型来预测 Semantic Label,则给出的损失函数为:

    Lsemantic(C,C)=1niCilogCi(4)L_{\mathrm{semantic}}(C, C^*) = -\frac{1}{n} \sum_i C_i^* \log{C_i} \tag{4}

    其中,CiC_i 是网络最后一层经过 Softmax 给出的预测标签,CiC_i^* 为 ground truth。

2.2 体素

2.2.1 体素网络

体素网络(Voxel Grid)表示的思想很简单,类似 2D 中的像素思想,体素即将 V×V×VV \times V \times V 的 3D 场景视作由许多相同的基本小方块组成,物体的分辨率和小方块的大小成反比。如果物体在占据了某个小方块,则其值为 11,否则为 00。体素表示的例子如下图所示:

VoxelGrid

由于 V×V×VV \times V \times V 的体素表示很规则,可以直接用 3D 卷积网络[3]进行处理。而从 2D 图像预测得到 3D 体素,可以通过 FC 层实现维度的增加[4],如下图所示:

2D to 3D by FC

或者直接使用 2D 卷积网络处理,在最后输出时将特征通道维度直接当作另一个空间维度来解释:

2D to 3D by Channel

然而,处理这样的密集型体素网络需要消耗大量的显存和计算,特别当体素的分辨率比较高时。

2.2.2 多尺度体素

多尺度体素是指,对同一个 V×V×VV \times V \times V 的 3D 场景,使用不同分辨率的体素块来表示不同区域。即对简单平滑的区域使用大的体素块来表示,然后对于纹理复杂的区域使用小的体素块来表示。这种表示可以通过 Oct-Tree 结构来实现:

Scaling Voxel-Oct Tree

或者通过一种嵌套的正负空间组合来表示,即先使用大体素块描述物体的大致轮廓,然后使用小一些的体素块消去多余的部分,然后再使用更小的体素块加上被消去的部分,如此直到所需的分辨率:

Scaling Voxel-Nested Shape

2.3 隐式表面

隐式表面(Implicit Surface)的想法另辟蹊径,与其费尽心思去显示表示 3D 场景,不如直接用神经网络学到 3D 物体表面的一个隐式函数,当给定点的输入坐标时,该函数会输出一个有向距离,来表示该点是在物体内部还是外部。

Implicit Surface

不过,这种方式要得到最终显示的 3D 表示,还要经过后处理[5]。通过对空间中的点进行采样来得到物体的 3D 表示,当然这种采样也可以是多尺度的:

Implicit Surface-Post Processing

2.4 点云

点云(Point Cloud)是目前使用比较多的 3D 表示方法,其思想是将 3D 物体用其表面的一系列点来表示,不像体素那样需要使用大量的数据。然而,由于是采样表面的一系列点,无法用对它们进行规则的表示,只能以集合的方式来储存。也就是说,在点云表示中,点和点之间是无序的,不论怎么打乱点之间的顺序,表示的物体还是同一个。另一方面,由于传统的 CNN 或者 RNN 都是处理的有结构的数据,因此不能直接用在点云数据处理上。要相处理点云数据,必须不受数据顺序的影响。因此,Qi 等人先后提出了 PointNet[6] 和 PointNet++[7]来处理点云数据,以 PointNet 为例,其结构如下:

PointNet

PointNet 主要是通过使用 Max Pool 操作来消除数据顺序的影响。而要预测点云数据,也要消除数据顺序的影响。Fan 等人[8]提出了 PointOutNet 来从 2D 图像预测得到 3D 点云数据:

PointOutNet

为了对比网络预测的点云数据和 ground truth,还需要给出两个集合之间的距离度量。Fan 等人[8:1]提出可以使用 Chamfer Distance 或者 Earth Mover’s Distance:

  • Chamfer Distance(CD)

    dCD(S1,S2)=xS1minyS2xy22+yS2minxS1xy22(5)d_{\mathrm{CD}}(S_1, S_2) = \sum_{x \in S_1} \min_{y \in S_2} \lVert x - y \rVert_2^2 + \sum_{y \in S_2} \min_{x \in S_1} \lVert x - y \rVert_2^2 \tag{5}

  • Earth Mover’s Distance(EMD)

    dEMD(S1,S2)=minϕ:S1S2xS1xϕ(x)2(6)d_{\mathrm{EMD}}(S_1, S_2) = \min_{\phi: S_1 \rightarrow S_2} \sum_{x \in S_1} \lVert x - \phi(x) \rVert_2 \tag{6}

    其中,ϕ:S1S2\phi: S_1 \rightarrow S_2 是一个双射函数。

2.5 网格

网络(Mesh)是另一种用来表示 3D 场景的方法,其在点云基础上增加了三角面。即 Mesh 由两部分组成:

  • 顶点(Vertices):3D 空间中的物体表面的点;
  • 面(Faces):顶点间的三角面。

Mesh

虽然 Mesh 表示比点云表示更加精确(点云缺失了顶点间的边信息),而且在图形学中使用广泛,但不利于使用神经网络进行处理。对于从 2D 图像预测 Mesh,Wang 等人[9] 提出可以使用 GCN 来处理,GCN 中的点即对应 Mesh 中的点,GCN 中的边即对应 Mesh 中的边。他们提出的 Pixel2Mesh 网络如下图所示:

Pixel2Mesh

其基本想法类似于捏面团(不能捏穿),先从一个初始的椭圆面团开始,逐步将面团揉成相表示的 3D 物。Pixel2Mesh 总共有 33 次 Deformation 操作,每次都增加顶点数,但不改变 Mesh 的整体拓扑结构,最终得到 3D 物体精确的表示。但是,这种思想存在一个巨大的限制,即拓扑结构的限制。比如,在不改变拓扑结构的前提下,永远无法从椭圆形捏成甜甜圈形状。

Pixel2Mesh 的主要工作有两点:

  • 迭代地精调:即捏面团的思想,增加顶点的方式是 Edge-based,而不是 Face-based。这是因为 Face-based 会导到顶点的度非常不平衡;

    Edge-based 是在三角面的每条边中心增加一个点,然后连接这三个点,将一个大三角分成四个小三角,一次性增加了三个点;

    Face-based 是指在三角面的中心新增一个点,然后将其和三个顶点连接,将一个大三角分成三个小三角,一次性增加一个点。

  • 对齐顶点特征:为了和 2D 图像中物体的结构尽可能保持一致,可以投影或者插值的方式来对齐顶点特征。

    Mesh-Vertex Aligned Features

从 2D 图像预测 Mesh 另一重要部分是损失函数的设计。Pixel2Mesh[9:1] 中的做法是将 Mesh 转换为点云,具体是对 ground truth 采样,然后计算预测的 Mesh 的顶点和 ground truth 采样的点集合之间的 Chamfer Distance,作为损失函数的结果:

Pixel2Mesh-Loss

但这样做则忽略了预测的 Mesh 的顶点之间的三角面信息。因此,Smith 等人[10]提出可以针对 Prediction 也进行采样:

GEOMetrics

不过这样也导致了一些问题,一方面要求对预测的 Mesh 的采样是可微的,另一方面由于是在线采样,导致训练效率比较低。

3. 度量

在 3D 场景中,常使用的度量有三种:IoU、Chamfer Distance 和 F1 Score。三者的一个概述如下图所示:

Metric-Summary

3.1 IoU

在 2D 分割任务中,常使用 IoU(Intersection over Union)指标来衡量分割的效果,但在 3D 中 IoU 则不太适用:

Metric-IoU

这是因为 3D IoU 相当于要用长方体来计算,但 3D 场景中的物体形状各异,大部分都不规则,使用长方体来计算 IoU 会导致差异过大。其实在 2D 中也存在这个问题,但 2D 中的差异还可以接受。

3.2 Chamfer Distance

Chamfer Distance 前面也介绍了,本质是一种衡量集合间距离的度量函数。

ChamferDistance

3.3 F1 Score

在 3D 场景中,更精确的度量函数是 F1 Score。和 Chamfer Distance 一样,先对 prediction 和 ground truth 进行采样,然后计算这两个采样集合的 F1 Score:

Metric-F1 Score

4. 相机系统

目前 3D 相机的坐标成像系统主要有两类:Canonical Coordinates 和 View Coordinates。

Cameras

4.1 Canonical Coordinates

Canonical Coordinates 系统以规范的方式来构建物体的坐标,比如上图所示,假定椅子的正前方为 zz 轴,然后依据右手法则构建出 xyzx-y-z 坐标系。这样做更容易加载数据,但不利于神经网络学习,因为此时神经网络永远只看到同一个视角。而且,由于这种方式,神经网络的输出也是规范视角下的,和原来的输入的视角不一致,因此还需要手动对齐。

4.2 View Coordinates

View Coordinates 则是以相机平面的法线为 zz 轴,这样则保留了输入的视角,也无需手动对齐输出,神经网络也能学到各种视角下的知识,模型也会更鲁棒。

5. 数据集

目前 3D 数据集还不是很多,主要有:ShapeNet、Pix3D。

  • ShapeNet:约 5050 个类,5050k 个 3D CAD 模型,每个模型有 2525 张渲染图片(非真实数据集);
  • Pix3D99 个类,219219 个 3D 模型,约 1717k 张真实图像。

附录

参考资料

参考文献


  1. Eigen, D., Puhrsch, C., & Fergus, R. (2014). Depth map prediction from a single image using a multi-scale deep network. Advances in neural information processing systems, 27. ↩︎

  2. Eigen, D., & Fergus, R. (2015). Predicting depth, surface normals and semantic labels with a common multi-scale convolutional architecture. In Proceedings of the IEEE international conference on computer vision (pp. 2650-2658). ↩︎ ↩︎

  3. Wu, Z., Song, S., Khosla, A., Yu, F., Zhang, L., Tang, X., & Xiao, J. (2015). 3d shapenets: A deep representation for volumetric shapes. In Proceedings of the IEEE conference on computer vision and pattern recognition (pp. 1912-1920). ↩︎

  4. Choy, C. B., Xu, D., Gwak, J., Chen, K., & Savarese, S. (2016, October). 3d-r2n2: A unified approach for single and multi-view 3d object reconstruction. In European conference on computer vision (pp. 628-644). Springer, Cham. ↩︎

  5. Mescheder, L., Oechsle, M., Niemeyer, M., Nowozin, S., & Geiger, A. (2019). Occupancy networks: Learning 3d reconstruction in function space. In Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (pp. 4460-4470). ↩︎

  6. Qi, C. R., Su, H., Mo, K., & Guibas, L. J. (2017). Pointnet: Deep learning on point sets for 3d classification and segmentation. In Proceedings of the IEEE conference on computer vision and pattern recognition (pp. 652-660). ↩︎

  7. Qi, C. R., Yi, L., Su, H., & Guibas, L. J. (2017). Pointnet++: Deep hierarchical feature learning on point sets in a metric space. Advances in neural information processing systems, 30. ↩︎

  8. Fan, H., Su, H., & Guibas, L. J. (2017). A point set generation network for 3d object reconstruction from a single image. In Proceedings of the IEEE conference on computer vision and pattern recognition (pp. 605-613). ↩︎ ↩︎

  9. Wang, N., Zhang, Y., Li, Z., Fu, Y., Liu, W., & Jiang, Y. G. (2018). Pixel2mesh: Generating 3d mesh models from single rgb images. In Proceedings of the European conference on computer vision (ECCV) (pp. 52-67). ↩︎ ↩︎

  10. Smith, E. J., Fujimoto, S., Romero, A., & Meger, D. (2019). Geometrics: Exploiting geometric structure for graph-encoded objects. arXiv preprint arXiv:1901.11461. ↩︎