首页 > 编程知识 正文

人脸识别三维和二维区别(三维面部识别)

时间:2023-05-05 04:24:20 阅读:96974 作者:2657

雷锋人工智能技术评论出版社:本文由图普科技利用VGG 16 Like网络从中三维人体识别整理而成。

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

因此,我今天要解决的问题是如何输入3D网格对象(图元三角形和顶点)并得到分类概率的输出。

我找到了以下解决方案:

缩放对象并将其划分为体素。给神经网络体素。

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

从多个侧面投射对象,试图用单独的分类器识别它们,然后将它们放入元分类器。

在这里,我想详细讲一个比较简单有效的方法,那就是DeepPano方法。

数据准备

如今,图像数据集包含大量样本。但3D模型数据集的情况并非如此。三维模型数据集中没有成千上万的图像,因此三维模型识别还没有得到深入的研究,三维模型数据集不平衡。大多数数据集包含方向不对齐的对象。

ModelNet10是一个相对清晰的3D对象数据集。3D对象作为存储在数据集中。包含点、线和平面的脱机文件。那个。off文件格式不支持显示布料、纹理和其他材质。

以下是对象类型和样本数量:

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

首先要做的是选择分类器类型。因为图像、语音等重要数据的技术解决方案都是基于神经网络(或者是卡格尔比赛中经常用到的外来成分),训练神经网络是符合逻辑的。神经网络对数据集的平衡非常敏感。所以第二步是让数据集更加平衡。

我决定使用3dWarehouse中的模型来获取更多的数据,并创建一个扩展的数据集。这些模型存储在。skp文件格式,所以必须转换。我创造了。skp。使用SketchUp C Api关闭转换器。

下一步是数据清理。相同的图像已被删除。它可以按如下方式分配:

这将使数据集看起来更加平衡。除了马桶,几乎每个物体类别都包含近1000个样本。其他对象类型之间的不平衡可以通过分类权重来纠正。

数据预处理

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

说明问题。

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

从最初的10个对象类别中选择了7个类别。

通过创建。skp。关闭转换器以转换3d仓库中的模型。数据集变得更加平衡。

现在,让我们仔细看看数据预处理。

在预处理过程中,数据预处理的最终结果是用一幅新的图像来表示三维网格对象。我们将使用圆柱投影来创建图像。

三维网格对象

此对象的转换结果

首先,我们需要读入三维网格对象并存储它们。这可以通过强大的曲美文库来实现。它不仅提供读/写功能,还具有许多其他有用的功能,如网格变换、光线跟踪等。

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

注意:如果对象的主轴不垂直,则需要在识别对象之前应用方向对齐算法。这是一个完全不同的领域,所以我们在这里不讨论这个话题。

和立方纺锤体。

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

现在把圆柱体的边切成MN个网格。

现在将每个网格节点垂直投影到主轴上,得到一组投影点。投影点集用p表示,投影线集用s表示

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

现在,将S集合中的每个线段与网格体(即立方体)相交。你会从每一条光线得到一个交点。将此点分配给相应的网格节点。

其实这是一个特例。一般来说,S中的一条投影线可以有多个交点,也可以根本没有交点。以下是一个例子。

origin/9fc3000ee01ca2aa2fb2?from=pc">

因此,通常这个过程的结果是在每个单元中都有一个 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)可使数据集更均衡。

添加更多的物体类别。

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

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

注:本文由「图普科技」编译,您可以关注微信公众号tuputech,体验基于深度学习的「图像识别」应用。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。