MediaPipe Android Solution API在 Android Studio 中集成人脸检测、人脸网格与手势识别方案并构建示例应用【免费下载链接】mediapipeCross-platform, customizable ML solutions for live and streaming media.项目地址: https://gitcode.com/GitHub_Trending/med/mediapipe本文基于 MediaPipe 官方文档docs/getting_started/android_solutions.md展开结合仓库内mediapipe/examples/android/solutions/下的真实示例工程与mediapipe/java/com/google/mediapipe/solutioncore/基础库源码完整讲解 MediaPipe Android Solution API 的三条集成路径通过 Maven 预编译包接入 Face Detection / Face Mesh / Hands 三大 Solution、在 Android Studio 中构建并运行官方示例 App、以及需要深度定制时从源码构建自定义 AAR 的替代方案。读完本文你可以直接在 Android 项目里跑起带摄像头实时预览的人脸/手部检测流水线并理解示例 App 背后的solutioncore输入输出架构。Android Solution API 概述与可用性MediaPipe Android Solution API文档标注为 alpha 阶段目前覆盖三个解决方案每个 Solution 都有独立的文档页面文档中指向对应章节的 Android Solution API 部分MediaPipe Face DetectionMediaPipe Face MeshMediaPipe Hands从源码结构看这三个 Solution 的 Java API 都位于 solutions 包 下各自包含一个主类、一个 Options 构建类和对应的结果类FaceDetection.java、FaceDetectionOptions.java、FaceDetectionResult.javaFaceMesh.java、FaceMeshOptions.javaHands.java、HandsOptions.java它们共同依赖一套与具体 Solution 无关的基础设施即solutioncore包包含 CameraInput.java摄像头输入、VideoInput.java视频输入、ImageSolutionBase.java图片输入基类、SolutionGlSurfaceView.javaOpenGL 预览渲染视图等。这一分层正是后文 Gradle 依赖里必须引入solution-core的原因。通过 Maven 预编译包集成到 Android Studio文档给出的标准接入方式是使用 Google Maven 仓库上的预编译包。在项目build.gradle的dependencies中加入dependencies { // MediaPipe solution-core is the foundation of any MediaPipe Solutions. implementation com.google.mediapipe:solution-core:latest.release // Optional: MediaPipe Face Detection Solution. implementation com.google.mediapipe:facedetection:latest.release // Optional: MediaPipe Face Mesh Solution. implementation com.google.mediapipe:facemesh:latest.release // Optional: MediaPipe Hands Solution. implementation com.google.mediapipe:hands:latest.release }各依赖的取舍规则solution-core是所有 Solution 的基础包必须引入它对应的就是源码中的mediapipe/java/com/google/mediapipe/solutioncore模块摄像头/视频输入、结果渲染、错误监听等公共组件其余三个是可选的功能包按业务需要引入其一或多者分别提供com.google.mediapipe.solutions.facedetection、facemesh、hands包下的 Solution 类。文档同时指出预编译包适合开箱即用如果需要进一步定制例如更换计算图、增删 Calculator应改为从源码本地构建 MediaPipe Android Archive (AAR) 库。仓库中对应的操作文档是 android_archive_library.md其核心步骤为在 BUILD 文件中创建mediapipe_aar()target并声明图形所用的 calculators 依赖例如为 Face Detection 构建 AARload(//mediapipe/java/com/google/mediapipe:mediapipe_aar.bzl, mediapipe_aar) mediapipe_aar( name mediapipe_face_detection, calculators [//mediapipe/graphs/face_detection:mobile_calculators], )运行 Bazel 构建命令生成 AAR该文档标注为 Experimental Only且强调 MediaPipe 不发布通用 AAR必须为项目生成包含特定计算器的定制 AARbazel build -c opt --stripALWAYS \ --host_crosstool_topbazel_tools//tools/cpp:toolchain \ --fat_apk_cpuarm64-v8a,armeabi-v7a \ --legacy_whole_archive0 \ --features-legacy_whole_archive \ --copt-fvisibilityhidden \ --copt-ffunction-sections \ --copt-fdata-sections \ --copt-fstack-protector \ --copt-Oz \ --copt-fomit-frame-pointer \ --copt-DABSL_MIN_LOG_LEVEL2 \ --linkopt-Wl,--gc-sections,--strip-all \ //mediapipe/examples/android/src/java/com/google/mediapipe/apps/aar_example:mediapipe_face_detection.aar将生成的 AAR 复制到 App 的app/libs目录在build.gradle中通过implementation fileTree(dir: libs, include: [*.jar, *.aar])引入并配置 Flogger、Guava、protobuf-javalite、CameraX 等依赖完整依赖清单见 android_archive_library.md 的 Steps to use a MediaPipe AAR in Android Studio with Gradle 一节。构建 Solution 示例应用从导入工程到运行官方示例 App 的源码位于仓库的 mediapipe/examples/android/solutions/ 目录包含三个独立 Gradle 模块。settings.gradle 声明了工程结构rootProject.name mediapipe-solutions-examples include :facedetection include :facemesh include :hands每个模块如 facedetection/src/main/java/.../MainActivity.java均实现静态图片 视频 实时摄像头三种输入模式。构建步骤如下在 Linux、macOS 或 Windows 上打开 Android Studio文档建议 Arctic Fox 版本将mediapipe/examples/android/solutions目录作为工程导入 Android StudioWindows 用户专属步骤以管理员身份运行 create_win_symlinks.bat创建res目录符号链接。该脚本的作用从源码看非常明确三个 App 的res资源实际共用工程根目录下的一份资源Linux/macOS 上以符号链接形式存在而 Windows 需要重建脚本对每个模块执行mklink /d res ..\..\..\resrem for hands example app. cd /d %~dp0 cd hands\src\main rm res mklink /d res ..\..\..\res rem for facemesh example app. ...对应的资源在 Bazel 构建中则由 facedetection 的 BUILD 文件 统一声明resource_files [//mediapipe/examples/android/solutions:resource_files]即三个模块都引用solutions/res/这一份公共资源。选择 File → Sync Project with Gradle Files 同步工程在 Android Studio 中直接运行示例 App需连接真机或配置了 GPU 的模拟器原因见下一节可选改为 CPU 运行示例 App 默认将流水线和模型推理放在GPU上执行。若需要在 Android Emulator 等无 GPU 环境的场景运行把对应 App 的MainActivity.java中RUN_ON_GPU布尔变量改为false即可。该开关在仓库源码中真实存在例如 facemesh 的 MainActivity 中定义private static final boolean RUN_ON_GPU true;并在构建 Options 时传入.setRunOnGpu(RUN_ON_GPU)静态图片模式与流式模式各传入一次hands 模块的 MainActivity.java 结构相同。示例 App 的调用链以 Face Detection 为例读懂示例代码是复用这套 API 的关键。以 facedetection/MainActivity.java 为例其核心工作流可分为四个环节1. 创建 Solution 实例静态图片模式faceDetection new FaceDetection( this, FaceDetectionOptions.builder() .setStaticImageMode(true) .setModelSelection(0) .setMinDetectionConfidence(0.5f) .build());三个关键配置项setStaticImageMode(true)表示单帧图片处理模式流式模式传falsesetModelSelection(0)选择短距轻量模型短距离人脸检测模型更轻、精度面向近距离自拍场景setMinDetectionConfidence(0.5f)设置检测置信度阈值。2. 注册结果与错误监听faceDetection.setResultListener( faceDetectionResult - { logNoseTipKeypoint(faceDetectionResult, /*faceIndex*/ 0, /*showPixelValues*/ true); imageView.setFaceDetectionResult(faceDetectionResult); runOnUiThread(() - imageView.update()); }); faceDetection.setErrorListener( (message, e) - Log.e(TAG, MediaPipe Face Detection error: message));其中结果通过FaceKeypoint枚举如FaceKeypoint.NOSE_TIP访问相对关键点RelativeKeypoint坐标范围为 [0, 1]示例中再乘以输入宽高换算成像素坐标logNoseTipKeypoint方法中noseTip.getX() * width。3. 输入源接入静态图片通过ActivityResultLauncher从图库取图经downscaleBitmap缩放、rotateBitmap依据 EXIF 方向旋转后调用faceDetection.send(bitmap)流式摄像头/视频CameraInput/VideoInput提供 GPU 纹理帧回调直接送入流水线cameraInput new CameraInput(this); cameraInput.setNewFrameListener(textureFrame - faceDetection.send(textureFrame));摄像头默认使用前置镜头CameraInput.CameraFacing.FRONT。4. OpenGL 实时渲染流式模式使用SolutionGlSurfaceViewFaceDetectionResult创建预览视图并注入用户自定义的FaceDetectionResultGlRenderer继承自 solutioncore 的 ResultGlRenderer.java 体系负责把检测结果画到帧上每次收到新结果后调用glSurfaceView.setRenderData(...)requestRender()触发渲染。生命周期管理上示例遵循切换输入源先停后建的模式stopCurrentPipeline()中依次关闭摄像头/视频输入、隐藏 GL 视图并faceDetection.close()onResume时若处于摄像头模式则重建CameraInput并重启渲染onPause时关闭输入以释放相机资源。这套close()/resume()/pause()约定对开发自己的 App 同样适用。Bazel 侧该示例 App 的构建目标声明在 facedetection/src/main/BUILD 中其deps直观展示了 Maven 包与源码模块的对应关系//mediapipe/java/com/google/mediapipe/solutions/facedetectionSolution 本体、solutioncore下的camera_input、video_input、solution_rendering、mediapipe_jni_lib对应solution-core包以及detection_java_proto_lite、location_data_java_proto_lite等 proto 依赖——这也解释了为何示例结果类能直接使用LocationDataProto。服务条款与隐私模型文档最后附上了 MediaPipe Solution APIs 的服务条款要点文档标注 Last modified: November 12, 2021其中对工程选型最有参考价值的是隐私条款输入数据全程在设备端处理MediaPipe 不会把图片、视频等输入数据发送到 Google 服务器因此可用于处理不应离开设备的数据但 Android Solution API 会间歇性连接 Google 服务器用于获取 bug 修复、更新模型和硬件加速器GPU/DSP兼容性信息同时会上报 API 性能与使用指标上报数据范围包括设备信息厂商、型号、OS 版本、可用 ML 加速器、应用标识包名、版本、API 配置图片格式、分辨率、MediaPipe 版本、事件类型initialize、下载模型、run、detection 等、错误码、性能指标、无法唯一标识用户或设备的每安装标识符以及临时保留的网络请求来源 IP开发者有法定义务就 Google 处理这些指标数据取得应用用户的知情同意使用 Solution API 同时受 Google APIs 服务条款与 Google API Services 用户数据政策约束且条款会不定期更新需要关注最新版本。小结与适用边界接入选型常规业务直接用 Maven 预编译包solution-core 按需的facedetection/facemesh/hands需要定制计算图或增删 Calculator 时转用 android_archive_library.md 描述的mediapipe_aar()从源码构建注意该路径标注为 Experimental Only。环境前提默认 GPU 推理路径要求设备/模拟器具备可用 GPU在 Android Emulator 等场景下通过RUN_ON_GPU false切换到 CPU 路径。仓库内可继续深入的资源三个示例 App 的完整源码facedetection、facemesh、hands、solutioncore基础设施mediapipe/java/com/google/mediapipe/solutioncore、以及 face_detection.md、face_mesh.md、hands.md 中各 Solution 的详细参数说明。【免费下载链接】mediapipeCross-platform, customizable ML solutions for live and streaming media.项目地址: https://gitcode.com/GitHub_Trending/med/mediapipe创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
