我开源了个手势匹配框架,让你在模拟器调试 visionOS 手部追踪功能!

2,088 阅读4分钟

说明

本文来自于我在 Let's VisionOS 2024 大会上的演讲,原演讲内容分为两个方面:向量与矩阵基础知识手势匹配框架 HandVector。为了便于阅读,我对原演讲内容进行了调整与简化,改写为了两篇文章《只需三板斧!带你入门 visionOS 空间计算的数学与几何基础》和《我开源了个手势匹配框架,让你在模拟器调试 visionOS 手部追踪功能!》。

可在 此处 获得 Keynotes 的 PDF 版本。

正文

HandVector 是我开源的一个 visionOS 手势匹配框架,目前已支持 SPM,可直接在项目中导入使用。它有两个功能:

  • 手势相似度计算
  • 在 visionOS 模拟器上运行手部追踪与匹配功能

手势匹配的需求

在 Vision Pro 发布之初,很多人就在想象:是不是可以用手势来触发一些效果?比如像火影一样结印,触发特效。但是,visionOS 目前并没有自带这个功能,苹果的机器学习框架 CreateML 暂时也不支持 3D 的手势匹配,所以目前无法在 Vision Pro 上使用。其它第三方的 ML 与 AI 框架理论上能实现 3D 手势匹配功能,但需要自己训练与部署,费时费力且往往运行效率不高。

手势匹配原理:余弦相似度

那有没有其它办法能实现类似 ML 和 AI 的效果呢?这就需要有一些数学和几何知识:实际上 ML 和 AI 判断相似度也是依靠一些数学算法来实现的,比如下面这些算法。

其中比较容易想到的就是 欧几里德距离(欧氏距离)余弦相似度。由于每个人的手大小不同,再加上手指关节多,手势复杂,单纯的计算关节距离并不能很好的判断手势,所以在 单手 的情况下 余弦相似度 才是更适合的手势匹配算法。而余弦相似度的计算并不复杂,它的数学本质就是向量的点乘:点乘的大小反映了两个向量有多“平行”,一般配合归一化(normalize)使用。

所以,我们只需要事先“录制”一个手势,接下来将 手部关节位置 转化为 3D 向量,与录制好的手势向量进行点乘,得到的结果就是当前手势与录制好手势之间的相似度。

模拟器调试功能

考虑到很多用户没有 Vision Pro 真机或者不方便随时随地进行调试,我便想开发一套“假手”调试功能。恰好看到 VisionOS-SimHands 已经实现了类似功能,我便将其接入进来。

VisionOS-SimHands 的基本原理是:

  • 在 Mac 上利用 Google MediaPipe 框架来进行 3D 手势识别;
  • 利用苹果 bonjour 网络服务,将识别到的 3D 手势广播到 visionOS 模拟器中;

注意:这里使用 Google MediaPipe 框架的 Web 版进行手势识别,如果在 Mac 上 START HAND TRACKING 按钮一直是灰色无法点击,请检查你的网络。

Google MediaPipe 结果整合

visionOS 支持手部关节追踪共 27 个关节点,整个手部的根节点位于手掌与腕部连接处,也就是 0 号与 25 号重叠处。

而 Google MediaPipe 手部 Landmark 关节追踪只支持 21 个关节点,且不支持 z 轴方向平移,离镜头近手会变大,远了就变小。

为了弥补这些差异,我首先利用已有关节位置对缺失数据进行补全,又使用经验公式并且将原来手离摄像头近会变大的效果,改为了 z 轴位移,让整体表现与 VisionOS 原生识别到的手势信息更加相似。

数学与几何

关于本项目用到的数学与几何知识,本质是都是最常见的向量与矩阵运算,详见《只需三板斧!带你入门 visionOS 空间计算的数学与几何基础》文章。

感谢主办方的精心组织,也预祝 Let’s VisionOS 活动未来更加美好。