通过对象检测器任务,您可以检测多个对象是否存在 对象的类别。例如,对象检测器可以定位 图片。以下说明介绍了如何在 iOS 中使用“对象检测器”任务。通过 GitHub 上提供了这些说明中介绍的代码示例。
您可以查看此网页 演示。对于 功能、模型和配置选项 请参阅 概览。
代码示例
MediaPipe Tasks 示例代码是对象的基本实现 iOS 版检测器应用。该示例使用 iOS 实体设备上的相机 不仅能持续检测物体,还能使用设备上的图片和视频 静态检测对象。
您可以以此为基础来创建自己的 iOS 应用,也可以作为参考 对现有应用进行了修改。对象检测器示例代码托管在 GitHub
下载代码
以下说明介绍了如何创建示例的本地副本 使用 git 命令行工具运行 git 代码库。
<ph type="x-smartling-placeholder">如需下载示例代码,请执行以下操作:
使用以下命令克隆 git 代码库:
git clone https://github.com/google-ai-edge/mediapipe-samples
(可选)配置您的 git 实例以使用稀疏检出,这样您 只有对象检测器示例应用的文件:
cd mediapipe git sparse-checkout init --cone git sparse-checkout set examples/object_detection/ios/
创建示例代码的本地版本后,您可以安装 MediaPipe 任务库,使用 Xcode 打开项目并运行应用。对于 请参阅 iOS 设置指南。
关键组件
以下文件包含对象检测器示例的关键代码 应用:
- ObjectDetectorService.swift: 初始化检测器,处理模型选择,并根据输入数据进行推理。
- CameraViewController.swift: 实现实时摄像头画面输入模式的界面并直观呈现 检测结果。
- MediaLibraryViewController.swift: 实现静态图片和视频文件输入模式的界面,并 直观呈现检测结果。
设置
本部分介绍了设置开发环境和 代码项目使用 Object Detector。有关如何设置 用于使用 MediaPipe 任务(包括平台版本)的开发环境 要求,请参阅 iOS 设置指南。
<ph type="x-smartling-placeholder">依赖项
Object Detector 使用 MediaPipeTasksVision
库,该库必须安装
使用 CocoaPods 构建容器。该库与 Swift 和 Objective-C 应用兼容
并且不需要任何额外的语言相关设置。
如需了解如何在 macOS 上安装 CocoaPods,请参阅 CocoaPods
安装指南。
如需了解如何创建包含必要 Pod 的 Podfile
,请参阅
请参阅使用
CocoaPods。
使用以下代码在 Podfile
中添加 MediaPipeTasksVision pod:
target 'MyObjectDetectorApp' do
use_frameworks!
pod 'MediaPipeTasksVision'
end
如果您的应用包含单元测试目标,请参阅应用的设置指南
iOS 设备,详细了解如何设置
您的Podfile
。
型号
MediaPipe 对象检测器任务需要一个经过训练的模型, 此任务。如需详细了解适用于 Kubernetes 的 对象检测器,请参阅任务概览模型 部分。
选择并下载模型,然后使用 Xcode 将其添加到您的项目目录。 有关如何向 Xcode 项目添加文件的说明,请参阅管理 Xcode 中的文件和文件夹 项目。
使用 BaseOptions.modelAssetPath
属性指定模型的路径
。如需查看代码示例,请参阅下一部分。
创建任务
您可以通过调用对象检测器任务之一来创建该任务。通过
ObjectDetector(options:)
初始化程序用于为配置选项设置值
包括运行模式、显示名称语言区域、结果数上限、置信度
阈值、类别许可名单和拒绝名单。
如果您不需要使用自定义配置初始化的对象检测器
可以使用 ObjectDetector(modelPath:)
初始化程序创建
使用默认选项的对象检测器。如需详细了解配置
选项,请参阅配置概览。
对象检测器任务支持 3 种输入数据类型:静态图片、视频文件
和直播视频流默认情况下,ObjectDetector(modelPath:)
会初始化
执行任务。如果您希望将任务初始化以处理视频
文件或直播视频串流,请使用 ObjectDetector(options:)
来指定视频
或实时流式传输模式直播模式还要求
objectDetectorLiveStreamDelegate
配置选项,它启用
对象检测器异步向代理传递检测结果。
选择与运行模式对应的标签页,了解如何创建任务 并进行推理。
Swift
映像
import MediaPipeTasksVision let modelPath = Bundle.main.path(forResource: "model", ofType: "tflite") let options = ObjectDetectorOptions() options.baseOptions.modelAssetPath = modelPath options.runningMode = .image options.maxResults = 5 let objectDetector = try ObjectDetector(options: options)
视频
import MediaPipeTasksVision let modelPath = Bundle.main.path(forResource: "model", ofType: "tflite") let options = ObjectDetectorOptions() options.baseOptions.modelAssetPath = modelPath options.runningMode = .video options.maxResults = 5 let objectDetector = try ObjectDetector(options: options)
直播
import MediaPipeTasksVision // Class that conforms to the `ObjectDetectorLiveStreamDelegate` protocol and // implements the method that the object detector calls once it // finishes performing detection on each input frame. class ObjectDetectorResultProcessor: NSObject, ObjectDetectorLiveStreamDelegate { func objectDetector( _ objectDetector: ObjectDetector, didFinishDetection objectDetectionResult: ObjectDetectorResult?, timestampInMilliseconds: Int, error: Error?) { // Process the detection result or errors here. } } let modelPath = Bundle.main.path(forResource: "model", ofType: "tflite") let options = ObjectDetectorOptions() options.baseOptions.modelAssetPath = modelPath options.runningMode = .liveStream options.maxResults = 5 // Assign an object of the class to the `objectDetectorLiveStreamDelegate` // property. let processor = ObjectDetectorResultProcessor() options.objectDetectorLiveStreamDelegate = processor let objectDetector = try ObjectDetector(options: options)
Objective-C
映像
@import MediaPipeTasksVision; NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"model" ofType:@"tflite"]; MPPObjectDetectorOptions *options = [[MPPObjectDetectorOptions alloc] init]; options.baseOptions.modelAssetPath = modelPath; options.runningMode = MPPRunningModeImage; options.maxResults = 5; MPPObjectDetector *objectDetector = [[MPPObjectDetector alloc] initWithOptions:options error:nil];
视频
@import MediaPipeTasksVision; NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"model" ofType:@"tflite"]; MPPObjectDetectorOptions *options = [[MPPObjectDetectorOptions alloc] init]; options.baseOptions.modelAssetPath = modelPath; options.runningMode = MPPRunningModeVideo; options.maxResults = 5; MPPObjectDetector *objectDetector = [[MPPObjectDetector alloc] initWithOptions:options error:nil];
直播
@import MediaPipeTasksVision; // Class that conforms to the `ObjectDetectorLiveStreamDelegate` protocol and // implements the method that the object detector calls once it // finishes performing detection on each input frame. @interface APPObjectDetectorResultProcessor : NSObject@end @implementation MPPObjectDetectorResultProcessor - (void)objectDetector:(MPPObjectDetector *)objectDetector didFinishDetectionWithResult:(MPPObjectDetectorResult *)ObjectDetectorResult timestampInMilliseconds:(NSInteger)timestampInMilliseconds error:(NSError *)error { // Process the detection result or errors here. } @end NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"model" ofType:@"tflite"]; MPPObjectDetectorOptions *options = [[MPPObjectDetectorOptions alloc] init]; options.baseOptions.modelAssetPath = modelPath; options.runningMode = MPPRunningModeLiveStream; options.maxResults = 5; // Assign an object of the class to the `objectDetectorLiveStreamDelegate` // property. APPObjectDetectorResultProcessor *processor = [APPObjectDetectorResultProcessor new]; options.objectDetectorLiveStreamDelegate = processor; MPPObjectDetector *objectDetector = [[MPPObjectDetector alloc] initWithOptions:options error:nil];
配置选项
此任务具有以下适用于 iOS 应用的配置选项:
选项名称 | 说明 | 值范围 | 默认值 |
---|---|---|---|
runningMode |
设置任务的运行模式。有三个
模式: IMAGE:单图输入的模式。 VIDEO:视频已解码帧的模式。 LIVE_STREAM:输入流媒体直播模式 例如来自相机的数据。在此模式下,resultListener 必须为 调用以设置监听器以接收结果 异步执行。 |
{RunningMode.image, RunningMode.video, RunningMode.liveStream } |
RunningMode.image |
displayNamesLocales |
设置要用于
任务模型的元数据(如果有)。默认值为 en ,
英语。您可以向自定义模型的元数据中添加本地化标签
使用 TensorFlow Lite Metadata Writer API
|
语言区域代码 | en |
maxResults |
将可选的最高评分检测结果数上限设置为 return。 | 任何正数 | -1(返回所有结果) |
scoreThreshold |
设置预测分数阈值,以替换 模型元数据(如果有)。低于此值的结果将被拒绝。 | 任意浮点数 | 未设置 |
categoryAllowlist |
设置允许的类别名称的可选列表。如果不为空,
类别名称未在此集合内的检测结果
已滤除。重复或未知的类别名称会被忽略。
此选项与 categoryDenylist 互斥,使用
都会导致错误。 |
任何字符串 | 未设置 |
categoryDenylist |
设置不允许使用的类别名称的可选列表。如果
非空,则类别名称在此集中的检测结果将被滤除
。重复或未知的类别名称会被忽略。这个选项
categoryAllowlist 不包含,同时使用这两个元素会导致错误。 |
任何字符串 | 未设置 |
直播配置
当运行模式设置为实时流式传输时,对象检测器要求使用
额外的 objectDetectorLiveStreamDelegate
配置选项
使检测器异步传送检测结果。受托人
实现了
objectDetector(_objectDetector:didFinishDetection:timestampInMilliseconds:error:)
方法,对象检测器会在处理针对以下事件的检测结果后调用该方法
每个帧。
选项名称 | 说明 | 值范围 | 默认值 |
---|---|---|---|
objectDetectorLiveStreamDelegate |
启用对象检测器以异步方式接收检测结果,
直播模式将实例设置为此属性的类必须
实施
objectDetector(_:didFinishDetection:timestampInMilliseconds:error:)
方法。 |
不适用 | 未设置 |
准备数据
您需要先将输入图片或帧转换为 MPImage
对象,然后才能
传递给对象检测器。MPImage
支持不同类型的 iOS 图片
并且可在任何运行模式下使用它们进行推理。有关
有关 MPImage
的信息,请参阅
MPImage API
根据您的使用情形和应用的运行模式选择 iOS 图片格式
MPImage
接受 UIImage
、CVPixelBuffer
和
CMSampleBuffer
iOS 图片格式。
UIImage
UIImage
格式非常适合以下运行模式:
图片:来自 app bundle、用户图库或文件系统的图片,格式为
UIImage
图片可转换为MPImage
对象。视频:使用 AVAssetImageGenerator 将视频帧提取到 CGImage 格式,然后将其转换为
UIImage
图片。
Swift
// Load an image on the user's device as an iOS `UIImage` object. // Convert the `UIImage` object to a MediaPipe's Image object having the default // orientation `UIImage.Orientation.up`. let image = try MPImage(uiImage: image)
Objective-C
// Load an image on the user's device as an iOS `UIImage` object. // Convert the `UIImage` object to a MediaPipe's Image object having the default // orientation `UIImageOrientationUp`. MPImage *image = [[MPPImage alloc] initWithUIImage:image error:nil];
本示例使用默认值初始化 MPImage
。
UIImage.Orientation.Up
屏幕方向。您可以使用任何受支持的MPImage
UIImage.Orientation
值。对象检测器不支持镜像方向,例如 .upMirrored
、
.downMirrored
、.leftMirrored
、.rightMirrored
。
有关 UIImage
的详细信息,请参阅 UIImage Apple Developer
文档。
CVPixelBuffer
CVPixelBuffer
格式非常适合生成帧的应用
并使用 iOS CoreImage
处理框架
CVPixelBuffer
格式非常适合以下运行模式:
图片:应用会在经过一些处理后生成
CVPixelBuffer
图片 发送到 SDK 中的对象检测器CoreImage
映像运行模式视频:可将视频帧转换为
CVPixelBuffer
格式,以便 处理,然后在视频模式下发送到对象检测器。直播:使用 iOS 相机生成帧的应用可能会被转换 转换为
CVPixelBuffer
格式进行处理,然后再发送到 实时模式下的对象检测器。
Swift
// Obtain a CVPixelBuffer. // Convert the `CVPixelBuffer` object to a MediaPipe's Image object having the default // orientation `UIImage.Orientation.up`. let image = try MPImage(pixelBuffer: pixelBuffer)
Objective-C
// Obtain a CVPixelBuffer. // Convert the `CVPixelBuffer` object to a MediaPipe's Image object having the // default orientation `UIImageOrientationUp`. MPImage *image = [[MPPImage alloc] initWithUIImage:image error:nil];
如需详细了解 CVPixelBuffer
,请参阅 CVPixelBuffer Apple
开发者
文档。
CMSampleBuffer
CMSampleBuffer
格式用于存储统一媒体类型的媒体样本,
非常适合直播运行模式。来自 iOS 相机的实时帧
由 iOS 以 CMSampleBuffer
格式异步传送
AVCaptureVideoDataOutput.
Swift
// Obtain a CMSampleBuffer. // Convert the `CMSampleBuffer` object to a MediaPipe's Image object having the default // orientation `UIImage.Orientation.up`. let image = try MPImage(sampleBuffer: sampleBuffer)
Objective-C
// Obtain a `CMSampleBuffer`. // Convert the `CMSampleBuffer` object to a MediaPipe's Image object having the // default orientation `UIImageOrientationUp`. MPImage *image = [[MPPImage alloc] initWithSampleBuffer:sampleBuffer error:nil];
如需详细了解 CMSampleBuffer
,请参阅 CMSampleBuffer Apple
开发者
文档。
运行任务
要运行对象检测器,请使用特定于指定的 detect()
方法
跑步模式:
- 静态图片:
detect(image:)
- 视频:
detect(videoFrame:timestampInMilliseconds:)
- 直播:
detectAsync(image:)
以下代码示例显示了如何在 不同的跑步模式:
Swift
映像
let objectDetector.detect(image:image)
视频
let objectDetector.detect(videoFrame:image)
直播
let objectDetector.detectAsync(image:image)
Objective-C
映像
MPPObjectDetectorResult *result = [objectDetector detectInImage:image error:nil];
视频
MPPObjectDetectorResult *result = [objectDetector detectInVideoFrame:image timestampInMilliseconds:timestamp error:nil];
直播
BOOL success = [objectDetector detectAsyncInImage:image timestampInMilliseconds:timestamp error:nil];
对象检测器代码示例展示了上述每种模式的实现
detect(image:)
、detect(videoFrame:)
和
detectAsync(image:)
。示例代码让用户可在
您的用例可能不需要这些处理模式。
请注意以下几点:
在视频模式或直播模式下运行时,您还必须提供 对象检测器任务的输入帧的时间戳。
在图片模式或视频模式下运行时,对象检测器任务会阻止 当前线程,直到处理完输入图像或帧为止。接收者 避免阻塞当前线程,在后台执行处理 使用 iOS 的会话串 Dispatch 或 NSOperation 框架。
在实时模式下运行时,对象检测器任务会立即返回 并且不会阻塞当前线程。它会调用
objectDetector(_objectDetector:didFinishDetection:timestampInMilliseconds:error:)
方法与检测结果相关联。通过 对象检测器在专用序列上异步调用此方法 调度队列。要在界面上显示结果, 并在处理后将结果发送到主队列中。如果detectAsync
函数,当对象检测器任务正忙于处理另一个任务时, 帧,对象检测器会忽略新的输入帧。
处理和显示结果
运行推理时,“对象检测器”任务会返回 ObjectDetectorResult
对象,它描述了它在输入图片中发现的对象。
以下示例展示了此任务的输出数据:
ObjectDetectorResult:
Detection #0:
Box: (x: 355, y: 133, w: 190, h: 206)
Categories:
index : 17
score : 0.73828
class name : dog
Detection #1:
Box: (x: 103, y: 15, w: 138, h: 369)
Categories:
index : 17
score : 0.73047
class name : dog
下图直观显示了任务输出:
对象检测器示例代码演示了如何显示检测结果 请参阅代码示例了解详情。