使用Wolfram语言在你的iOS设备上部署神经网络——识别毒蘑菇

2021-07-08 10:34:44 浏览数 (1)

如今的手持设备足够强大,可以在本地运行神经网络,而不需要云服务器的连接,这在您外出时是一个很大的便利。不过,在您的手机或平板电脑上部署和运行一个自定义的神经网络并不简单,而且这个过程取决于机器的操作系统。在这篇文章中,我将专注于iOS设备,并指导您完成所有必要的步骤,使用Wolfram语言训练一个自定义的图像分类器神经网络模型,通过ONNX(12.2版中的新功能)导出,将其转换为Core ML(苹果的机器学习框架,用于iOS应用程序),最后将其部署到您的iPhone或iPad。

在我们开始之前,有一个重要的警告:在没有咨询专家的情况下,切勿将此分类器用于烹饪。有毒的蘑菇可能是致命的!

创建训练和测试数据

在北半球,蘑菇季节一般在夏季,但如果有一个蘑菇图像分类器在您的手机上本地运行,以便在徒步旅行时识别蘑菇,那就太好了。为了建立这样一个图像分类器,我们将需要一个良好的训练集,其中包括每个蘑菇物种的几十张图像。

作为一个例子,我将从获得一个蘑菇的物种实体开始,即毒蝇伞(Amanita muscaria),它甚至有自己的绘文字:

我们还可以获得一个缩略图,以更好地了解我们正在谈论的内容:

值得庆幸的是,由公民科学家组成的iNaturalist社区已经记录了数以百计的各种蘑菇物种的实地观察。使用 Wolfram 函数库中的 INaturalistSearch 函数,我们可以找到每个物种的图像。INaturalistSearch函数通过iNaturalist的API检索观察数据。我们首先需要使用 ResourceFunction 获取 INaturalistSearch 函数:

接下来,我们将指定物种。然后,我们将要求使用 "HasImage" 选项获得附有照片的观察结果,并使用 "QualityGrade "选项和 "Research "属性获得已经被他人验证的观察结果:

例如,第一个观察点的数据如下:

我们可以使用 "ImageURL "属性轻松导入图片:

很好! 作为一个起点,我有兴趣获得在我的地区(加泰罗尼亚)可以找到的最常见的有毒和可食用的蘑菇品种的图片。

让我们创建几个自定义函数来获取 imageURLs;导入并重命名图片;最后,将它们导出到一个文件夹中供以后使用:

我们可以用另一个有毒物种——死亡帽(Amanita phalloides)来测试这个功能:

我们可以从本地文件夹中导入一些死亡帽图像,并检查它们看起来是否正常:

现在我们可以对其他的蘑菇种类做同样的工作:

为了创建训练集和测试集,我们需要指定classLabels:

接下来我们需要导入图片并创建实例,如下所示:

我们总共有850张图片/例子:17个蘑菇品种中的每一个都有50个。

让我们查看一下第一个例子:

看起来不错! 最后,我们只需要创建随机的训练和测试集。

这里我应该注意到,trainSet的一部分实际上将通过NetTrain选项ValidationSet作为验证集使用。

训练神经网络

从一个预训练的模型开始,我们可以利用 net surgery 函数来创建我们自己的自定义蘑菇图像分类网络。首先,我们需要从Wolfram Neural Net Repository获得一个预训练的模型。这里我们将使用Wolfram ImageIdentify Net V1:

我们可以检查网络的大小对于目前的智能手机来说是否合理地小。作为一项规则,它不应该超过100MB:

由于一兆字节有一百万个字节,我们的大小约为60兆字节,可以清除这个限制。

我们用NetTake来获取网络的卷积部分:

然后我们使用NetJoin添加一个新的分类层,并附加一个新的NetDecoder:

最后,我们对网络进行培训,使预修的权重保持固定状态:

我们可以通过测量准确率和绘制测试集的混淆矩阵图(使用NetMeasurements或ClassifierMeasurements)来检查产生的网络性能:

快速浏览一下分类最差的例子,我们可以看到视野和条件都不完善的蘑菇。例如,一个被树叶覆盖,另一个似乎处于分解的高级阶段。

我们可以用一张来自 iNaturalist 用户观察的照片来测试分类器:

保存我们训练好的模型是一个很好的做法,这样如果我们重新启动会话,我们就不需要重新训练网络了:

通过ONNX导出神经网络

作为一个中间步骤,我们需要将我们训练好的模型导出为ONNX文件。ONNX是一个开放的交换格式文件框架,是为了表示机器学习模型而建立的,并使人工智能开发者能够使用各种框架的模型。稍后,这将允许我们将我们的自定义模型转换为Core ML格式(.mlmodel)。

为了从我们训练的模型中获得ONNX模型,我们只需要使用Export:

将神经网络转换为Core ML

在本节中,我们将广泛使用苹果公司免费提供的一个名为coremltools的Python软件包,以便将外部神经网络模型转换为Core ML。Core ML是苹果公司的框架,用于将机器学习模型集成到iOS应用程序中。

为了配置您的系统来评估外部代码,我建议您遵循这个工作流程。

一旦 Python 被配置为 ExternalEvaluate,我们需要将它注册为一个外部评估器,并启动一个外部会话。

为了将ONNX模型转换为Core ML,我们需要使用终端安装两个额外的软件包:

1. coremltools软件包:

2. onnx软件包:

核心ML模型(.mlmodel)的工作方式与Wolfram语言模型类似。它们也包括一个模型的编码器和解码器。因此,在将ONNX模型转换为Core ML时,我们需要指定图像编码器(预处理参数)和解码器(类标签)。

如果我们点击原始Wolfram语言模型的输入端口,我们将看到以下面板:

在转换过程中,我们将需要指定输入类型为图像,并包括每个颜色通道的平均图像值作为偏置。此外,我们将需要指定一个图像重新缩放系数,因为原始模型的像素值范围是0到1,而Core ML的值范围是0到255。

coremltools允许我们使用一个文本文件来指定模型的类标签,该文件在新的一行中包含每个类标签。使用Export和StringRiffle导出这样一个文本文件是很直接的:

下面的代码由三部分组成:1)导入coremltools软件包并指定ONNX模型的路径;(2)转换模型的代码;(3)保存生成的Core ML模型的代码:

我们可以直接使用coremltools、NumPy和PIL软件包检查转换后的模型是否正常工作:

将结果与原始的Wolfram语言网模型相比较,我们可以看到顶部概率几乎相同,差异在10–2级:

将神经网络部署到IOS上

最后,我们只需要将我们的 Core ML 模型集成到一个iOS应用程序中,并将其安装在我们的iPhone上。为此,我需要注册为苹果开发者,下载并安装Xcode测试版。(注意,知道Swift编程语言不是必要的)。

首先,我们需要下载苹果公司提供的Xcode项目,用Vision和Core ML对图像进行分类,作为一个教程。当我用Xcode beta打开名为 "Vision ML Example.xcodeproj "的项目时,我看到以下窗口:

一旦我在Xcode项目中投放/上传了模型,我将看到以下的模型窗口。预览部分允许我们直接使用Xcode来测试该模型:

最后,我们需要在ImageClassificationViewController Swift文件中用Mobilenet Core ML分类器模型替换我们的MushroomsWolframNet模型,然后按下左上方的Build然后运行按钮:

在部署模型之前,我们需要签署该应用程序的开发团队:

我们成功了! 现在我们只需要到附近的森林去徒步旅行,希望能找到一些蘑菇。

下面是我最近一次远足的几个例子,都是正确识别的:

自己动手试试

使用 Wolfram 语言创建您自己的自定义神经网络模型,并通过 ONNX 将其导出。在移动设备上部署和运行您的模型,并在评论中发布您的应用,或在 Wolfram Community 上分享。我们也欢迎在下面的评论中提出关于其他功能的问题或建议。

其他资源

  • Wolfram U class: Exploring the Neural Net Framework from Building to Training(https://www.wolfram.com/wolfram-u/catalog/wl028/)
  • Wolfram Neural Net Repository (https://resources.wolframcloud.com/NeuralNetRepository)
  • Wolfram Function Repository(https://resources.wolframcloud.com/FunctionRepository/)
  • “Accessing Monarch Biodiversity Data with New Wolfram Language Functions” (https://blog.wolfram.com/2020/10/06/accessing-monarch-biodiversity-data-with-new-wolfram-language-functions/)

0 人点赞