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

2019 年 1 月 11 日 机器之心

选自Medium

作者:Phúc Lê

机器之心编译

参与:李诗萌、王淑婷


深度学习在诸多 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



本文为机器之心编译,转载请联系本公众号获得授权

✄------------------------------------------------

加入机器之心(全职记者 / 实习生):hr@jiqizhixin.com

投稿或寻求报道:content@jiqizhixin.com

广告 & 商务合作:bd@jiqizhixin.com

登录查看更多
4

相关内容

3D是英文“Three Dimensions”的简称,中文是指三维、三个维度、三个坐标,即有长、有宽、有高,换句话说,就是立体的,是相对于只有长和宽的平面(2D)而言。
专知会员服务
73+阅读 · 2020年5月21日
3D目标检测进展综述
专知会员服务
191+阅读 · 2020年4月24日
【CVPR2020】图神经网络中的几何原理连接
专知会员服务
56+阅读 · 2020年4月8日
专知会员服务
199+阅读 · 2020年3月6日
专知会员服务
44+阅读 · 2020年3月6日
GANs最新综述论文: 生成式对抗网络及其变种如何有用
专知会员服务
70+阅读 · 2019年10月19日
PointNet系列论文解读
人工智能前沿讲习班
17+阅读 · 2019年5月3日
【学习】CVPR 2017 Tutorial:如何从图像来构建3D模型
机器学习研究会
6+阅读 · 2017年8月8日
Image Segmentation Using Deep Learning: A Survey
Arxiv
45+阅读 · 2020年1月15日
Arxiv
12+阅读 · 2019年1月24日
VIP会员
相关VIP内容
Top
微信扫码咨询专知VIP会员