近年来,深度学习(DL)在解决2D图像任务(如图像分类,对象检测,语义分割等)方面表现出了出色的能力。深度学习(DL)在应用于三维图形问题方面也取得了巨大的进步。在这篇文章中,我们将探讨最近将深度学习(DL)扩展到单图像3D重建任务的尝试,这是3D计算机图形领域中最重要和最深刻的挑战之一。
任务
单个图像仅是3D对象到2D平面的投影,因此来自较高维空间的一些数据必须在较低维度表示中丢失。因此,从单视图2D图像中,将永远不会有足够的数据构建其3D组件。
因此,从单个2D图像创建3D感知的方法需要预先知道 3D形状本身。
在2D深度学习中,卷积自动编码器是学习输入图像的压缩表示的非常有效的方法。将这种架构扩展到学习compact shape知识是将深度学习应用于3D数据的最有前途的方法。
3D数据的表示
与仅具有计算机格式(像素)中的一种通用表示的2D图像不同,有许多方式以数字格式表示3D数据。它们各有优缺点,因此数据表示的选择直接影响了可以利用的方法。
栅格化形式(体素网格):可以直接应用CNN
Voxel是 volumetric pixel的简称,是空间网格像素在体积网格体素中的直接延伸。每个体素的位置一起定义了该体积数据的独特结构,因此ConvNet的局部性假设在体积格式中仍然适用。
然而,这种表现形式稀疏且浪费。随着分辨率的增加,有用体素的密度降低。
- 优点:可以直接将CNN从2D应用到3D表示。
- 缺点:浪费表示,细节和资源(计算,内存)之间的高权衡。
几何形式:不能直接应用CNN
多边形网格:是顶点,边和面的集合,用于定义三维中对象的表面。它可以以相当compact representation捕获粒度细节。
点云:三维坐标(x, y, z)中点的集合,这些点在一起形成三维物体形状的云。点的集合越大,得到的细节就越多。同一组不同顺序的点仍然表示相同的3D对象。
- 优点:Compact representation,专注于3D物体的细节表面。
- 缺点:无法直接应用CNN。
# point_cloud1 and point_cloud2 represent the same 3D structure # even though they are represented differently in memory point_cloud1 = [(x1, y1, z1), (x2, y2, z2),..., (xn, yn, zn)] point_cloud2 = [(x2, y2, z2), (x1, y1, z1),..., (xn, yn, zn)]
方法
参考论文:https://arxiv.org/abs/1706.07036。我们将展示一个实现,它结合了Point Cloud compact representation的优点,但使用传统2D ConvNet学习先验形状知识的实现。
二维结构生成器
我们将构建一个标准的2D 卷积神经网络(CNN)结构生成器,学习对象的先验形状知识。体素方法并不理想,因为它效率低下,而且不可能通过卷积神经网络(CNN)直接学习点云。因此,我们将学习从单个图像到点云的多个2D projection 的映射,在视点处的2D projection 定义为:2D projection == 3D coordinates (x,y,z) + binary mask (m)
- 输入:单个RGB图像
- 输出:在预定视点处的2D projection 。
#--------- Pytorch pseudo-code for Structure Generator ---------# class Structure_Generator(nn.Module): # contains two module in sequence, an encoder and a decoder def __init__(self): self.encoder = Encoder() self.decoder = Decoder() def forward(self, RGB_image): # Encoder takes in one RGB image and # output an encoded deep shape-embedding shape_embedding = self.encoder(RGB_image) # Decoder takes the encoded values and output # multiples 2D projection (XYZ + mask) XYZ, maskLogit = self.decoder(shape_embedding) return XYZ, maskLogit
点云融合
将预测的2D projections融合到原生3D点云数据中。这是可能的,因为这些预测的观点是预先确定和已知的。
- 输入:预定视点处的2D projections。
- 输出:点云
伪渲染
我们认为,如果从预测的2D projections融合的点云具有任何优点,那么如果我们从新视点渲染不同的2D projections ,它应该类似于ground truth 3D模型的projections 。
- 输入:点云
- 输出:新视角下的深度图像。
Training dynamic:
完整的体系结构来自2D卷积结构生成器,融合和伪渲染模块
将3个模块组合在一起,我们获得了端到端模型,该模型学习了从单个2D图像生成compact 点云表示,仅使用2D卷积结构生成器。
该模型的巧妙之处在于融合+伪渲染模块是纯粹可微的几何推理:
- 几何代数意味着没有可学习的参数,使模型尺寸更小,更容易训练。
- 可微的意味着我们可以通过它反向传播梯度,从而可以使用2D projections 的损失来学习生成3D点云。
# --------- Pytorch pseudo-code for training loop ----------# # Create 2D Conv Structure generator model = Structure_Generator() # only need to learn the 2D structure optimizer optimizer = optim.SGD(model.parameters()) # 2D projections from predetermined viewpoints XYZ, maskLogit = model(RGB_images) # fused point cloud #fuseTrans is predetermined viewpoints info XYZid, ML = fuse3D(XYZ, maskLogit, fuseTrans) # Render new depth images at novel viewpoints # renderTrans is novel viewpoints info newDepth, newMaskLogit, collision = render2D(XYZid, ML, renderTrans) # Compute loss between novel view and ground truth loss_depth = L1Loss()(newDepth, GTDepth) loss_mask = BCEWithLogitLoss()(newMaskLogit, GTMask) loss_total = loss_depth + loss_mask # Back-propagation to update Structure Generator loss_total.backward() optimizer.step()
结果:
- 来自 ground truth 3D模型的新颖深度图像与来自学习点云模型的渲染深度图像的比较。
- 最终结果:从单个RBG图像→3D点云
通过详细的点云表示,可以使用MeshLab(http://www.meshlab.net/)将其转换为其他表示形式,例如与3D打印机兼容的体素或多边形网格。