MediaPipe手势(Hands)

本文介绍了如何在Ubuntu上克隆MediaPipe源码,构建并替换solution_core和hands模块的aar,以便本地开发和自定义手势识别。涉及步骤包括修改gradle配置、构建aar及解决兼容性问题。

系列文章目录

1、Ubuntu上安装MediaPipe
2、Ubuntu上构建Android的MediaPipe
3、Ubuntu上构建MediaPipe Android Archive (AAR)



前言

最近刚好有手势识别的需求,所以就看到了MediaPipe的Hands,识别出各个手势的节点坐标,然后简单的计算手势。

这一篇主要是对上一篇编译aar库的补充,因为正式使用上我们自己编译的hands aar库。


一、使用步骤

1.克隆MediaPipe的源码

命令如下:

git clone git@github.com:google/mediapipe.git
或者
git clone https://github.com/google/mediapipe.git

2.MediaPipe的Hands例子

打开Android studio,导入Android MediaPipe例子

路径:mediapipe/mediapipe/examples/android/solutions,solutions这个就是Android的Project,将solutions导入Android studio。

运行之后的结果:
在这里插入图片描述

我们接下来需要进行的事情很简单,就是把build.gradle中Google Maven库中的aar替换为我们自己打包的aar。

就是将hands module中如下两个Maven库的aar替换为我们自己打包的aar。

// MediaPipe Hands Solution.
implementation 'com.google.mediapipe:solution-core:latest.release'
implementation 'com.google.mediapipe:hands:latest.release'

构建solution_core.aar

bazel build -c opt --strip=ALWAYS \
    --host_crosstool_top=@bazel_tools//tools/cpp:toolchain \
    --fat_apk_cpu=arm64-v8a,armeabi-v7a \
    --legacy_whole_archive=0 \
    --features=-legacy_whole_archive \
    --copt=-fvisibility=hidden \
    --copt=-ffunction-sections \
    --copt=-fdata-sections \
    --copt=-fstack-protector \
    --copt=-Oz \
    --copt=-fomit-frame-pointer \
    --copt=-DABSL_MIN_LOG_LEVEL=2 \
    --linkopt=-Wl,--gc-sections,--strip-all \
	--verbose_failures \
	//mediapipe/java/com/google/mediapipe/solutioncore:solution_core.aar

构建hands.aar

bazel build -c opt --strip=ALWAYS \
    --host_crosstool_top=@bazel_tools//tools/cpp:toolchain \
    --fat_apk_cpu=arm64-v8a,armeabi-v7a \
    --legacy_whole_archive=0 \
    --features=-legacy_whole_archive \
    --copt=-fvisibility=hidden \
    --copt=-ffunction-sections \
    --copt=-fdata-sections \
    --copt=-fstack-protector \
    --copt=-Oz \
    --copt=-fomit-frame-pointer \
    --copt=-DABSL_MIN_LOG_LEVEL=2 \
    --linkopt=-Wl,--gc-sections,--strip-all \
	--verbose_failures \
	//mediapipe/java/com/google/mediapipe/solutions/hands:hands.aar	

将构建成功的aar导入hands module的libs中

将aar导入libs中,并且注释掉Google官方的Maven库,如下图
在这里插入图片描述

接下来将如下命令写入hands module的build.gradle

// 加载libs中的jar和aar
implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])

// MediaPipe deps
implementation 'com.google.flogger:flogger:latest.release'
implementation 'com.google.flogger:flogger-system-backend:latest.release'
implementation 'com.google.code.findbugs:jsr305:latest.release'
implementation 'com.google.guava:guava:27.0.1-android'
implementation 'com.google.protobuf:protobuf-javalite:3.19.1'

// CameraX core library
def camerax_version = "1.0.0-beta10"
implementation "androidx.camera:camera-core:$camerax_version"
implementation "androidx.camera:camera-camera2:$camerax_version"
implementation "androidx.camera:camera-lifecycle:$camerax_version"

// AutoValue
def auto_value_version = "1.8.1"
implementation "com.google.auto.value:auto-value-annotations:$auto_value_version"
annotationProcessor "com.google.auto.value:auto-value:$auto_value_version"

到这一步,我们就已经大功告成,直接运行就行了,就把Maven库替换为我们自己的aar了,以后我们自己对代码的修改都可以自己编译aar。Google也建议我们自己编译aar,因为他们没有出满足所有需求的统一的aar。

注意:此时使用的CameraX版本是"1.0.0-beta10",如果将版本更新到最新的“1.1.0-beta01”,因为最新的版本对当前项目最低兼容的minsdk有要求,会出现如下错误。

Execution failed for task ':hands:checkDebugAarMetadata'.
> A failure occurred while executing com.android.build.gradle.internal.tasks.CheckAarMetadataWorkAction
   > The minCompileSdk (31) specified in a
     dependency's AAR metadata (META-INF/com/android/build/gradle/aar-metadata.properties)
     is greater than this module's compileSdkVersion (android-30).
     Dependency: androidx.camera:camera-camera2:1.1.0-beta01.
     AAR metadata file: C:\Users\LX\.gradle\caches\transforms-3\00310ff015e50555669b323da52d8e97\transformed\camera-camera2-1.1.0-beta01\META-INF\com\android\build\gradle\aar-metadata.properties.

意思就是当前最新的CameraX最小编译版本(android-31)大于了我当前Hands module的最大编译版本(android-30)。

我们可以从build.gradle看到我们的targetSdkVersion和compileSdkVersion等于30
在这里插入图片描述
不想解决这个问题,就不更新CameraX,哈哈。

如果你实在是强迫症就想更新,那参考如下解决方式。
1、修改compileSdkVersion和targetSdkVersion为31
2、修改了之后,会告诉你android 12需要显视指定Activity的export属性

Manifest merger failed : Apps targeting Android 12 and higher are required to specify 
an explicit value for `android:exported` when the corresponding component has an intent 
filter defined. See https://developer.android.com/guide/topics/manifest/activity-element#exported for details.

参考链接:日志中是Google的国外官网链接,不科学上网访问不了,请参考android国内官网的链接

在清单文件中,activity的节点显视指定export属性
在这里插入图片描述


二、参考

1、MediaPipe Hands官网文档
2、MediaPipe的GitHub地址


总结

本文仅仅是将MediaPipe Hands的demo运行起来,并且将Google编译的Maven库替换为自己编译的aar,因为如果后续自己有一些需求的变更,可以自己修改代码然后重新生成特别的aar。

提供的引用内容未涉及mediapipe_hands.onnx的详细介绍、使用方法、下载等相关信息。不过可以从一般性角度进行说明。 ### 详细介绍 MediaPipe是Google开发的用于构建多模态应用的跨平台框架,可用于手势跟踪、人体姿态检测等多种任务。而.onnx是一种开放的模型交换格式,mediapipe_hands.onnx可能是将MediaPipe的手部检测和跟踪模型转换为ONNX格式后的模型文件。这种格式的优点是可以在不同的深度学习框架和推理引擎中使用,提高了模型的可移植性。该模型可以对输入的图像或视频帧进行处理,检测出手部的关键点,如手指关节等位置,从而实现对手部姿态的跟踪和识别。 ### 使用方法 一般使用步骤如下: ```python import onnxruntime as ort import cv2 import numpy as np # 加载模型 ort_session = ort.InferenceSession('mediapipe_hands.onnx') # 读取图像 image = cv2.imread('hand_image.jpg') image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # 对图像进行预处理,例如调整大小、归一化等 image = cv2.resize(image, (input_width, input_height)) image = image.astype(np.float32) / 255.0 image = np.transpose(image, (2, 0, 1)) image = np.expand_dims(image, axis=0) # 运行推理 input_name = ort_session.get_inputs()[0].name outputs = ort_session.run(None, {input_name: image}) # 处理输出结果 # 根据模型输出的格式,提取手部关键点信息 # 这里只是示例,具体处理方式需要根据模型实际输出确定 hand_keypoints = outputs[0] ``` ### 下载 mediapipe_hands.onnx可能无法直接从官方渠道下载。一种获取方式是自己将MediaPipe的手部模型转换为ONNX格式。可以使用相关的工具,如ONNX-TensorRT等,将TensorFlow或其他框架训练的MediaPipe手部模型进行转换。也可以在一些开源代码库,如GitHub上搜索是否有已经转换好的mediapipe_hands.onnx模型文件可供下载,但要注意使用的合法性和版权问题。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吃骨头不吐股骨头皮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值