借助人脸检测器任务,您可以检测图片或视频中的人脸。您可以使用 此任务在帧中定位人脸和面部特征。此任务使用 可处理单张图片或连续数据流的机器学习 (ML) 模型 图片。该任务会输出人脸位置以及以下面部密钥 点:左眼、右眼、鼻尖、嘴巴、左眼悲伤和右眼 悲剧。
GitHub 上提供了这些说明中所述的代码示例。 您可以查看此网页 演示。有关 提供有关此资源的功能、模型和配置选项的信息, 请参阅 概览。
代码示例
MediaPipe Tasks 示例代码是人脸检测器的简单实现 。该示例使用 Android 实体设备上的相机来检测 连续视频流中的人脸。应用还可以检测图片中的人脸,以及 从设备图库中挑选视频
您可以以此为基础来创建自己的 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/face_detector/ios/
创建示例代码的本地版本后,您可以安装 MediaPipe 任务库,使用 Xcode 打开项目并运行应用。对于 请参阅 iOS 设置指南。
关键组件
以下文件包含人脸检测器示例的关键代码 应用:
- FaceDetectorService.swift: 初始化检测器,处理模型选择,并根据输入数据进行推理。
- CameraViewController: 实现实时摄像头画面输入模式的界面,并直观呈现检测结果。
- MediaLibraryViewController.swift: 实现静态图片和视频文件输入模式的界面,并直观呈现检测结果。
设置
本部分介绍了设置开发环境和 代码项目以使用人脸检测器。有关如何设置 用于使用 MediaPipe 任务(包括平台版本)的开发环境 要求,请参阅 iOS 设置指南。
<ph type="x-smartling-placeholder">依赖项
人脸检测器使用 MediaPipeTasksVision
库,您必须安装该库
使用 CocoaPods 构建容器。该库与 Swift 和 Objective-C 应用兼容
并且不需要任何额外的语言相关设置。
如需了解如何在 macOS 上安装 CocoaPods,请参阅 CocoaPods
安装指南。
如需了解如何创建包含必要 Pod 的 Podfile
,请参阅
请参阅使用
CocoaPods。
使用以下代码在 Podfile
中添加 MediaPipeTasksVision pod:
target 'MyFaceDetectorApp' do
use_frameworks!
pod 'MediaPipeTasksVision'
end
如果您的应用包含单元测试目标,请参阅应用的设置指南
iOS 设备,详细了解如何设置
您的Podfile
。
型号
MediaPipe 人脸检测器任务需要一个经过训练的模型, 此任务。如需详细了解适用于 Kubernetes 的 人脸检测器,请参阅任务概览模型 部分。
选择并下载模型,然后使用 Xcode 将其添加到您的项目目录。 有关如何向 Xcode 项目添加文件的说明,请参阅管理 Xcode 中的文件和文件夹 项目。
使用 BaseOptions.modelAssetPath
属性指定模型的路径
。如需查看代码示例,请参阅下一部分。
创建任务
您可以通过调用面部检测器任务之一来创建该任务。通过
FaceDetector(options:)
初始化程序接受配置的值
选项。
如果您不需要使用自定义配置初始化的人脸检测器
可以使用 FaceDetector(modelPath:)
初始化程序创建
使用默认选项的人脸检测器。如需详细了解配置
选项,请参阅配置概览。
人脸检测器任务支持 3 种输入数据类型:静态图片、视频文件
和直播视频流默认情况下,FaceDetector(modelPath:)
会初始化
执行任务。如果您希望将任务初始化以处理视频
文件或直播视频串流,请使用 FaceDetector(options:)
来指定视频
或实时流式传输模式直播模式还要求
faceDetectorLiveStreamDelegate
配置选项,它启用
面部检测器以异步方式向代理传递面部检测结果。
选择与运行模式对应的标签页,了解如何创建任务 并进行推理。
Swift
映像
import MediaPipeTasksVision let modelPath = Bundle.main.path(forResource: "model", ofType: "tflite") let options = FaceDetectorOptions() options.baseOptions.modelAssetPath = modelPath options.runningMode = .image let faceDetector = try FaceDetector(options: options)
视频
import MediaPipeTasksVision let modelPath = Bundle.main.path(forResource: "model", ofType: "tflite") let options = FaceDetectorOptions() options.baseOptions.modelAssetPath = modelPath options.runningMode = .video let faceDetector = try FaceDetector(options: options)
直播
import MediaPipeTasksVision // Class that conforms to the `FaceDetectorLiveStreamDelegate` protocol and // implements the method that the face detector calls once it finishes // detecting faces in each input frame. class FaceDetectorResultProcessor: NSObject, FaceDetectorLiveStreamDelegate { func faceDetector( _ faceDetector: FaceDetector, didFinishDetection result: FaceDetectorResult?, timestampInMilliseconds: Int, error: Error?) { // Process the face detection result or errors here. } } let modelPath = Bundle.main.path( forResource: "model", ofType: "tflite") let options = FaceDetectorOptions() options.baseOptions.modelAssetPath = modelPath options.runningMode = .liveStream // Assign an object of the class to the `faceDetectorLiveStreamDelegate` // property. let processor = FaceDetectorResultProcessor() options.faceDetectorLiveStreamDelegate = processor let faceDetector = try FaceDetector(options: options)
Objective-C
映像
@import MediaPipeTasksVision; NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"model" ofType:@"tflite"]; MPPFaceDetectorOptions *options = [[MPPFaceDetectorOptions alloc] init]; options.baseOptions.modelAssetPath = modelPath; options.runningMode = MPPRunningModeImage; MPPFaceDetector *faceDetector = [[MPPFaceDetector alloc] initWithOptions:options error:nil];
视频
@import MediaPipeTasksVision; NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"model" ofType:@"tflite"]; MPPFaceDetectorOptions *options = [[MPPFaceDetectorOptions alloc] init]; options.baseOptions.modelAssetPath = modelPath; options.runningMode = MPPRunningModeVideo; MPPFaceDetector *faceDetector = [[MPPFaceDetector alloc] initWithOptions:options error:nil];
直播
@import MediaPipeTasksVision; // Class that conforms to the `MPPFaceDetectorLiveStreamDelegate` protocol // and implements the method that the face detector calls once it finishes // detecting faces in each input frame. @interface APPFaceDetectorResultProcessor : NSObject@end @implementation APPFaceDetectorResultProcessor - (void)faceDetector:(MPPFaceDetector *)faceDetector didFinishDetectionWithResult:(MPPFaceDetectorResult *)faceDetectorResult timestampInMilliseconds:(NSInteger)timestampInMilliseconds error:(NSError *)error { // Process the face detector result or errors here. } @end NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"model" ofType:@"tflite"]; MPPFaceDetectorOptions *options = [[MPPFaceDetectorOptions alloc] init]; options.baseOptions.modelAssetPath = modelPath; options.runningMode = MPPRunningModeLiveStream; // Assign an object of the class to the `faceDetectorLiveStreamDelegate` // property. APPFaceDetectorResultProcessor *processor = [APPFaceDetectorResultProcessor new]; options.faceDetectorLiveStreamDelegate = processor; MPPFaceDetector *faceDetector = [[MPPFaceDetector alloc] initWithOptions:options error:nil];
注意:如果您使用视频模式或直播模式,人脸检测器会使用 以免每一帧都触发检测模型,这有助于 缩短延迟时间
配置选项
此任务具有以下适用于 iOS 应用的配置选项:
选项名称 | 说明 | 值范围 | 默认值 |
---|---|---|---|
runningMode |
设置任务的运行模式。有三个
模式: IMAGE:单图输入的模式。 VIDEO:视频已解码帧的模式。 LIVE_STREAM:输入流媒体直播模式 例如来自相机的数据。在此模式下,resultListener 必须为 调用以设置监听器以接收结果 异步执行。 |
{RunningMode.image, RunningMode.video, RunningMode.liveStream } |
RunningMode.image |
minDetectionConfidence |
被视为成功的面部检测的最低置信度分数。 | Float [0,1] |
0.5 |
minSuppressionThreshold |
将人脸检测视为重叠的最小非最大抑制阈值。 | Float [0,1] |
0.3 |
直播配置
当运行模式设置为直播时,人脸检测器要求使用
额外的 faceDetectorLiveStreamDelegate
配置选项,可让您启用
人脸检测器以异步传送检测结果。受托人
实现了
faceDetector(_:didFinishDetection:timestampInMilliseconds:error:)
方法、
人脸检测器在处理针对
每个帧。
选项名称 | 说明 | 值范围 | 默认值 |
---|---|---|---|
faceDetectorLiveStreamDelegate |
启用人脸检测器以异步接收人脸检测结果
处于直播模式将实例设置为此属性的类必须
实施
faceDetector(_: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
图片 可以使用 iOS 的CoreImage
框架发送到 Android 中的人脸检测器 映像运行模式视频:可将视频帧转换为
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:timestampInMilliseconds:)
人脸检测器会返回在输入图片或帧内检测到的人脸。
以下代码示例展示了如何在以下位置运行人脸检测器的简单示例: 不同的跑步模式:
Swift
映像
let result = try faceDetector.detect(image: image)
视频
let result = try faceDetector.detect( videoFrame: image, timestampInMilliseconds: timestamp)
直播
try faceDetector.detectAsync( image: image, timestampInMilliseconds: timestamp)
Objective-C
映像
MPPFaceDetectorResult *result = [faceDetector detectInImage:image error:nil];
视频
MPPFaceDetectorResult *result = [faceDetector detectInVideoFrame:image timestampInMilliseconds:timestamp error:nil];
直播
BOOL success = [faceDetector detectAsyncInImage:image timestampInMilliseconds:timestamp error:nil];
人脸检测器代码示例展示了以上每种模式的实现
detect(image:)
、detect(videoFrame:timestampInMilliseconds:)
、
和 detectAsync(image:timestampInMilliseconds:)
。示例代码允许
让用户可以在您可能并不需要的处理模式之间进行切换
这种情况。
请注意以下几点:
在视频模式或直播模式下运行时,您还必须提供 人脸检测器任务的输入帧的时间戳。
在图片或视频模式下运行时,人脸检测器任务会阻止 当前线程,直到处理完输入图像或帧为止。接收者 避免阻塞当前线程,在后台执行处理 使用 iOS 的会话串 Dispatch 或 NSOperation 框架。
在直播模式下运行时,人脸检测器任务会立即返回 并且不会阻塞当前线程。它会调用
faceDetector(_:didFinishDetection:timestampInMilliseconds:error:)
种方式 处理每个输入帧之后与人脸检测结果相关联。通过 人脸检测器在专用序列上异步调用此方法。 调度队列。要在界面上显示结果,请分派 并在处理后将结果发送到主队列中。如果detectAsync
函数,当面部检测器任务正忙于处理另一个 帧,人脸检测器会忽略新的输入帧。
处理和显示结果
运行推理时,人脸检测器任务会返回 FaceDetectorResult
对象,该对象包含检测到的人脸的边界框和置信度,
获得相应的分数。
以下示例展示了此任务的输出数据:
FaceDetectionResult:
Detections:
Detection #0:
BoundingBox:
origin_x: 126
origin_y: 100
width: 463
height: 463
Categories:
Category #0:
index: 0
score: 0.9729152917861938
NormalizedKeypoints:
NormalizedKeypoint #0:
x: 0.18298381567001343
y: 0.2961040139198303
NormalizedKeypoint #1:
x: 0.3302789330482483
y: 0.29289937019348145
... (6 keypoints for each face)
Detection #1:
BoundingBox:
origin_x: 616
origin_y: 193
width: 430
height: 430
Categories:
Category #0:
index: 0
score: 0.9251380562782288
NormalizedKeypoints:
NormalizedKeypoint #0:
x: 0.6151331663131714
y: 0.3713381886482239
NormalizedKeypoint #1:
x: 0.7460576295852661
y: 0.38825345039367676
... (6 keypoints for each face)
下图直观显示了任务输出:
对于没有边界框的图片,请参阅原始图片。
人脸检测器示例代码演示了如何显示结果。请参阅 代码示例。