借助 MediaPipe 人脸检测器任务,您可以检测图片或视频中的人脸。您可以使用 此任务在帧中定位人脸和面部特征。此任务使用 可处理单张图片或连续图片 图像流。该任务会输出人脸位置,以及以下信息 面部关键点:左眼、右眼、鼻尖、嘴巴、左眼悲剧以及 右眼的悲剧。
这些说明中介绍的代码示例可供使用 已开启 GitHub 如需详细了解其功能、模型和 配置选项,请参阅概览。
代码示例
MediaPipe Tasks 示例代码是人脸检测器的简单实现 Android 版应用。该示例使用 Android 实体设备上的相机 检测人脸。应用还可以检测设备图库中图片和视频中的人脸。
您可以用该应用作为基础来开发自己的 Android 应用,也可以指代该应用 对现有应用进行了修改。人脸检测器示例代码托管在 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/android
创建示例代码的本地版本后,您可以导入项目 进入 Android Studio 并运行应用。有关说明,请参阅 Android 版设置指南。
关键组件
以下文件包含此人脸检测示例的关键代码 应用:
- FaceDetectorHelper.kt - 初始化面部检测器并处理模型和委托 选择。
- CameraFragment.kt: 处理设备相机以及图片和视频输入数据。
- GalleryFragment.kt:
与
OverlayView
交互以显示输出图片或视频。 - OverlayView.kt - 使用所检测到的人脸的边界框实现显示。
设置
本部分介绍了设置开发环境和 代码项目。有关 设置开发环境以使用 MediaPipe 任务,包括 平台版本要求,请参阅 Android 版设置指南。
<ph type="x-smartling-placeholder">依赖项
人脸检测器任务使用 com.google.mediapipe:tasks-vision
库。将此依赖项添加到 Android 应用的 build.gradle
文件中:
dependencies {
implementation 'com.google.mediapipe:tasks-vision:latest.release'
}
型号
MediaPipe 人脸检测器任务需要一个与 此任务。如需详细了解适用于人脸检测器的经过训练的模型, 请参阅任务概览的“模型”部分。
选择并下载模型,并将其存储在项目目录中:
<dev-project-root>/src/main/assets
在 ModelAssetPath
参数中指定模型的路径。在
示例代码,
该模型在 FaceDetectorHelper.kt
中定义,
文件:
val modelName = "face_detection_short_range.tflite"
baseOptionsBuilder.setModelAssetPath(modelName)
创建任务
MediaPipe 人脸检测器任务使用 createFromOptions()
函数来设置
任务。createFromOptions()
函数接受配置的值
选项。如需详细了解配置选项,请参阅
配置选项。
人脸检测器支持以下输入数据类型:静态图片、视频文件和 实时视频流。您需要指定与 输入数据类型。选择与您的 输入数据类型,了解如何创建任务并运行推理。
映像
val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(modelName) val baseOptions = baseOptionBuilder.build() val optionsBuilder = FaceDetector.FaceDetectorOptions.builder() .setBaseOptions(baseOptionsBuilder.build()) .setMinDetectionConfidence(threshold) .setRunningMode(RunningMode.IMAGE) val options = optionsBuilder.build() FaceDetector = FaceDetector.createFromOptions(context, options)
视频
val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(modelName) val baseOptions = baseOptionBuilder.build() val optionsBuilder = FaceDetector.FaceDetectorOptions.builder() .setBaseOptions(baseOptionsBuilder.build()) .setMinDetectionConfidence(threshold) .setRunningMode(RunningMode.VIDEO) val options = optionsBuilder.build() FaceDetector = FaceDetector.createFromOptions(context, options)
直播
val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(modelName) val baseOptions = baseOptionBuilder.build() val optionsBuilder = FaceDetector.FaceDetectorOptions.builder() .setBaseOptions(baseOptionsBuilder.build()) .setMinDetectionConfidence(threshold) .setResultListener(this::returnLivestreamResult) .setErrorListener(this::returnLivestreamError) .setRunningMode(RunningMode.LIVE_STREAM) val options = optionsBuilder.build() FaceDetector = FaceDetector.createFromOptions(context, options)
人脸检测器示例代码实现可让用户
处理模式这种方法使得任务创建代码更加复杂,
可能不适合您的用例。您可以在
setupFaceDetector()
函数,
FaceDetectorHelper.kt
文件。
配置选项
此任务具有以下适用于 Android 应用的配置选项:
选项名称 | 说明 | 值范围 | 默认值 |
---|---|---|---|
runningMode |
设置任务的运行模式。有三个
模式: IMAGE:单图输入的模式。 VIDEO:视频已解码帧的模式。 LIVE_STREAM:输入流媒体直播模式 例如来自相机的数据。在此模式下,resultListener 必须为 调用以设置监听器以接收结果 异步执行。 |
{IMAGE, VIDEO, LIVE_STREAM } |
IMAGE |
minDetectionConfidence |
被视为成功的面部检测的最低置信度分数。 | Float [0,1] |
0.5 |
minSuppressionThreshold |
将人脸检测视为重叠的最小非最大抑制阈值。 | Float [0,1] |
0.3 |
resultListener |
设置结果监听器以接收检测结果
当面部检测器在直播中时异步
模式。只有在跑步模式设置为 LIVE_STREAM 时才能使用。 |
N/A |
Not set |
errorListener |
设置一个可选的错误监听器。 | N/A |
Not set |
准备数据
人脸检测器适用于图片、视频文件和实时视频流。任务 处理数据输入预处理,包括调整大小、旋转和值 标准化。
以下代码演示了如何移交数据进行处理。这些 示例包括关于如何处理来自图片、视频文件和实时 视频流。
映像
import com.google.mediapipe.framework.image.BitmapImageBuilder import com.google.mediapipe.framework.image.MPImage // Convert the input Bitmap object to an MPImage object to run inference val mpImage = BitmapImageBuilder(image).build()
视频
import com.google.mediapipe.framework.image.BitmapImageBuilder import com.google.mediapipe.framework.image.MPImage val argb8888Frame = if (frame.config == Bitmap.Config.ARGB_8888) frame else frame.copy(Bitmap.Config.ARGB_8888, false) // Convert the input Bitmap object to an MPImage object to run inference val mpImage = BitmapImageBuilder(argb8888Frame).build()
直播
import com.google.mediapipe.framework.image.BitmapImageBuilder import com.google.mediapipe.framework.image.MPImage // Convert the input Bitmap object to an MPImage object to run inference val mpImage = BitmapImageBuilder(rotatedBitmap).build()
在
人脸检测器示例代码,数据准备在
FaceDetectorHelper.kt
文件。
运行任务
根据您处理的数据类型,使用
faceDetector.detect...()
方法。使用
detect()
,适用于单个图片;
detectForVideo()
(针对视频文件中的帧)和
detectAsync()
适用于视频流。当您在 Google Analytics 4 上
则务必在单独的线程中运行检测,
阻塞用户界面线程
以下代码示例展示了如何运行人脸检测器的简单示例 数据模式:
映像
val result = faceDetector.detect(mpImage)
视频
val timestampMs = i * inferenceIntervalMs faceDetector.detectForVideo(mpImage, timestampMs) .let { detectionResult -> resultList.add(detectionResult) }
直播
val mpImage = BitmapImageBuilder(rotatedBitmap).build() val frameTime = SystemClock.uptimeMillis() faceDetector.detectAsync(mpImage, frameTime)
请注意以下几点:
- 在视频模式或直播模式下投放广告时,您必须 为人脸检测器任务提供输入帧的时间戳。
- 在图片模式或视频模式下运行时,人脸检测器任务 阻塞当前线程,直到它处理完输入图像,或者 帧。为避免阻塞界面,请在 后台线程。
- 在直播模式下运行时,人脸检测器任务会返回 而且不会阻塞当前线程它将调用结果 并在每次处理完一个监听器后都返回检测结果 输入帧。如果在执行人脸检测器任务时调用检测函数, 正忙于处理另一个帧,则任务将忽略新的输入帧。
在
人脸检测器示例代码,即 detect
、detectForVideo
和
detectAsync
函数在
FaceDetectorHelper.kt
文件。
处理和显示结果
人脸检测器会针对每次检测返回一个 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)
下图直观显示了任务输出:
对于没有边界框的图片,请参阅原始图片。
面部检测器示例代码演示了如何显示
结果,请参阅
OverlayView
类以了解更多详情。