PyTorch生成3D模型。
有一个新的深度学习研究领域,专注于将DL技术应用于3D几何和计算机图形应用。这个长期的研究收集证明了这一点。对于想尝试一些3D深度学习的PyTorch用户来说,高岭土库值得研究。对于TensorFlow用户,有TensorFlow图形。一个特别热门的子领域是3D模型的生成。3D模型的创造性组合、从图像快速生成3D模型以及为其他机器学习应用和模拟创建合成数据只是3D模型生成的无数用例中的几个。
然而,在3D深度学习研究领域,为您的数据选择正确的表示方法是成功的一半。在计算机视觉中,数据的结构非常简单:图像由密集的像素组成,这些像素整齐而均匀地排列在一个精确的网格中。在3D数据的世界里没有这样的一致性。3D模型可以表示为体素、点云、网格、多视图图像集等等。这些输入表示也有它们自己的缺点。比如体素的计算成本虽然高,但是输出分辨率很低。点云没有对曲面或其法线的概念进行编码,所以仅从点云不可能唯一推断出拓扑。网格也不会唯一地编码拓扑,因为任何网格都可以细分以产生相似的表面。PolyGen是一种用于网格的神经生成模型,它联合估计模型的面和顶点来直接生成网格。DeepMind GitHub上提供了官方实现。
现在经典的点网论文提供了点云数据建模的蓝图,比如三维模型的顶点。它是一种通用算法,不对3D模型的表面或职业进行建模,因此单独使用PointNet无法生成唯一的防水网格。3D-R2N2采用的体素方法将大家熟悉的2D卷积扩展到3D,从RGB图像中自然生成防水网格。然而,在更高的空间分辨率下,体素表示的计算成本非常高,这有效地限制了它可以生成的网格的大小。
Pixel2Mesh可以通过变形模板网格(通常是椭球体)从单幅图像中预测3D模型的顶点和面。目标模型必须与模板网格同胚,所以使用凸模板网格(如椭球体)会在椅子、灯等高度非凸的物体上引入很多伪脸。拓扑修改网络(TMN)通过引入两个新阶段来迭代Pixel2Mesh:拓扑修改阶段用于修剪会增加模型重建误差的错误曲面,边界细化阶段用于平滑曲面修剪引入的锯齿状边界。如果你有兴趣的话,我强烈推荐同时观看AtlasNet和层次表面预测。
虽然变形和细化模板网格的常用方法表现良好,但它们都是从模型拓扑的主要假设出发的。就其核心而言,3D模型只是3D空间中的一组顶点,这些顶点通过各种面进行分组和连接。能否避开中间表示,直接预测这些顶点和面?
PolyGen采用了一种相当独特的方法来完成模型生成任务,将3D模型表示为严格有序的顶点和面序列,而不是图像、体素或点云。这种严格的排序使他们能够应用基于注意力的序列建模方法来生成3D网格,就像伯特或GPT模型对文本所做的那样。
PolyGen有两个总体目标:首先,为3D模型生成一组合理的顶点(可能基于图像、体素或类标签),然后生成一系列面,一个接一个地将顶点连接在一起,为该模型提供合理的表面。组合模型将网格上的分布p(M)表示为两个模型的联合分布:顶点模型p(V)表示顶点,曲面模型p(F|V)表示以顶点为条件的曲面。
顶点模型是试图预测序列中的下一个标记的解码器,该序列以前一个标记为条件(并且可选地以图像、体素字段或类标签为条件)。人脸模型由一个编码器和一个解码器指针网络组成,代表顶点序列上的分布。指针网络有效地一次“选择”一个顶点来添加到前面的序列并构建模型。该模型基于先前的面序列和整个顶点序列。因为PolyGen架构相当复杂,并且依赖于各种概念,所以本文将仅限于顶点模型。
流行的ShapeNetCore数据集中的每个模型都可以表示为一组顶点和面。每个顶点由一个(x,y,z)坐标组成,该坐标描述了3D网格中的一个点。每个面都是一个索引列表,指向构成面的角的顶点。对于三角形面,这个列表有3个索引长。对于N面,此列表的长度是可变的。原始数据集非常大,所以为了节省时间,我在这里提供了预处理数据集的一个较轻的子集,供大家实验。该子集仅包含来自五个形状类别的模型,并且在转换为N多边形(如下所述)后具有少于800个顶点。
为了使序列建模方法起作用,数据必须以受约束和确定性的方式表达,以尽可能地消除可变性。为此,作者简化了数据集。首先,他们将所有输入模型从三角形(连接三个顶点的面)转换为N多边形(连接N个顶点的面),并用Blender的平面提取修改器合并这些面。这提供了同一拓扑的更紧凑的表示,并减少了三角剖分中的模糊性,因为大型网格并不总是具有唯一的三角剖分。出于篇幅考虑,本文不讨论Blender脚本,但是有很多资源,包括官方文档和GitHub上的这组优秀例子,都很好地涵盖了这个话题。我提供的数据集已经提前提取了。
若要继续,请下载此示例cube.obj文件。这个模型是一个有8个顶点和6个面的基本立方体。下面的简单代码片段从单个。obj文件。
其次,顶点从z轴(本例中为垂直轴)开始按升序排序,然后是y轴,最后是x轴。通过这种方式,模型顶点从下到上被表示。在普通多边形模型中,顶点被连接成一维序列向量。对于更大的模型,这个向量最终会得到一个很长的序列向量。作者在论文的附录E中描述了一些减轻这一负担的修改。
为了对一系列顶点进行排序,我们可以使用字典排序。这与在字典中排序单词是一样的。排序两个单词,你会看第一个字母,然后看第二个字母是否有平局,以此类推。对于“土豚”和“苹果”这两个词,第一个字母是“a”和“a”,所以我们移到第二个字母“a”和“p”来告诉我“土豚”在“苹果”之前。在这种情况下,我们的“字母”是依次排列的z,y,x坐标。
最后,将顶点坐标归一化,然后量化,以将其转换为离散的8位值。这种方法已经被用于在像素递归神经网络和WaveNet中模拟音频信号,使得它们可以对顶点值应用分类分布。在最初的WaveNet论文中,作者评论说“分类分布更加灵活,并且更容易对任意分布建模,因为它不对它们的形状做任何假设。”这种品质对于建模复杂的依赖关系非常重要,例如3D模型中顶点之间的对称性。
顶点模型由一个解码器网络组成,它具有transformer模型的所有标准功能:输入嵌入、18 transformer解码器层的堆栈、层规范化,以及最后在所有可能的序列标记上表示的softmax分布。给定长度为n的平坦顶点序列Vseq,目标是最大化具有给定模型参数的数据序列的对数似然性:
与LSTM不同,transformer模型可以并行处理顺序输入,同时仍然支持来自序列一部分的信息为另一部分提供上下文。这一切都要归功于他们的注意力模块。三维模型的顶点包含各种对称性和远地点之间复杂的依赖关系。例如,考虑一个典型的桌子,其中模型对角的桌腿互为镜像。注意模块允许对这些类型的模式进行建模。
嵌入层是一种常用技术,用于在序列建模中将有限数量的标签转换为特征集。在语言模型中,“国家”和“民族”这两个词的含义可能非常相似,但与“苹果”这两个词相差甚远。当单词由独特的标记表示时,不存在固有的相似或不同的概念。嵌入层将这些标记转换成矢量表示,可以模拟有意义的距离感。
多边形将相同的原理应用于顶点。该模型使用三种类型的嵌入层:坐标指示输入标记是X、Y还是Z坐标,值指示标记的值,以及位置编码顶点的顺序。每个都向模型传递了一条关于令牌的信息。因为我们的顶点是一次在一个轴上输入的,所以坐标嵌入为模型提供了基本的坐标信息,使其可以知道给定值对应的坐标类型。
值嵌入对我们之前创建的量化顶点值进行编码。我们还需要一些序列控制点:额外的开始和停止标签分别标记序列的开始和结束,并将标签填充到最大序列长度。
通过位置嵌入来恢复由于并行化而丢失的给定序列位置n的位置信息。也可以用位置编码,一种不需要学习的封闭表达形式。在经典的Transformer论文“注意力是你所需要的全部”中,作者定义了一种位置编码,它由不同频率的正弦和余弦函数组成。他们通过实验证实,位置嵌入的性能和位置编码一样好,但编码的优点是比训练中遇到的序列长。关于位置编码的精彩视觉解释,请查看这篇博文。
在生成所有这些标签序列之后,最后要做的事情是创建一些嵌入层并组合它们。每个嵌入层需要知道预期输入字典的大小和输出的嵌入维数。每一层的嵌入维数是256,也就是说我们可以用加法把它们组合起来。字典的大小取决于输入可以拥有的唯一值的数量。对于值嵌入,它是量化值的数量加上控制标志的数量。对于坐标嵌入,是每个坐标x、y、z一个,而不是以上任何一个(控制标记)。最后,位置嵌入对于每个可能的位置或最大序列长度都需要一个。
PolyGen还广泛使用无效的预测遮罩,以确保它生成的顶点和面部序列编码有效的3D模型。例如,必须强制执行“Z坐标不减少”和“停止标记只能出现在完整的顶点(Z、Y和X标记的三元组)之后”等规则,以防止模型生成无效的网格。作者在论文的附录F中提供了他们使用的口罩的详细列表。这些约束仅在预测时实施,因为它们实际上会损害训练性能。
和很多序列预测模型一样,这个模型是自回归的,也就是说给定时间步的输出是下一个时间步可能值的分布。整个序列一次预测一个标记,并且在每一步,模型查看前一时间步中的所有标记以选择其下一个标记。解码策略决定了它如何从这个分布中选择下一个令牌。
如果使用次优解码策略,生成的模型有时会陷入重复循环或产生质量差的序列。我们都看到生成的文本看起来像废话。PolyGen使用一种称为内核采样的解码策略来生成高质量的序列。原始论文在文本生成的上下文中应用了这种方法,但是它也可以应用于顶点。前提很简单:只从softmax分布中* * *享有top-p概率质量的标签中随机选择下一个标签。这被应用于推理以生成网格,同时避免序列退化。内核采样的PyTorch实现参见这一点。
除了无条件生成模型,PolyGen还支持使用类别标签、图像和体素进行输入调整。这些可以指导生成具有特定类型、外观或形状的网格。类别标签通过嵌入进行投影,然后添加到每个注意块中的自我注意层。对于图像和体素,编码器创建一组嵌入,然后用于与转换器解码器的交叉注意。
PolyGen模型描述了一个强大、高效和灵活的框架,用于有条件地生成三维网格。序列生成可以在各种条件和输入类型下完成,从图像到体素到简单的类标签,甚至只是一个起始标签。代表网格顶点分布的顶点模型只是联合分布问题的一部分。我打算在以后的文章中介绍面部模型。同时,我鼓励你去看看DeepMind的TensorFlow实现,并尝试生成一个条件模型!
原文链接:/blog/polygen-3d-models/