0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

电子工程师 来源:未知 作者:李倩 2018-06-24 09:58 次阅读

2017 年 3 月,当时我的老板说自动识别 3D 物体几乎是不可能的,但大家一致反对。

因此,今天我要解决的问题是:如何输入 3D 网格物体(原始三角形和顶点),得到分类概率的输出。

我找到了如下几种解决方案:

对物体进行缩放并将其分割成体素。将体素给到神经网络中。

计算大量描述符,将其放入分类器。

从多侧进行物体投射,尝试用单独的分类器进行识别,然后将其放到元分类器中。

在这里我想详细讲述一下一种相对简单有效的方法,即 DeepPano 方法。

▌数据准备

如今,图像数据集包含大量样本。但就 3D 模型数据集而言,并非如此。3D模型数据集中没有成千上万的图像,因此 3D 模型识别没有得到深入研究,3D模型数据集也不均衡。大多数数据集包含有未进行方向对齐的物体。

ModelNet10 是一个相对清晰的 3D 物体数据集。3D 物体在数据集中被存储为包含点线面的.off文件。 .off文件格式不支持显示布料、纹理以及其他材质。

这里是物体种类与样本数量:

样本总数约为 5000。当然这个数据集也非常不均衡。

首先要做的是选择分类器类型。由于如图像、语音等重要数据的技术解决方案都是基于神经网络(或在 Kaggle 比赛中经常使用的奇特组件),因此训练神经网络是合乎逻辑的。神经网络对数据集的均衡性很敏感。所以第二步需要做的是使数据集更均衡。

我决定使用从 3dWarehouse 中得到的模型获取更多数据并创建扩展数据集。这些模型是以.skp文件格式存储的,因此必须进行转换。我使用SketchUp C Api创建了.skp - >.off转换器来进行转换。

下一步是数据清理,完全相同的图像已被删除。可以这样分配:

这样数据集看起来就比较均衡了。除马桶外,几乎每个物体类别都包含有近 1000 个样本。其他物体类型之间的不均衡可通过分类权重进行修正。

▌数据预处理

在之前的步骤中,我们已经做了几件重要的事情。

阐述问题。

下载我们将要使用的基本数据集(ModelNet10)。

从最初的 10 类物体中选出了7类。

通过创建.skp - > .off 转换器来转换 3d warehouse.中的模型,数据集变得更加均衡。

现在开始深入了解数据预处理。

在预处理过程中,数据预处理的最终结果是要用一种新的图像来表示 3D 网格物体。我们将使用圆柱投影来创建图像。

3D网格物体

此物体的转换结果

首先,我们需要读入 3D 网格物体并进行存储。这可以通过功能强大的 trimesh 库来完成。它不仅提供读/写功能,而且有大量其他有用的功能,如网格变换,光线追踪等。

第二步是计算圆柱投影。圆柱投影是什么呢?假设一个立方体位于 XoY 平面的中心,且原点有一条垂直轴。

注意:如果物体的主轴不垂直,则需要在进行物体识别前应用方向对齐算法。这是一个完全不同的领域,因此在这里不对此主题进行探讨。

立方体和主轴

现在假设有一个包裹立方体的最小圆柱体。

现在将圆柱体的侧面切割成 M×N 的网格。

现在将每个网格节点垂直投影到主轴上并获取一组投影点。投影点集合由P表示。投影线集合由 S 表示。

绿色是主轴,红色是网格,黄色是几何投影线。

现在将 S 集合中的每段与网格体,即该立方体相交。你将从每条射线获得一个交点。将该点分配给相应的网格节点。

其实这是一个特例。一般情况下,S 中的一个投影线可以有多个交点,或者根本没有交点。下面就是一个例子。

因此,通常这个过程的结果是在每个单元中都有一个 M×N 矩阵,其中可能具有交点数组,也可能是空的。对于立方体,每个单元格将包含具有单个元素的数组。

下一步是从每个单元格的交点中选取离对应的 M 中的点距离最远的点,并将它们之间的距离写入 M×N 矩阵 R。矩阵(或图像)R 称为全景图。

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

以全景图来呈现 3D 物体并不完美,但如果是用体素来呈现则没有这样的缺点。幸运的是,像椅子、床、汽车或飞机这些真实存在的物体由于其复杂性,很少有相同的全景图。

最后一步是通过将单元格的值缩放到[0,1]区间,对R矩阵进行归一化。如果单元格没有交点,则该单元格的值为零。

现在我们可以将矩阵 R 视为灰度图像。这里是所描述过程的 Python 代码和全景图计算的一个例子。

混凝土床(左上)、椅子(右上)和马桶(中)的全景图。

我们总结一下到目前为止已经完成的步骤。

现在我们已经将 3D 网格物体表示为灰度图像。

3D 物体必须正确对齐。如果没有正确对齐,那么我们首先需要使用方向对齐算法。

两个不同的物体有可能具有相同的全景图,但这种可能性很小。

现在我们准备创建卷积神经网络并解决识别问题。

▌开始识别!

我们在上一步中做了一件非常重要的事情,即找到一种合适的方法将 3D 物体转换成图像,我们可以将其提供给神经网络(NN)。

步骤如下所示:

我们之前已经完成了第 1 步,所以现在我们开始第 2 步和第 3 步。

让我们从模型创建开始。

你可以在架构中看到 RWMP 层。根据DeepPano论文,RWMP层的作用在于, 在 3D 物体围绕主轴旋转的情况下,保持识别精度不变。从技术上讲,RWMP 只是一个行式的 MaxPooling。

模型准备就绪并编译完成后,读取数据,然后将其刷新,并通过图像尺寸调节创建 ImageDataGenerator。请注意,数据预先按照 70:15:15 的比例进行了训练、验证和测试。由于图像是合成的,并且代表了 3D 物体,因此数据无法进行扩增,因为:

由于图像是灰度的,所以不能进行颜色增强。

由于 RWMP 的存在,不能进行水平翻转。

垂直翻转意味着将物体颠倒。

由于图像的合成性质,无法使用ZCA白化。

随机旋转会损失宝贵的物体边角信息,我无法确定这会对3D物体转换产生什么影响。

所以我想不出任何可以应用在这里的数据扩增方法。

现在开始训练模型。

让我们看看结果。

训练绝对准确度和验证绝对准确度

正如你所看到的,该模型验证的准确度达到了92%,训练的准确度达到了95%,所以没有过度拟合。该模型数据集测试的整体准确度度为 0.895。

分类报告:

测试数据集的混淆矩阵

我们也可以自行排列这个模型。

来自上面的代码片段

结果看起来不错,一切都进行得都很顺利,只是有些桌子被错误地识别为梳妆台了。我不确定为什么会发生这种情况。这可能是未来需要改进的步骤之一。

让我们列出可能需要改进的地方。

识别时要考虑材料、纹理和几何尺寸等因素,否则会形成致无序模型。

提高数据集的均衡性或至少使用分类权重。生成模型(例如VAE)可使数据集更均衡。

添加更多的物体类别。

基于全景图和不同的表示形式创建元模型,例如体素。这可能很昂贵。

目前为止,所有步骤介绍完毕。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 自动识别
    +关注

    关注

    3

    文章

    221

    浏览量

    22838
  • 三维网格
    +关注

    关注

    1

    文章

    6

    浏览量

    7568
  • 数据集
    +关注

    关注

    4

    文章

    1208

    浏览量

    24703

原文标题:一文教会你三维网格物体识别

文章出处:【微信号:rgznai100,微信公众号:rgznai100】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    三角形和星形电机参数怎么确定?

    请教一下 三角形和星形电机怎么确定,通过测量 ------- 线电阻=2*相电阻 星形 线电阻=2/3*相电阻 三角形 这个说法对吗
    发表于 03-07 06:57

    三角形网格球面参数化研究

    三角形网格映射到单位球面上,接着利用球面均值迭代调整调和能量,使其向最小化方法演化,最后通过坐标转换计算得到三角形网格的球面参数。实验证明改
    发表于 04-24 09:55

    三角形栅格矩形径向线螺旋阵列天线的设计与实验研究

    三角形栅格矩形径向线螺旋阵列天线的设计与实验研究:介绍了三角形栅格矩形径向线螺旋阵列天线的工作原理,设计并数值模拟了中心频率为4.0 GHz的三角形栅格矩形径
    发表于 10-27 10:27 24次下载

    相负载三角形连接

    实验  相负载三角形连接 一、实验目的:1.熟悉相负载作三角形连接的方法。2.验证负载作
    发表于 09-24 14:09 3w次阅读
    <b class='flag-5'>三</b>相负载<b class='flag-5'>三角形</b>连接

    三角形

    三角形目前的多分辨率算法(LOD)大多采用三角形作为最小的渲染图元,综合该算法的主要思想,使用一种更加复杂的图元:以“宏三角形”为最小
    发表于 03-02 11:17 1036次阅读
    宏<b class='flag-5'>三角形</b>

    相负载的三角形连接方法

    相负载的三角形连接方法 将相负载Zuv、Zvw、Zwu接成三角形后与电源相连,如图3.10所示,就构成三角形连接的
    发表于 04-15 09:01 1.6w次阅读
    <b class='flag-5'>三</b>相负载的<b class='flag-5'>三角形</b>连接方法

    C语言教程之输出一个三角形

    C语言教程之输出一个三角形,很好的GD32资料,快来学习吧。
    发表于 04-21 17:55 0次下载

    C语言教程之利用#输出三角形

    C语言教程之利用#输出三角形,很好的C语言资料,快来学习吧。
    发表于 04-22 11:06 0次下载

    基于贪心优化策略的三角形排布算法

    改进的代价函数选择代价度量最小的顶点作为活动顶点;然后绘制(即输出)其所有未绘制的邻接三角形,并将相邻顶点压入缓存,算法迭代执行直到所有
    发表于 12-15 14:09 0次下载

    星形/三角形的变换法介绍

    星形-三角形变换法与三角形-星形变换法原则上是等效的。为了简化计算,可以把星形连接的电路变换成等效三角形,也可以把三角形连接的电路变换为等效星形。即电路等效化简后,对电路未进行变换的部
    的头像 发表于 05-15 17:37 3.2w次阅读
    星形/<b class='flag-5'>三角形</b>的变换法介绍

    Shell脚本之打印一个正三角形

    需求:打印一个正三角形,要求用户输入一个数字n,然后打印边长为n个*字符的正三角形
    的头像 发表于 10-24 09:13 1969次阅读

    三角形接法的作用

    三角形接法的作用 三角形接法是将各相电源或负载依次首尾相连,并将每个相连的点引出,作为相电的个相线。因接线形状似三角形,所以这种接法叫做
    发表于 04-03 14:23 3004次阅读

    三角形绕组的两种连线方式介绍

    三角形绕组中,有两种常见的连线方式,分别是星型连接和三角形连接。
    的头像 发表于 11-21 16:59 1912次阅读
    <b class='flag-5'>三角形</b>绕组的两种连线方式介绍

    变压器“三角形接线”和“星形接线”接法详解

    变压器“三角形接线”和“星形接线”接法详解  变压器的三角形接线和星形接线是常见的两种接法,它们在不同的应用场景中具有不同的优势和特点。 一、三角形接线 三角形接线也被称为Delta接
    的头像 发表于 02-18 18:17 1.4w次阅读

    三角形连接和星形连接的基本概念和特点

    和星形连接的基本概念 三角形连接 三角形连接,又称为Δ连接,是指将电机的个绕组首尾相接,形成一个闭合的三角形。在三角形连接中,每个绕组承受
    的头像 发表于 07-17 10:35 2562次阅读