
MeshCNN引入了网格池化操作,使我们能够将cnn应用到三维模子 中。

将机械学习应用于3D数据并不像应用于图像那样简朴。3D数据有许多体现形式,但选择决议 了您可以使用哪种学习战略。在本文中,我将先容 一个特殊 有趣的战略(至少对我来说是),叫做MeshCNN:一个有优势的网络。本文形貌 了一个用于处置赏罚 3D模子 的分类和支解使命 的通用框架。也许它最有趣的特征 是它的网格池化(mesh pooling)操作,它使我们能够在多个尺度上组合一个网格的特征(类似于视觉CNN)。这是一种学习操作,它逐渐将模子 缩减到对给定使命 提供最多信息的边缘。MeshCNN 团结 了每个盛行 3D 体现的许多最佳属性。 然而,在我们详细先容 之前,让我们通过对 3D 体现的简要回首来相识 这些属性是什么。
3d数据体现什么是体现深度学习的3D网格的最佳要领?与2D RGB图像差异,对于最佳体现方式没有共识。这个问题很难回覆,由于 表征的选择决议 了我们必须接纳的学习要领。对于分类示例,可以将模子 从3D空间投影到2D图像中,并应用尺度2D卷积。您可以将模子 所占有 的3D空间体现为体素网格,允许您应用3D卷积。你可以简朴地采样网格的极点作为一个3D点云,并应用专门的要领,如PointNet++或3D点胶囊网络。甚至尚有 像PolyGen这样的要领可以直接处置赏罚 模子 的极点和面,我在之前的文章中用PolyGen和PyTorch天生 3D模子 中提到过。

投影
一些早期的3D深度学习研究直接绕过了3D体现问题,而简朴地将3D模子 投射到2D图像中。这使得3D数据切合经典的CNN视觉要领。例如,在3D形状识此外多视图卷积神经网络中形貌 的要领将一个模子 投射到12个奇异 的视点,并将它们的激活荟萃起来,以发生一个softmax评分。在ModelNet40数据集上,他们陈诉了90.1%的可靠分类精度。凭证 项目网站的数据,ModelNet40数据集现在 的最佳性能是97.37%,这来自于一篇名为RotationNet的论文:使用无监视视点的多视图举行 团结 工具分类和姿态预计。类似于上一篇论文,它对多个视图举行 训练,展望 一个工具种别 ,但同时也展望 视点,将其作为一个潜在变量。它能够有用 地展望 工具类和视点,甚至对现实天下 的工具。
虽然简朴而优雅,可是 投影体现a)没有思量 到模子 的完整拓扑,b)对模子 应该怎样 看待做出了假设,c)没有为非全局使命 (如支解)提供一个直接的解决方案。
体积元素
体素要领在不牺牲卷积的情形 下解决了投影要领的许多问题。通过将3D空间划分为箱,建设一个麋集 的占用网格,若是 它在模子 中,则为每个单元格分配一个布尔值。网格结构很容易应用3D卷积。最早使用这种体现的论文可能是3D ShapeNets: A Deep Representation for Volumetric Shapes,这篇论文现实 上先容 了ModelNet40数据集。在这项研究中,他们试图通过从单一深度图像中展望 3D体向来 恢复物体的3D结构,并取得了相当显著的效果 。
从3D体素分类是另一回事。虽然您可以获得不错的效果 ,但弱点 是在空缺 空间上有过多的卷积,由于 空间的占用很是希罕 。最主要 的是,模子 分辨率按三次缩放权重的数目 ,因此在大多数情形 下纵然是在显著使用 空间的希罕 性时,大于 256x256x256 的巨细是不切现实 的。例如 OctNet: Learning Deep 3D representation at High resolution在这篇论文中,他们在 ModelNet40 上到达了约莫 86% 的准确率,而且在速率 和内存消耗方面有了很大的刷新 。高分辨率体素空间成本高昂,但低分辨率体素空间压缩了模子 拓扑的潜在有用点云细节
许多要领都是直接处置赏罚 向量点云。例如,在2019年的论文《Spherical Kernel for Efficient Graph Convolution on 3D Point Clouds》中,作者使用他们的要领在ModelNet40使命 上实现了89.3%的精度。3D点云体现的利益是它的多功效性,由于 从激光雷达扫描到编写的3D模子 都可以体现为3D点云。纵然是经典的PointNet和PointNet++模子 也能在分类使命 上取得很好的效果 (本文中88.0%)。弱点 是大多数点云要领完全不思量 外貌。没有面,网格的真实拓扑是不行能知道的,由于 任何向量荟萃都不能唯一地界说一组面。

这头骆驼的膝盖很是靠近 ,若是 不相识 模子 外貌,它们可能无法疏散
ModelNet40 上体现最好的要领之一来自一种名为 Relation-Shape Convolutional Neural Network for Point Cloud Analysis 的要领,它的准确率到达了 93.6%。 这种名为 RS-CNN 的要领试图从几何先验推断给定点云的底层拓扑结构,从而赋予模子 对其输入点的空间感知能力。 该模子 具有精彩的性能,可应用于点云和网格。 然而,纵然网格信息可用,它也没有使用 网格信息的机制。
MeshCNN有没有一种要领可以直接研究网格,而不牺牲有价值的拓扑信息,遭受 体素的盘算价钱,或对怎样 审查 它做出假设?MeshCNN提出的解决方案是将三维模子 作为一个图或流形来配合研究极点及其毗连 或边。该要领界说了卷积和池化层在三维网格的边缘,允许我们或多或少地使用卷积神经网络的尺度工具集。最终,他们能够在来自SHREC 11数据集的30个类上到达98.6%的精度(他们不陈诉ModelNet40的精度),而且在工具部件和人体数据集上具有令人印象深刻的支解性能。

网格池化操作的形貌 [来自MeshCNN论文的图2]。a)三角形网格的一条给定边(红色)恰恰 有4个相邻边(蓝色)。b)池化操作通过合并这条边的两个极点来消融 这条边,这两个极点依次合并消融 边双方 的边对,c)获得两条边。
任何水密三维网格的边缘都恰恰 发生在两个面上(界线 或非流形边缘除外)。若是 网格是三角形的(即它的所有面都有3条边),那么毗连 到任何边的两个关联面总接触到5条边。这种一致性使得三角形网格对于机械学习手艺 来说特殊 利便 。由于这个缘故原由 ,MeshCNN假设我们的模子 都是三角形,流形网格。典型的三维重修 要领如摄影丈量、结构光扫描、激光扫描等发生三角形网格,因此该要领可以直接适用于此类数据。建设的网格,通常包罗四边形或n-gons,通常可以转换为三角形网格,在Maya或Blender中点击几下。
若是 我们可以界说一个卷积在一个边缘和它的4个邻人 ,我们随后可以建设一个卷积神经网络来处置赏罚 整个网格。现在的挑战是界说一组具有以下属性的操作:
对极点或边的顺序(局部或全局)必须稳固 。必须是稳固 的相似变换(即网格平移,旋转和缩放)。必须转达一个给定的极点或边的关系到它的邻人 和它在网格的全局结构中的位置。网格卷积(Mesh Convolution)
首先我们来看看卷积运算自己。给定一条边和4个邻边,每个邻边都有自己的特征,卷积需要对这些边的顺序保持稳固 。本文接纳的简朴要领是用对称函数卷积。他们处置赏罚 一对相对的边(如a,c和b,d),相对于中央 边e顺时针排列,并取它们的有限和和差

边缘及其邻域(左)[从MeshCNN论文的图4中]。边a,c(红色)和边b,d(蓝色)是对立的对。需要注重 的是,顺时针符号体现边对的严酷 顺序,即a总是在b之前,c总是在d之前。给定边(右)的输入特征也被设计为对边的顺序稳固 。

等变特征组合公式来自MeshCNN论文]
# Simplified from models/layers/mesh_conv.py in ranahanocka/MeshCNN class MeshCov(nn.Module): def __init__(self, in_c, out_c, k=5, bias=True): super(MeshConv, self).__init__() self.conv = nn.Conv2d(in_channels=in_c, out_channels=out_c, kernel_size=(1, k), bias=bias) def forward(self, x) """ Forward pass given a feature tensor x with shape (N, C, E, 5): N - batch C - # features E - # edges in mesh 5 - edges in neighborhood (0 is central edge) """ x_1 = x[:, :, :, 1] + x[:, :, :, 3] x_2 = x[:, :, :, 2] + x[:, :, :, 4] x_3 = torch.abs(x[:, :, :, 1] - x[:, :, :, 3]) x_4 = torch.abs(x[:, :, :, 2] - x[:, :, :, 4]) x = torch.stack([x[:, :, :, 0], x_1, x_2, x_3, x_4], dim=3) x = self.conv(x) return x输入的特征
然而,我们还没有解决一个要害问题。我们从什么特征 最先 ?在应用第一次卷积之前,我们必须建设一个类似于二维图像中的RGB通道的输入特征体现。为此,作者简朴地为每个面界说了二面角(两个相邻面之间的角)、对称对顶角(相对角的角,排序以保持顺序稳固 性)和两个边长比(每个三角形的高/基比,也排序),总共为5个输入特征。
# From models/layers/mesh_conv.py in ranahanocka/MeshCNN def dihedral_angle(mesh, edge_points): """ Angle between two faces connected to edge. """ normals_a = get_normals(mesh, edge_points, 0) normals_b = get_normals(mesh, edge_points, 3) dot = np.sum(normals_a * normals_b, axis=1).clip(-1, 1) angles = np.expand_dims(np.pi - np.arccos(dot), axis=0) return angles def symmetric_opposite_angles(mesh, edge_points): """ Angles of opposite corners across edge. """ angles_a = get_opposite_angles(mesh, edge_points, 0) angles_b = get_opposite_angles(mesh, edge_points, 3) angles = np.concatenate((np.expand_dims(angles_a, 0), np.expand_dims(angles_b, 0)), axis=0) angles = np.sort(angles, axis=0) return angles def symmetric_ratios(mesh, edge_points): """ Height/base ratios of the triangles adjacent to edge. """ ratios_a = get_ratios(mesh, edge_points, 0) ratios_b = get_ratios(mesh, edge_points, 3) ratios = np.concatenate((np.expand_dims(ratios_a, 0), np.expand_dims(ratios_b, 0)), axis=0) return np.sort(ratios, axis=0)网格池化(Mesh Pooling)
最后,让我们看看池化操作。池化只是将这条边的两个极点合并在一起,将给定邻域的5条边折叠成2条。这两条新边的特征仅仅是它们原来的边的特征的平均值。例如,在前面的图中,我们的两条新边的特征是avg(a,b,e)和avg(c,d,e)。
可是 我们怎样 决议 哪些边要折叠呢?每个网格池层都实例化一个要保持的目的 边数(在代码中使用——pool_res参数)。网格池层只是凭证 边缘特征的平方巨细对边缘举行 排序。然后迭代折叠网格边缘,直到到达目的 边缘数。

网格池化学习保留对给定使命 最有信息的边[从MeshCNN论文的图1中]。“有把手或无把手”使命 (顶部)的池化保留了花瓶中的把手,而对于“有颈或无颈”使命 ,它保留了花瓶的颈部。
由于网格池化操作是可学习的,它赋予模子 自由学习优化给定使命 的权重。 尚有 一个网格解池操作可以恢复池化,这对于支解使命 是必不行少的。 这意味着网络必须跟踪在 U-Net 气焰 气焰 支解网络的编码器阶段完成的池化操作。 MeshCNN 通过跟踪网格的 history_data 属性中的边缘折叠操作来做到这一点。
网络结构
网络结构由MResConv层组成,每个层由一个初始网格卷积(MeshConv)、几个一连 的ReLU+BatchNorm+MeshConv层和一个残差毗连 和另一个ReLU组成。在使命 层竣事 之前,网络遵照 多次MResConv+Norm+MeshPool的模式。对于分类,使命 层是简朴的全局平均池,然后是两个完全毗连 的层。支解网络是一个U-Net气焰 气焰 的编码器-解码器。
总结等变卷积运算、稳固 的输入特征和学习到的网格池运算使MeshCNN成为一个特殊 有趣的模子 ,它有以下几个主要优点:
比旧要领更高效,参数更少。
使用 网格的拓扑结构(即极点和面信息),而不是将其视为点云。
网格卷积保留了卷积的便利性子 ,但允许应用于图形数据。三维网格的5个输入特征类似于输入图像的RGB特征。
对旋转、平移和缩放稳固 性(见论文第5.4节)。
网格池化(即学习到的边折叠)允许网络通过将5条边折叠成2条边并同时剖析两个面来学习特定使命 的池化。
若是 您盼愿 亲自实验它,我勉励您审查 作者提供的MeshCNN源代码(ranahanocka/MeshCNN)。它是用PyTorch编写的,并提供了许多有用的剧本 ,用于在本文中讨论的种种数据集上实验该模子 。我发现它很是清洁 和易于使用,以是 若是 你好奇,它值得一看。一如既往,谢谢您的阅读和继续学习!
作者:Mason McGough
deephub翻译组

