首页>>科技 >>内容

如何输入3D网格物体 原始三角形和顶点,得到分类概率的输出

发布时间:2023-10-28 08:02:23编辑:温柔的背包来源:

很多朋友对如何输入3D网格物体,原始三角形和顶点,得到分类概率的输出不是很了解,每日小编刚好整理了这方面的知识,今天就来带大家一探究竟。

如何输入3D网格物体 原始三角形和顶点,得到分类概率的输出

2017年3月,老板说自动识别3D物体几乎不可能,但大家一致反对。所以我今天要解决的问题是:如何输入3D网格物体(原始三角形和顶点),得到分类概率的输出。我找到了以下解决方案:缩放对象并将其划分为体素。给神经网络提供体素。计算大量描述符,放入分类器。

从多个侧面投射对象,尝试用单独的分类器识别它们,然后将它们放入元分类器。这里我想详细说一个比较简单有效的方法,就是DeepPano法。数据准备

如今,图像数据集包含大量样本。但就3D模型数据集而言,情况并非如此。三维模型数据集中没有成千上万的图像,所以三维模型识别还没有深入研究,三维模型数据集也不平衡。大多数数据集包含方向不一致的对象。ModelNet10是一个比较清晰的3D对象数据集。3D对象存储为。包含数据集中的点、线和面的离线文件。的。关闭文件格式不支持显示织物,纹理和其他材料。

以下是对象类型和样本数量:样本总数约为5000个。当然,这个数据集也很不均衡。首先要做的是选择分类器类型。因为图像、语音等重要数据的技术解决方案都是基于神经网络(或者Kaggle比赛中经常用到的奇怪组件),所以训练神经网络是顺理成章的。神经网络对数据集的平衡性很敏感。所以第二步是让数据集更加平衡。

我决定使用来自3dWarehouse的模型来获取更多数据,并创建一个扩展数据集。这些模型存储在。skp文件格式,所以它们必须被转换。我创造了一个skp。使用SketchUp API进行转换。下一步是数据清理,相同的图像已被删除。它可以按如下方式分配:

这使得数据集看起来更加平衡。除了马桶,几乎每个对象类别都包含近1000个样本。其他对象类型之间的不平衡可以通过分类权重来纠正。数据预处理在前面的步骤中,我们已经做了几件重要的事情。说明问题。下载我们将使用的基本数据集(ModelNet10)。从最初的10种类型中选择了7种类型的对象。

通过创建一个. skp。关闭转换器以转换3d仓库中的模型。数据集变得更加平衡。现在开始深入了解数据预处理。在预处理过程中,数据预处理的最终结果是用一张新的图像来表示三维网格物体。我们将使用圆柱投影来创建图像。3D网格对象该对象的变换结果。

首先,我们需要读入3D网格对象并存储它们。这可以通过强大的trimesh库来完成。它不仅提供了读/写功能,还提供了很多其他有用的功能,如网格变换、光线追踪等。第二步是计算圆柱投影。什么是圆柱投影?假设一个立方体位于XoY平面的中心,原点有一个垂直轴。

注意:如果对象的主轴不垂直,则需要在对象识别之前应用方向对齐算法。这是一个完全不同的领域,这里就不讨论这个话题了。立方体和主轴现在假设有一个最小的圆柱体包裹着立方体。现在将圆柱体的侧面切割成m n的网格,现在将每个网格节点垂直投影到主轴上,得到一组投影点。这组投影点用p表示。这组投影线用s表示。

绿色是主轴,红色是网格,黄色是几何投影线。现在将S集中的每个线段与网格相交,即立方体。你会得到每条光线的交点。将该点分配给相应的网格节点。实际上这是一个特例。一般来说,S中的一条投影线可以有多个交点,也可以根本没有交点。这里有一个例子。

所以通常这个过程的结果是每个单元格中有一个MN的矩阵,这个矩阵可能有一个交集的数组,也可能是空的。对于立方体,每个单元将包含一个具有单个元素的数组。下一步是从每个单元格的交点中选取M中距离对应点最远的点,将它们之间的距离写入MN矩阵r,矩阵(或图像)r称为全景图。

我们为什么要选择最远的点?最远点通常集中在物体的外表面。我们用全景图来表示,可以用于识别模块。当然,有人可能会说:“高度相同的圆和圆柱体会呈现完全相同的全景”或者“中心有球形孔的立方体和没有孔的立方体会呈现完全相同的全景”,这是正确的。

在全景图中呈现3D对象并不完美,但是如果在体素中呈现就没有这样的缺点。幸运的是,椅子、床、汽车或飞机等真实物体由于其复杂性,很少有相同的全景。最后一步是通过将单元值缩放到范围[0,1]来归一化R矩阵。如果单元格没有交集,则该单元格的值为零。

现在我们可以把矩阵R看成一个灰度图像。下面是Python代码和所描述过程的全景计算的一个例子。混凝土床(左上)、椅子(右上)和马桶(中)的全景。我们来总结一下目前已经完成的步骤。现在,我们已经将3D网格对象表示为灰度图像。3D对象必须正确对齐。如果没有正确的对齐,那么我们需要首先使用方向对齐算法。

两个不同的物体有可能拥有相同的全景,但这种可能性很小。现在我们要创建卷积神经网络,解决识别问题。开始鉴定!上一步我们做了一件很重要的事情,就是找到了一个合适的方法,把3D物体转换成图像,我们可以提供给神经网络(NN)。步骤如下:我们之前已经完成了步骤1,所以现在开始步骤2和3。先说模型创建。

你可以看到建筑中的RWMP层。根据DeepPano的论文,RWMP层的作用是在3D物体绕主轴旋转时保持识别精度不变。从技术上来说,RWMP只是一个最大池线。

模型准备好并编译后,读取数据,然后刷新它,并通过调整图像大小创建一个ImageDataGenerator。请注意,数据已经按照70:15:15的比例提前进行了训练、验证和测试。因为图像是合成的并且表示3D对象,所以数据不能被放大,因为图像是灰色的,所以不能执行颜色增强。由于RWMP的存在,不能进行水平翻转。垂直翻转意味着将对象上下颠倒。

由于图像的合成性质,ZCA白化不能使用。随机旋转会丢失物体有价值的角点信息,我不确定这对3D物体变换会有什么影响。所以我想不出有什么数据放大的方法可以应用在这里。现在开始训练模型。让我们看看结果。训练绝对精度和验证绝对精度

大家可以看到,模型验证的准确率达到92%,训练的准确率达到95%,不存在过拟合的情况。模型数据集测试的总体精度为0.895。分类报告:测试数据集的混淆矩阵。我们也可以自己安排这种模式。上面的代码片段

结果看起来不错,一切顺利,除了有些桌子被误认为梳妆台。我不确定为什么会这样。这可能是未来需要改进的步骤之一。让我们列出可能的改进。鉴别时要考虑材质、质地、几何尺寸等因素,否则会形成无序模型。改善数据集的平衡或至少使用分类权重。生成模型(如VAE)可以使数据集更加平衡。添加更多对象类别。

基于全景和不同的表示(如体素)创建元模型。这可能很贵。至此,所有步骤都已介绍完毕。

以上知识分享希望能够帮助到大家!