如何在iOS应用中集成图像识别

这些天实际上是“几乎不可能的”。 至少这个xkcd-strip的主题是。 在这个简短的教程中,我将介绍如何使用Microsoft Custom Vision构建CoreML模型以能够识别照片中的对象以及如何在iOS应用程序中使用它。 您需要对iOS开发和Swift都有基本的了解,然后才能继续学习本文。

首先,我们需要创建CoreML模型。 让我们开始看看如何使用Microsoft Custom Vision。

首先登录customvision.ai并创建一个新项目。 输入名称,描述,并将项目类型设置为分类 。 将分类类型设置为多标签 ,将域设置为常规(紧凑)。 选择紧凑型的原因是因为我们要将模型嵌入到我们的应用程序中。 您以后可以随时更改这些设置。

下一步是上传我们希望能够识别的对象图像,并用对象名称标记它们。 使用multilabel,我们可以在图像上使用多个标签。 当我们有大量的图像时,我们可以开始训练模型。 我们还可以通过使用快速测试按钮来测试模型是否运行良好,您可以在其中上传图像以测试图像是否与您训练的模型匹配。

获取CoreML模型

训练完模型后,我们需要下载模型并将其导入我们的Xcode项目。 要下载模型,请转到性能选项卡以CoreML格式导出。 然后,您可以将文件添加到XCode项目文件夹中,在该文件夹中将自动生成一个类以供以后使用。

设置摄像头设备并查看

我们将从创建UIViewController开始。 该视图是我们要显示iPhone相机反馈的地方。 为了输出实时视频,我们必须添加AVCaptureVideoDataOutputSampleBufferDelegate协议。

加载视图时,我们创建一个AVCaptureSession并定义一个用于向会话输入数据的设备。 在这种情况下,我们选择视频的默认设备。 我们还创建了一个AVCaptureVideoDataOutput,我们的captureSession将从该AVCaptureVideoDataOutput输出将在captureOutput方法中可用的视频帧。 我们要做的最后一件事是创建一个AVCaptureVideoPreviewLayer,以便我们可以在应用程序中预览摄像机的输出。 然后,将预览层作为填充整个框架的子层添加到我们的主视图中。

捕获视频输出

要处理输出并进行图像分类,我们必须实现由协议AVCaptureVideoDataOutputSampleBufferDelegate定义的captureOutput方法。 为了能够分析输出中的图片,我们从CMSampleBuffer中获取了CVPixelBuffer。

然后,我们需要为每个帧指定要执行的图像分析请求。 首先,我们必须使用从Custom Vision下载的经过训练的CoreML类来创建VNCoreMLModel。 您的名字将不同于_92ed7d5fe39f4438b1ef3e98e3ce80c3_1!

对于每个结果,我们检查结果是否具有足够高的置信度以及是否具有标识符。 在此示例中,我仅检查一个特定的标识符。 标识符是我们在CustomVision中添加到图像的标签。 如果我们有足够高的信心,则可以确定标识符是正确的标识符,然后停止捕获并将结果分派到主线程。 在这种情况下,我只创建了一个带有消息的简单信息窗口。

这是在iOS应用中实现摄像头,预览和图像识别所需的全部代码,并且您的应用现在可以在识别摄像头前的对象时做出反应。