我们可以访问 https://developer.apple.com/machine-learning/ 获取有关如何使用机器学习将其与 iOS 应用程序结合使用的概述。它还在模型部分提供了现成的(预先训练的)模型,例如:https://developer.apple.com/machine-learning/models/。
在本教程中,我们将使用 MobileNetV2 模型,该模型经过训练以对相机帧或图像中的主要对象进行分类。我们将使用它来识别用户在应用程序中拍摄的照片。
但是,CoreML 无法使用应用程序生成的任何数据来进一步训练模型。应用程序中加载的预先训练的模型保持为静态模型。我们还需要了解应用程序中使用的 CoreML 未加密;也就是说,如果我们需要在类似股票市场的银行业务应用程序中使用任何模型,我们需要注意不应将其与 CoreML 结合使用以将其与 iOS 应用程序集成。
CoreML 最好的部分是,即使我们对机器学习了解不多,我们仍然可以使用它来将我们的应用程序与机器学习相结合。
让我们创建一个 iOS 应用程序,该应用程序将使用 CoreML 来集成机器学习。正如我们已在本教程中说明的那样,我们将使用 https://developer.apple.com/machine-learning/models/ 上提供的 MobileNetV2 预先训练模型。这将检测相机帧中的主要对象。
要创建新的 XCode 项目,请转到文件 -> 新建 -> 项目在 XCode 中,然后选择单视图应用程序。现在,提供应用程序信息,如包 ID、应用程序名称、组织名称,如下所示。
完成创建 iOS 应用程序后,我们需要做的第一件事是将预先训练的图像识别模型合并到我们的新 XCode 项目中。为此,请导航到 https://developer.apple.com/machine-learning/models/ 并选择 MobileNetV2 下载 .mlmodel 文件。单击下载按钮下载 mlmodel 文件,如下所示。
完成下载 .mlmodel 文件后,我们需要将其添加到 XCode。为此,请打开下载 .mlmodel 文件的文件夹,并将其拖到 XCode 中进行放置。
这样做之后,我们将获得添加到 XCode 的 .mlmodel 文件,如下所示。
打开此文件后,我们将在 XCode 中看到其信息以及 XCode 创建的模型类。
让我们首先设置界面构建器。在故事板中,我们需要将我们的 View Controller 嵌入到导航控制器中,并添加一个栏按钮项目,以便在点击时打开相机。我们还将向 ViewController 添加一个图像视图,以显示从相机拍摄的图像。
现在,我们需要将我们的模型合并到我们的 View Controller 中。为此,我们需要在我们的 ViewController 类中导入 CoreML 和 Vision。我们还将使我们的 ViewController 符合 UIImagePickerControllerDelegate 和 UINavigationControllerDelegate。
添加以下代码以实现应用程序的相机功能,当用户点击相机栏按钮项目时,将打开相机。
现在,我们需要将捕获的图像发送到机器学习模型。为此,首先,我们需要访问 View Controller 中捕获的图像。添加委托方法,即 imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) 到 ViewController 。
现在,我们需要实现检测函数来检测我们捕获的图像。首先,我们需要将我们的图像转换为 CIImage 以便与我们的 MLModel 一起使用。
要将图像转换为 CIImage,请在调用 dismiss() 之后添加以下代码。
我们需要通过使用模型来检测此 ciImage。为此,将以下代码添加到 ViewController 中。
我们还需要在获得 CIImage 之后立即调用 detect() 方法。我们还需要将 CIImage 传递给此 detect () 方法。添加以下代码以在其中获取 CIImage 对象的委托方法中调用 detect()。
现在,构建并运行项目,捕获任何图像,并查看我们获得的结果。让我们通过在网络上浏览来单击计算机的图像。
一旦我们拍照并继续操作,我们将看到结果打印在控制台上,如下所示。
正如我们所看到的,该模型对图像进行了分类,并生成了包含图像可能包含的所有对象的结果。
现在,我们可以检查结果的第一个对象,因为它将是图像可能包含的最可能的对象。在此项目中,我们捕获了一个汽车对象,并查看结果是否包含汽车作为第一个对象。
为此,在获得结果对象后立即在完成处理程序中添加以下代码。
这将根据捕获的对象更改导航栏标题。
我们的 ViewController.swift 包含以下代码。
我们请求您订阅我们的新闻通讯以获取最新更新。