参与李诗萌 王淑婷

深度学习新应用:在PyTorch中用单个2D图像创建3D模型

深度学习在诸多 2D 图像任务中表现出色,毋庸置疑。但如何将它应用于 3D 图像问题中呢?文本通过探索,将深度学习扩展到了单个 2D 图像的 3D 重建任务中,并成功实现了这一应用。

近年来,深度学习在解决图像分类、目标识别、语义分割等 2D 图像任务方面的表现都很出色。不仅如此,深度学习在 3D 图像问题中的应用也取得了很大的进展。本文试着将深度学习扩展到单个 2D 图像的 3D 重建任务中,这是 3D 计算机图形学领域中最重要也是最有意义的挑战之一。

任务

单个图像只是 3D 对象在 2D 平面的投影,所以一些高维空间的数据一定会在低维表征中丢失。因此,单视角 2D 图像中并没有足够的数据来构建其 3D 组件。

要根据单个 2D 图像创建 3D 感知,首先需要关于 3D 形状本身的先验知识

在 2D 深度学习中,卷积自编码器是一种学习输入图像压缩表征的有效方法。将该架构拓展到学习紧凑形状知识是将深度学习应用于 3D 数据的最有前景方法。

CNN 编码深度形状先验知识

3D 数据表征

3D 数据的不同表征

与计算机格式中只有一种通用表征(像素)的 2D 图像不同,3D 数据能够以许多数字形式来表示。它们各有优缺点,所以数据表征的选择直接影响了使用它们的方法。

栅格化形式(体素网格):可以直接应用 CNN

每个蓝色的盒子表示单个体素,大部分体素都是空的。

体素是体积像素(volumetric pixel)的简称,它直接将空间网格像素拓展为体积网格体素。每一个体素的局部性共同定义了该体积数据独一无二的结构,因此 ConvNet 的局部性假设在立体形式中仍然成立。

体素表征密度低

但这种表征既稀疏又浪费。有用体素的密度会随着分辨率的增加而降低。

  • 优势: 从 2D 表征到 3D 表征,可以直接应用 CNN

  • 劣势:容易浪费,要在细节和资源(计算力、内存)之间好好权衡。

几何形式:不能直接应用 CNN

椅子的点云表征

多边形网格:是三维空间中定义对象表面的顶点、边和面的集合。它可以在相当紧凑的表征中捕获粒度细节。

点云:3D 坐标(x,y,z)中点的集合,这些点一起形成了与 3D 对象形状类似的云。点的集合越大,获得的细节就越多。同一组顺序不同的点表示同样的 3D 对象。

  • 优势:表征紧凑,重点关注 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)]

方法

本文的实现结合了点云紧凑表征的优势,但是用了传统的 2D ConvNet 来学习先验形状知识。

2D 结构生成器

我们将构建标准的 2D CNN 结构生成器来学习目标的先验形状知识。我们没有用体素方法,因为它效率比较低下,而且不能直接用 CNN 学习点云。因此我们将学习从单个图像到点云的多个 2D 投影的映射,将一个视角的 2D 投影定义为:2D projection == 3D coordinates (x,y,z) + binary mask (m)

  • 输入:单个 RGB 图像

  • 输出:预先设定视角的 2D 投影

#--------- 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 投影融合到原生 3D 点云数据中。这是有可能实现的,因为这些预测值的视角是固定的,而且是已知的。

  • 输入:预先设定视角的 2D 投影

  • 输出:点云。

伪渲染

我们认为,如果用预测的 2D 投影融合得到的点云有用,那么如果我们从新视角渲染出不同 2D 投影的话,它应该与真实 3D 模型的投影类似。

  • 输入:点云

  • 输出:新视角的深度图像

训练动态

由 2D 卷积结构生成器、融合模块以及伪渲染模块组成的完整架构。

将这三个模块组合在一起,我们得到了一个端到端模型,它可以只用 2D 卷积结构生成器,根据单个 2D 图像学习生成紧凑的点云表征。

这个模型的巧妙之处在于使融合模块和伪渲染模块可以纯粹地进行可微分的几何推理:

  • 几何代数意味着没有可学习的参数,这使得模型更小、更易于训练。

  • 可微分意味着我们可以反向传播梯度,从而用 2D 投影的损失来学习生成 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()

结论

比较来自真实 3D 模型的新深度图像和通过学到的点云模型渲染得到的深度图像。

最终结果:从单个 RGB 图像→3D 点云

有了详细的点云表征,就可以用 MeshLab 将单个 RGB 图像转换为其它表征,比如与 3D 打印机兼容的体素或多边形网格。

参考

  • Pytorch 代码:https://github.com/lkhphuc/pytorch-3d-point-cloud-generation

  • Tensorflow 代码:https://github.com/chenhsuanlin/3D-point-cloud-generation

  • 论文:https://arxiv.org/abs/1706.07036

  • 原始项目网站:https://chenhsuanlin.bitbucket.io/3D-point-cloud-generation/

参考链接:https://medium.com/vitalify-asia/create-3d-model-from-a-single-2d-image-in-pytorch-917aca00bb07

工程计算机视觉图像重建
7
相关数据
深度学习技术

深度学习(deep learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。 深度学习是机器学习中一种基于对数据进行表征学习的算法,至今已有数种深度学习框架,如卷积神经网络和深度置信网络和递归神经网络等已被应用在计算机视觉、语音识别、自然语言处理、音频识别与生物信息学等领域并获取了极好的效果。

图像压缩技术

图像压缩是数据压缩技术在数字图像上的应用,目的是减少图像数据中的冗余信息,从而用更加高效的格式存储和传输数据。图像压缩可以是有损数据压缩也可以是无损数据压缩。

计算机图形技术

图像数据处理、计算机图像(英语:Computer Graphics)是指用计算机所创造的图形。更具体的说,就是在计算机上用专门的软件和硬件用来表现和控制图像数据。

感知技术

知觉或感知是外界刺激作用于感官时,脑对外界的整体的看法和理解,为我们对外界的感官信息进行组织和解释。在认知科学中,也可看作一组程序,包括获取信息、理解信息、筛选信息、组织信息。与感觉不同,知觉反映的是由对象的各样属性及关系构成的整体。

参数技术

在数学和统计学裡,参数(英语:parameter)是使用通用变量来建立函数和变量之间关系(当这种关系很难用方程来阐述时)的一个数量。

映射技术

映射指的是具有某种特殊结构的函数,或泛指类函数思想的范畴论中的态射。 逻辑和图论中也有一些不太常规的用法。其数学定义为:两个非空集合A与B间存在着对应关系f,而且对于A中的每一个元素x,B中总有有唯一的一个元素y与它对应,就这种对应为从A到B的映射,记作f:A→B。其中,y称为元素x在映射f下的象,记作:y=f(x)。x称为y关于映射f的原象*。*集合A中所有元素的象的集合称为映射f的值域,记作f(A)。同样的,在机器学习中,映射就是输入与输出之间的对应关系。

先验知识技术

先验(apriori ;也译作 先天)在拉丁文中指“来自先前的东西”,或稍稍引申指“在经验之前”。近代西方传统中,认为先验指无需经验或先于经验获得的知识。先验知识不依赖于经验,比如,数学式子2+2=4;恒真命题“所有的单身汉一定没有结婚”;以及来自纯粹理性的推断“本体论证明”

语义分割技术

语义分割,简单来说就是给定一张图片,对图片中的每一个像素点进行分类。图像语义分割是AI领域中一个重要的分支,是机器视觉技术中关于图像理解的重要一环。

图像分类技术

图像分类,根据各自在图像信息中所反映的不同特征,把不同类别的目标区分开来的图像处理方法。它利用计算机对图像进行定量分析,把图像或图像中的每个像元或区域划归为若干个类别中的某一种,以代替人的视觉判读。

暂无评论
暂无评论~