大家好,欢迎收看。我叫玛丽莲,是JMP公司的系统工程师。今天我想和大家聊聊如何利用JMP Pro加速矿物识别,以及如何利用人工智能为采矿业提供洞察分析。在正式开始之前,我先简单介绍一下本次演讲的背景和目的。
在采矿领域,矿物鉴定和分类面临诸多挑战。现场矿物鉴定不仅难度大,需要专业知识,而且容易出错。传统方法严重依赖于人工提取待鉴定矿物的特征,例如使用显微镜观察,这既费时费力,又容易出错。
此外,随着采矿作业向偏远地区或低品位矿床转移,对现场实时矿物分类的需求日益增长。我在此海报中提出的解决方案是利用 JMP Pro 的 Torch 插件构建一个能够实时识别或分类矿物的模型。
今天的例子需要说明的是,运行 Torch 插件需要 JMP Pro,该插件会将图像作为 X 或输入,创建一个分类模型来预测未来的矿物种类。在这个例子中,我使用了一个包含 953 张图像的数据集,这些图像代表了七种不同的矿物,并用它来训练一个模型,用于矿物分类预测。这个数据集是 Kaggle 数据集的一个版本。
在实际操作中,采矿工程师可能会先将矿石破碎成他们通常作业中使用的粒度,然后拍摄破碎矿石的图像。与此同时,他们还需要考虑相机在光照条件下的摆放位置,以便使用于训练模型的图像尽可能接近未来实时分类所需的图像。
今天我想带大家一步步了解具体步骤。您将看到,只需使用一些已识别矿物的图像,即可轻松快速地构建预测模型,该模型可用于在采矿作业中实时对矿物进行分类。第一步是安装 Torch 插件,该插件可在 JMP Marketplace 中找到,适用于 JMP Pro。让我来演示一下它的界面。
JMP 应用市场提供了许多可供下载的扩展程序,用于增强 JMP 的功能。这里介绍的这款插件名为“Torch Deep Learning for JMP Pro”。要下载此插件,只需点击下载按钮即可。下载完成后,将下载的文件拖放到已打开的 JMP 窗口中即可完成安装。
本页面还包含系统要求、支持的 JMP 版本、插件使用帮助和文档等信息。插件安装完成后,顶部会出现一个名为“JMP 插件”的新菜单。您可以在这里看到我的 Torch 深度学习插件。我的 JMP 日志中有一张图片,展示了该插件的各项选项。
这里有一个创建 K 折交叉验证列的选项。我们今天就来了解一下。我们将拟合 Torch 模型。这个插件还附带几个示例数据集。它还提供了一些图像处理工具,可以帮助我们操作和修改图像。我们今天也会介绍其中的一些功能。下载此插件后,它会自带一些模型,用户还可以下载其他模型。此外,帮助和文档也位于此菜单中。
这是第一步。我已经安装了插件。下一步是将图像导入 JMP 并清理数据。首先,我们要将矿物图像导入 JMP 以训练模型。为此,我们将使用 JMP 的“导入多个文件”功能。在此之前,我想先向您展示一下这些矿物图像在这个文件夹中的排列方式。为此,我将导入这个文件。您可以看到,这个文件夹名为“矿物图像”,其中包含许多子文件夹。每个子文件夹都根据其中包含的矿物图像命名。
例如,如果我进入生物类型文件夹,你会看到这里有很多这种特定矿物的图片。这就是这个数据集的组织方式,或者说这些图片在我电脑上的组织方式。
现在我们要使用 JMP 的文件导入功能,将这些图像导入 JMP 以便训练我们的模型。接下来我会演示具体步骤,并在日志中展示,然后再逐一讲解。首先,我们要使用文件导入功能。这里已经指定了包含图像的文件夹位置。接下来,我要添加子文件夹。可以看到,这个文件夹里还有子文件夹。我们需要添加这些子文件夹。
现在我可以看到,这里有很多图片。可以看到,这里有很多JPEG格式的图片,还有其他不同的文件格式。我也有一些PNG格式的图片。这完全没问题。除此之外,我希望JMP在生成的数据表中添加一列,用来存储文件名。文件名将指向包含矿物名称的文件夹。我希望数据表中有一列包含矿物名称,另一列包含对应的图片。我希望JMP将所有这些文件和图片都整合到一个JMP数据表中。
现在点击导入,JMP 会打开那个文件夹,把所有图片都导入进来,还会添加一个新列,用来记录矿物的名称。好了,这就是生成的数据表。导入这 953 张矿物图片真是太容易了。接下来我们看看这里。右边这两列我不需要,所以我把它们删掉,这样我们就能更仔细地查看数据了。
这里每一行都包含一张矿物图片。第二列是矿物名称,后面依次是每张图片的标题和JPEG文件。我需要对数据进行一些清理工作,这是我们的下一步。
现在我们已经导入了多个文件。下一步是清理数据。清理数据的第一步是清理标签列。我们将使用“重新编码”和高级选项来提取数据段。我只需要包含矿物名称的数据段。要在我的数据表中执行此操作,我可以右键单击,然后选择“重新编码”。
我想将这些结果存储在同一列或现有列中,我将使用热点或红色三角形菜单来访问高级选项。我想提取一段文本。这里我可以使用这个控件。我想要实现的是,这是我在数据表中看到的内容,这里我可以看到结果。
我觉得这看起来不错。结果显示我只会得到矿物的名称,我可以把每个单独的文件名去掉。我确认一下,然后重新编码。好了,我们现在得到了矿物的名称。如果我们展开标题图表,可以看到这些矿物名称和我之前给你看的文件夹里的矿物名称一样。
好的,这是我们的第二步。接下来我们来看看下一步,因为我们还需要做一些数据清理工作。我们要查看一下这个插件中的图像处理工具。在这个特定的数据集中,我收集的矿物图像中,它们的指尖和手掌里有一些额外的物体,这可能会导致模型拟合出现一些问题。
我要修改这些图片。我们只需裁剪它们,保留图片中心 50% 的部分,并剪掉图片边缘以外的内容。为此,您可以看到这里的图像实用工具菜单。这是 Torch 插件的一部分。我在这里打开 Torch 深度学习。这就是我的图像实用工具。
好的,我们可以获取图像尺寸,并将其存储在单独的列中。我们可以根据需要调整图像大小,放大或缩小它们。就像我刚才说的,我要裁剪它们。这里只是简单地展示了一下裁剪后的效果。让我们回到数据表,使用 Torch 深度学习图像工具插件来处理这些图像,我想裁剪一下图像。
这个数据表中只有一列包含图片,我可以在这里更改设置,但这正是我想要的。这些设置参考了这个示例。有了这些设置,JMP 已经告诉我们将获取中间 50% 的图片,这正是我们想要的。我点击运行。JMP 将开始处理这些图片。
为了便于比较,我将分别展示一下这些文件的修改前后对比。现在我们看到的画面有点小问题,所以我先把这个文件保存到我的下载文件夹里。我再重新打开它,一会儿你们就会明白原因了。
好了。我可以打开它查看最近使用的项目。好了。这里我想让你们看看。请看第4行。在第4行,就在这里,你们可以看到这张图片里有一些手指,比如。在右侧,我们清理并裁剪了图片之后,你们可以看到它被放大了,我们剪掉了图片中那些我们不想包含在用于构建模型的图片中的多余部分。
我们将使用新裁剪的列图像作为模型的 X 轴,Y 轴则使用矿物名称,也就是正确的矿物名称。接下来我们来看下一步。我们已经修改了图像,导入并清理了数据,下一步是创建一些 K 折交叉验证列。
为此,我们还要用到 Torch 插件。让我来演示一下。在我的数据表中,选择插件,然后选择 Torch 深度学习,我们要创建一些 K 折交叉验证列。在这个例子中,我们将查看响应列 Y,它代表正确的矿物种类,我们还将使用该列进行分层。我们在这里创建了三列来对这些数据进行分组。
在这三列中,每列都会有五个分组。我们将使用这些 K 折交叉验证列来构建模型。我们的想法是,每次只使用一部分数据来构建模型,用另一部分数据来测试预测结果,然后更新和改进模型。这就是我们的想法,每次只使用一部分数据。通过这个菜单,我们可以创建这些分层列来实现这一点。
我这就点击“开始”。JMP 正在使用一些高级的实验设计 (DOE) 技术,创建这些分组列,用于验证和改进模型。好了。这里我们可以看到新增了三列,分别是 A 列、B 列和 C 列。要使用所有这些列和分组进行验证,实际上需要相当长的时间,在我的笔记本电脑上运行可能需要几个小时。不过,如果我们正在拟合最终模型,我们可能也需要使用所有这些列,并让 JMP 运行很长时间来拟合模型。
今天,我不会让大家等太久。为了演示方便,我们将使用单行留出验证法,这样可以加快速度。为此,我将使用列实用程序并创建指示列。今天,我们将使用标记为“1”的列进行验证。例如,我们可以使用这部分数据(763 行)来拟合模型,然后使用剩余的 190 行来测试预测结果并更新模型。在这个示例中,我们将使用简单的验证方法。
但这就是我们通过这个插件创建 K 折交叉验证列的方法。接下来,我们要拟合这个模型并进行迭代。我的意思是,我们要先拟合模型,然后稍作调整。这些 Torch 模型有很多控制选项。我们可以更改一些小细节,看看能否提高预测效果。首先,我们要指定模型。我们要告诉 JMP 我们想要预测什么。
我们回到数据表,开始操作。选择插件、Torch 深度学习、Torch 深度学习。这里,我要告诉 JMP,我要预测的 Y 值(响应变量)是矿物种类,并且我想基于我们之前截取的图像的 50% 区域进行预测。在这个例子中,我们只使用一些简单的验证,然后就确认无误。
这里还有更多选项可以设置。我会简单介绍一下,关于这些选项还有很多其他文档。在这里,我们可以控制模型的拟合方式。例如,在这个图像模型下拉菜单中,这些模型已经用成千上万张图像进行了预训练。我们将使用一个预训练模型,然后添加我们自己的图像来根据我们的需求定制模型。我将选择 Google Net。我之前用这个图像模型处理这个特定数据集时效果不错。当然,如果您不确定,也可以直接使用 JMP 中的默认设置。
我还要调整一下训练轮数(epochs)。这实际上就是模型遍历数据的次数。我稍微减少一下这个数字,加快训练速度。当然,我们还可以控制学习率,也就是模型调整前一个模型误差的速度。然后,右边还有一些高级选项。我回到我的日志里,简单讲解一下。
我们有很多高级模型控制选项,这些选项大致可以分为三类。首先是模型规范。我们要拟合的模型应该是什么?我们有一些训练控制选项。我们应该如何拟合这个模型?应该如何训练它?其次,我们还有一些图像建模选项,用于处理图像。
让我来演示一下,我们接下来会用这个模型来帮你拟合一下。如果我把选项展开到右侧,你可以看到左边这里。看起来可能有点复杂,不过我们有很实用的悬停提示。如果你把鼠标悬停在那里,点击“跳转”按钮,就能看到每个选项的简要说明。深度神经网络的层数本质上类似于神经网络的节点数。为了方便举例,我这里就用八层。
接下来我们来看看这个存储桶,这是训练存储桶。这里我要修改一下批处理大小。批处理大小决定了我们一次处理多少行数据。因为我的电脑速度比较慢,所以我一次只处理 64 行数据。最后,我们来看看右侧的图像选项。这里的图像大小可以控制图像的大小。我把它设置为 228。在这个数据集上,这个设置看起来效果不错。
这就是我目前要做的全部更改。使用 Torch 深度学习拟合模型的思路是,你先在这里拟合一个模型,然后迭代。你可能会做一些小的调整和修改,以尝试提高模型的预测能力或性能。我现在就点击“确定”按钮。JMP 将会处理这些数据,我们来看看会得到什么样的模型。
JMP执行此操作时,我们会在这个小窗口中看到一些更新,显示目前为止模型在训练数据和验证数据上的性能表现。我们将重点关注验证数据,因为它能让我们更好地了解模型在处理新图像时的预测效果。
这里我查看了训练集和验证集的准确率,目前看来相当不错。训练集的准确率超过 90%,验证集的准确率在 70% 到 80% 之间。这个模型训练得非常迅速。如果我们采用不同的训练方法,例如增加训练轮数,或许就能得到一个更好的模型,而无需对现有模型进行太多改动。
但我们先来看看这里,因为这是我们的下一步,即模型比较。现在我们只构建了一个模型。我们先来看看一个模型是什么样子。随着我们构建更多模型,JMP 会在模型比较中添加更多信息,以便我们比较不同的模型。对于初始模型(模型 1),响应变量是矿物。这是我们输入到窗口中以拟合模型的信息。
我们有关于R平方的信息,但我不会去看它,因为我们不是在预测一个数值,而是在对图像进行分类。我们更关注准确率指标,尤其是验证准确率。目前看来效果相当不错。我们这个训练速度很快的模型,准确率已经接近90%。
这里,我们可以看到模型在训练过程中的演变过程的图形化表示。可以看到这里有两条线,一条代表训练数据,另一条代表验证数据。总的来说,我们可以看到,随着训练轮数的增加,模型的损失或误差在逐渐减小。当我们对数据进行更多遍历,从图像中提取更多信息时,误差就会降低,预测结果也会得到改进。
鉴于这些曲线仍在下降,我们可能需要增加迭代次数,让模型对数据进行更多次迭代,这或许有助于改进模型。以下是一些我们可以用来评估模型性能的指标。这里有一些实际值与预测值的对比图,左侧显示的是实际矿物含量,下方显示的是预测概率。基本上,这些图的右侧数据点预测效果较好,而左侧数据点的预测效果则不太理想。
这里的一切都是交互式的,而且是动态的。例如,如果我们回到数据表,并将图像列设置为标签,当鼠标悬停在这些点上时,我们可以看到哪张图像看起来像是石英,但由于这张图像在图表中非常靠左,所以它很可能被错误分类了。它确实是石英。我们也可以突出显示所有分类错误的图像。看起来这里大约有 40 行。
我们可以回头看看这些图像,看看图像是否存在任何潜在问题,或者我们需要收集更多特定矿物的图像,以尝试改进这些预测。
下面,我们再补充一些信息,看一下验证数据的混淆矩阵。我们希望在这两条对角线上(无论是计数还是比率),数值都很大,并且最好上方或下方都是零。
对于黑云母,左侧列出的是实际矿物名称,右侧列出的是预测的矿物名称。黑云母的预测准确率约为75%,硼石的预测准确率约为92%。我们可以看到每种不同模型的表现。这里,白云母的预测准确率是77.8%。看来,白云母是我们用这个模型预测或分类效果最差的矿物。
同样,就我而言,我们只有一个示例进行比较。我想在本期刊中向您展示,如果您要比较多个模型,情况会是怎样的。随着您拟合更多模型,调整各种选项,JMP 会不断将这些新模型添加到模型比较中。这样,您就可以比较多个模型的验证准确率,还可以可视化这些模型的性能并进行比较。
再次强调,在正式部署之前,尽量改进模型,找到最佳方案。我们之前简单讨论过模型比较和结果评估,现在让我们更深入地探讨一下结果评估。
这里有一些非常棒的交互式图表,您可以在输出结果中看到。我想指出的是,对于您创建的每个模型,这里还有一些额外的选项,您可以将一些内容保存回数据表。例如,我可以在这里保存嵌入。我点击这里,返回数据表给您演示一下。
您可以看到这里有 8 列嵌入数据。这些嵌入数据是什么呢?如果您还记得,在模型设置中,我将神经网络的节点数设置为了 8。这就是嵌入数据的作用。这些节点是从矿物图像中提取的特征。如果我想将这些嵌入数据用作 X 值或输入,以便在 JMP 中使用其他建模平台构建预测模型,我完全可以这样做。我可以使用 Torch 提取信息,然后用它来进行预测,或者根据需要使用其他平台构建模型。
对我来说,还有一个很棒的选择,因为我喜欢用这种方式可视化模型的预测效果,你可以将预测结果保存到数据表中。让我回到数据表,给你看看它的样子。这是我们存储在数据表中的最有可能的预测矿物。使用图表生成器,可以很轻松地将实际矿物绘制在 Y 轴上。我还会将其用作颜色变量。我将把预测的矿物放在 X 轴上。
这代表什么呢?嗯,大方框代表被正确分类的矿物,而方框外的所有点都代表被错误分类的矿物。这是石英,它被错误地分类为硼石。这是白云母,它被错误地分类为生物型。这样可以很容易地看出哪些图像被错误分类,以及有多少图像被错误分类。
还有一点值得一提。从这个红色三角形出发,我们还可以生成用于实时预测的 Python 代码。如果这就是我们的最终模型,我们对这些预测结果很满意,并且想要将其实时应用,那么我们可以把 Python 代码保存在这里。不过我暂时不会这么做,但我会回到我的日志里,讨论一下导出 Python 代码后我们可以做些什么。
我们希望利用这个模型进行预测。在矿场,我们可以这样做:一旦我们训练好模型并导出相应的Python代码,就可以将其集成到现场系统中。具体来说,我们需要一台摄像头来拍摄从矿井中出来的矿物或矿石。我们还需要某种边缘设备,将我们的Python代码添加到该设备上,以便该代码能够接收摄像头拍摄的矿物图像,并快速将其分类为某种矿物。这就是我们的想法。我们可以进行实时预测。
我们能用这些信息做什么呢?我们可以利用这些信息来指导决策,例如调整选矿参数。我们可以根据这些预测结果自动将矿石与废料分拣出来。或者,我们可能希望实时估算从矿石中提取每种矿物的量。如果这些信息是实时获取的,那就非常有用。
最后总结一下,以下是几个要点。希望通过今天的演示,您已经了解到 Torch 深度学习和 JMP Pro 为矿物分类提供了一个优秀的无代码解决方案。利用已标注的图像可以快速训练模型,而 JMP 拥有所有必要的工具,可以帮助我们导入图像、清理数据并在创建模型之前进行数据预处理。即使使用非常简单的硬件,也能实现实时分类,这种方法有助于在采矿作业中做出更快、更准确的决策。非常感谢您的观看。