使用高级 CoreML

17 Mar 2025 | 5 分钟阅读

正如我们已经讨论过的,我们可以使用 CoreML 通过将其添加到我们的 XCode 项目中来使用现成的 MLModel 执行图像识别。在本教程中,我们将更进一步,看看如何将预先训练好的 Caffe 模型转换为 MLModel 格式。

我们在本教程中使用的 Caffe 模型已经针对成千上万的图像进行了训练。我们可以将我们的数据集与预先训练好的 Caffe 模型一起使用,并将其转换为 MLModel,以便将其与 XCodeSwift 类一起使用。Apple 已经在 python 中发布了开源工具,允许我们将使用 Caffe、Keras、Turi 等训练的任何预先训练好的模型转换为 MLModel 格式。在本教程中,我们将构建一个花卉识别应用程序,该应用程序将识别使用该应用程序捕获的花卉种类。即使在没有互联网连接的情况下,它也可以工作。对于这个项目,我们将使用一个已经在 Oxford 102 花卉数据集上训练过的模型。让我们开始 Python 配置,将 Caffe 模型转换为 MLModel。

使用 Python PIP 安装 CoreML 工具

首先,我们需要安装 Python PIP,它是一个包管理系统,用于安装和管理用 Python 编写的包。换句话说,我们可以说它就像 Python 包的 CocoaPods。

我们需要在我们的 mac 上安装 python 2 或 python 3 才能安装 PIP。要检查我们的 mac 上安装了哪个 python 版本,请在终端上使用以下命令。

$ python -v

但是,我们也可以同时在我们的 mac 上安装 python 2 和 python 3。但是,在使用终端上的 python 3 时,我们需要提及版本 3。使用以下命令来使用 python 3。

$ python3

要在 mac 上安装 PIP,首先,安全地下载 get-pip.py,然后在终端上运行以下命令。

$ python get-pip.py

这将成功地在 mac 上安装最新版本的 PIP。

现在,我们需要在终端上使用 pip 安装 coremltools。为此,请使用以下命令。

$ pip3 install -U coremltools

这将在我们的 mac 上下载并安装 coremltools。

将 Caffe 模型转换为 MLModel

我们将在本教程中使用此模型(花卉分类)。下载并解压缩使用给定链接下载的模型后,我们将找到三个文件,如下所示。

单击此处下载项目

Using Advanced CoreML

要将此模型转换为 MLModel,我们需要创建一个 python 脚本。为此,我们将使用 sublime-text 作为编辑器来创建脚本。

打开 Sublime Text,将 Flower Classifier 文件夹拖到其中,以便在编辑器中打开它。现在,在 sublime-text 中创建一个名为 convert-script.py 的文件,其中包含以下 python 代码。

保存此代码后,打开终端并导航到上述代码所在的目录。我们还需要确保所有 Caffe 模型文件都存在于同一目录中。要运行上述 python 脚本,请运行以下命令。

这将在终端上产生以下输出。

Using Advanced CoreML

如果查看该目录,我们将在查找器中看到一个新创建的 FlowerClassfier.mlmodel 文件,如下所示。

Using Advanced CoreML

在 XCode 项目中使用 MLModel

由于我们已将 Caffe 模型转换为我们的 MLModel,现在我们将开始使用新创建的 FlowerClassifier.mlmodel 创建我们的 iOS 应用程序。为此,让我们在 XCode 中创建一个名为 FlowerApp 的新项目。

Using Advanced CoreML

首先,我们需要将我们的 FlowerClassfier.mlmodel 文件导入到 XCode 项目中,如下所示。

Using Advanced CoreML

现在,在 main.storyboard 中,将 ViewController 嵌入到 NavigationController 中,并在 ViewController 的导航栏中添加一个栏按钮项以点击它来打开 iOS 设备相机。我们还将向 ViewController 添加一个 imageview 以向用户显示捕获的图像。

main.storyboard 将包含以下设计。

Using Advanced CoreML

我们还将在 ViewController.swift 中创建一个操作出口来触发用户事件。

我们还将使用 UIImagePickerController 在我们的 iOS 应用程序中使用相机功能。ViewController 包含以下代码,一旦我们在项目中实现 UIImagePickerController。

一旦我们点击相机栏按钮项,这将打开设备的相机。现在,我们的任务是使用我们的 mlmodel 检测捕获的图像。为此,我们将捕获的图像转换为 CIImage。在我们在委托方法中关闭图像选择器控制器后,添加以下代码进行转换。

现在,我们需要编写代码来检测图像。为此,我们将在 ViewController 中添加 detect() 方法。这将使用 mlmodel 对象创建一个 VNCoreMLRequest 并从该对象中获取结果。detect() 方法将包含以下代码。

我们需要在创建 CIImage 之后,立即在委托方法内调用 detect() 方法。但是,我们的 ViewController.swift 将包含以下代码。