使用PolyGen和PyTorch生成3D模型

介绍深度学习研究的一个新兴领域是致力于将DL技术应用于3D几何和计算机图形应用程序 ,对于希望自己尝试3D深度学习的PyTorch用户而言 , 一个叫Kaolin 库值得研究 。对于TensorFlow用户 , 还有TensorFlow Graphics库 。3D技术中一个特别热门的子领域是3D模型的生成 。创造性地组合3D模型 , 从图像快速生成3D模型 , 以及为其他机器学习应用程序和模拟创建综合数据 , 这只是3D模型生成的众多用例中的少数几个 。
使用PolyGen和PyTorch生成3D模型文章插图
使用top-p = 0.9的核采样和地面真实网格(蓝色)生成的图像条件样本(黄色) 。
但是 , 在3D深度学习研究领域 , 为数据选择合适的表示是成功的一半 。 在计算机视觉中 , 数据的结构非常简单:由密集像素组成的图像 , 这些像素整齐均匀地排列在精确的网格中 。3D数据的世界没有这种一致性 。3D模型可以表示为体素 , 点云 , 网格 , 多视图图像集等 。 这些输入表示形式也各有其缺点 。 例如 , 体素尽管计算成本高 , 但输出分辨率低 。 点云没有编码表面或其法线的概念 , 因此不能仅从点云中唯一地推断拓扑 。 网格也不会对拓扑进行唯一编码 , 因为可以细分任何网格以生成相似的曲面 。 这些缺点促使DeepMind的研究人员创建了PolyGen , 这是一种用于网格的神经生成模型 , 可以共同估计模型的面和顶点以直接生成网格 。 官方实现可在DeepMind GitHub上获得 。
研究
使用PolyGen和PyTorch生成3D模型文章插图
3D重建问题和3D-R2N2方法
当今非常经典的PointNet论文为建模点云数据(例如3D模型的尖端)提供了蓝图 。 它是一种通用算法 , 不会对3D模型的面或占用进行建模 , 因此无法仅使用PointNet来生成3D-R2N2采用的体素方法将我们都熟悉的2D卷积扩展到3D , 并通过自然地从RGB图像生成水密网格 。 但是 , 体素表示在更高的空间分辨率下在计算上变得昂贵 , 从而有效地限制了它可以生成的网格的大小 。
通过变形模板网格(通常是椭圆形) , Pixel2Mesh可以从间隙图像预测3D模型的尖端和面 。 目标模型必须与模板网格同胚 , 因此使用椭圆形之类的凸形模板网格会在高度不凸的对象(例如椅子和灯具)上个月多个假物体 。 拓扑修改网络(TMN)通过另一个两个新阶段在Pixel2Mesh上进行迭代:变形修改阶段(用于补偿会增加模型重建误差的错误面孔) )和边界优化阶段 。
使用PolyGen和PyTorch生成3D模型文章插图
同胚的经典例子
尽管变形和改进模板网格的常用方法效果很好 , 但它始于有关模型拓扑的主要假设 。3D模型的核心只是一个3D空间中的顶点集合 , 通过各个面进行分组和连接在一起 。是否可以避开中间表示并直接预测这些顶点和面?
PolyGen
使用PolyGen和PyTorch生成3D模型文章插图
PolyGen 架构
PolyGen通过将3D模型表示为顶点和面的严格有序序列 , 而不是图像 , 体素或点云 , 对模型生成任务采取了一种非常独特的方法 。这种严格的排序使他们能够将基于注意力的序列建模方法应用于生成3D网格 , 就像BERT或GPT模型对文本所做的一样 。
PolyGen的总体目标是双重的:首先为3D模型生成一组可能的顶点(可能由图像 , 体素或类标签来限制) , 然后生成一系列的面 , 一个接一个地连接 顶点在一起 , 为该模型提供了一个合理的表面 。组合模型将网格p(M)上的分布表示为两个模型之间的联合分布:代表顶点的顶点模型p(V)和代表以顶点为条件的面的模型p(F | V) 。
使用PolyGen和PyTorch生成3D模型文章插图
顶点模型是一种解码器 , 它尝试预测以先前标记为条件的序列中的下一个标记(并可选地以图像 , 体素字段或类标签为条件) 。表面模型由一个编码器和一个解码器指针网络组成 , 该网络表示顶点序列的分布 。该指针网络一次有效地"选择"一个顶点以添加到当前面序列并构建模型的面 。此模型均以先前的面序列和整个顶点序列为条件 。由于PolyGen架构非常复杂 , 并且依赖于各种概念 , 因此本文仅限于顶点模型 。 我将在后续文章中介绍表面模型 。
预处理顶点流行的ShapeNetCore数据集中的每个模型都可以表示为顶点和面的集合 。 每个顶点都包含一个(x , y , z)坐标 , 该坐标描述了3D网格中的一个点 。 每个面都是指向组成该面角的顶点的索引列表 。 对于三角形面 , 此列表的长度为3个索引 。 对于n形面 , 此列表的长度是可变的 。 原始数据集非常大 , 因此为了节省时间 , 我在此处为您的实验提供了数据集的一个更轻量级 , 经过预处理的子集 。 该子集仅包含来自5个形状类别的模型 , 并且转换为n形后的顶点少于800个(如下所述) 。