成立于2005年的Collabora主要从事开源软件的咨询、培训和项目管理,同时是一系列开源软件的贡献者和维护者。这家组织同时是Khronos的成员,并已经发布了开源的OpenXR运行时Monado。
对于这个项目,团队一直在积极实现和优化手部追踪管道。日前,实习生摩西斯·特纳(Moses Turner)撰文介绍了他在2021年夏天时参与相关项目的经历。下面是映维网的具体整理:
作为在Collabora实习的一环,我选择了Monado的手部追踪项目。今天,我将概述我在2021夏天的经历。需要注意的是,团队已从我的撰文描述不断前进,并取得了相当大的进步。最重要的是,这篇文章主要是为了说明在Collabora实习是多么的棒。
我是在项目进行到一半的时候参与其中。当时团队已经完成了模型架构方面的工作,并开发了训练模型的独特技术。对于我加入的时候,团队正在将经过训练的模型部署到Monado。XR的光学手部追踪是一项非常困难的追踪任务。事实上,它涉及获取训练数据,训练神经网络,并将其部署在实时、低延迟的环境中,比如说XR。当我开始工作时, 我对计算机视觉几乎没有什么经验。但是,总有人需要承担起工作。所以,上就上吧。
数个月后,Monado运行着这个手部追踪管道:
使用Valve Index:
使用我定制的North Star设置:
性能不是非常好,但据我所知,这依然是迄今为止适合XR和支持Linux的最佳光学手部追踪。据我所知,我是地球第一个利用Valve Index机载摄像头进行光学手部追踪的人员。
1. 工作原理
1.1 机器学习模型
我们使用了Mediapipe的模型架构,但我们使用自己的训练数据和训练管道。
1.2 使用ONNX运行时而不是Tensorflow-Lite进行推理
我们决定不使用Mediapipe,因为它的C++库非常繁重,并且是使用Bazel构建。如果你想与CMake/Meson兼容,Bazel的恼人可是出了名的。Monado非常轻盈,易于构建,所以两者不是非常合适。
相反,我们使用ONNX Runtime来运行ML模型,这是一个非常好的选择。在我们的测试中,它比Tensorflow Lite快得多,而且它是一个简单的CMake build。另外,它可以与热门开放文件格式,同时是机器学习模型的事实标准ONNX一起运行。使用ONNX使得尝试其他推理平台变得更加容易。在今天这个年代,似乎什么都有办法在ONNX及其本机格式之间来回切换。互操作性+1。
1.3 基于关键点三角剖分的绝对深度
我们的ML模型在“2.5d坐标”中估计手部landmark,其中关键点位置在像素坐标和相对于手腕的深度中预测。模型没有直接说明手相对于camera的绝对深度。这是一个问题,因为我们非常关心相对于camera的绝对深度。
如果你的虚拟手部没有出现在与真实手部相同的位置,并且没有像真实手部一样在空间中移动,你就会觉得非常奇怪,难以使用。所以,我们在两个视图中运行所有模型,找到手部的关键点,并将其扩展为从camera中发出的光线。我们估计每组光线之间最近相交处的每个手部关节。
效果相当好,但抖动可能同样相当明显。
如你所见,抖动相当明显。仅仅使用三角测量尚不够好。考虑到时间短,我们选择了最简单的方法来纠正抖动。
1.4 Euro Filtering
考虑到时间有限,我们使用了One Euro Filter。对于平滑我们充满噪点的样本,这是一种常用的、可以快速实现的方法。作为一种Infinite Impulse Response filter,One Euro Filter储存内部状态(在本例中为3D位置向量),对于接收到的第一个样本,它将内部状态设置成与第一个样本一模一样。然后,在接收到新样本后,它会在其内部状态和新样本之间的某个位置进行插值。
如果插值太接近新采样,则延迟很低,但抖动不会减少太多。如果不进行太多插值,它会相当平滑,但会有很多延迟。所以,我们调整One Euro Filter,使其在手指测量只是抖动时不进行太多插值,但在我们认为手部实际上在移动时进行大量插值。有很多方法可以进行滤波,而One Euro Filter非常容易实现。但在大多数情况下,它们会增加太多的延迟,无法在XR中使用,因此我们已经选择了新的追踪方法。
1.5 其他
我想谈的有很多,下面简单地过一遍:
这个管道使用的机器学习模型并没有推断出惯用手,所以我想出了一个非常巧妙的启发式方法来解决这个问题。对于四个手指中的每一个,它取每个关节指向的方向与下一关节指向的方向的叉积。由于手关节(通常)只向一个方向卷曲,如果大多数叉积指向拇指,我们猜测它是右手;否则,我们猜是左手。这是一种非常愚蠢的方式,但就其本身而言,它的效果却出奇地好。
对于这个管道,在每一帧中都会重新检测所有手。为了找出当前观察到的手和以前观察到的手之间的对应关系,我编写了一个相当复杂的排序方法。
“关键点估计器”(估计手部关键点的神经网络)只估计手上的21个关键点,而忽略了靠近手掌底部的四个掌骨关节。但是,OpenXR的 XR_EXT_hand_tracking需要我们对其进行估计,因此我们只需在近端关节和腕关节之间进行线性插值。
2. 限制和如何解决
2.1 每帧运行检测模型
官方的Mediapipe实现只会偶尔运行一次手部检测模型,然后对于所有后续帧,它会以像素坐标预测新手应该在哪里,只根据过去两帧中预测的关键点进行预测。由于手部目标区域有一点额外的空间,因此预测的目标区域不必完美,只需以合理的规模包含整个手部。因此,当你的手缓慢移动时,这会好得多,因为:
它将每帧的计算量减少了大约60%;
检测模型预测的目标区域存在大量的抖动,使用这种预测方法会更加平滑。
但当你的手移动得太快时,Mediapipe的方法会失败,而我们的方法则不会。这是一种折衷。如果这是一种二分法,正常的Mediapipe方式可能会更好。但事实并非如此。当然,还有第三种选择。
2.2 左右手混在一起
如果你只是完全平放双手,它会弄糊涂。
解决方法非常简单,训练一个对手进行分类的神经网络。
2.3 目标区域定位
Mediapipe的关键点估计模型期望旋转输入图像,使手指位于顶部。所以,如果你把你的手像这样平放会怎么样呢:
嗯,没什么好。你可以看到追踪完全崩溃。问题是,如果手指在中间,旋转变化会很大。它会做点什么,但不是你想要的结果。其他大多数Mediapipe实现都能更好地处理这一问题,但在所有情况下,这都是一个明显的痛点,因为它的失败远远超出了你的预期。另一个简单的解决方法是,我们训练了不期望手在某些特定方向出现的新模型,而它们的效果非常好。
2.5 棘手的拳头姿势
如视频所示,检测模型和关键点模型都以失败告终。我的猜测是,训练数据中没有太多拳头的例子。解决方案非常:只需在训练数据中加入更多的拳头。
2.6 无运动约束
由于我们只是简单地对关键点进行三角测量,如果有一些模型失败,深度可能会大错特错,而且你的手会有数米长。正确的做法是使用某种方法来约束骨骼长度随时间保持不变,同时强制虚拟手指仅以人类手指可以弯曲的方式弯曲。正确地做到这一点很复杂,但今天我们几乎可以做到。
2.7 RGB摄像头的光效较低
许多用于计算机视觉的摄像头,尤其是大多数WMR头显和Quest头显的摄像头都无法提供彩色图像。传感器的每个“细胞”只看到一个光强度值,无法区分颜色。这种摄像头与你熟悉和喜爱的普通RGB摄像头之间的唯一区别是,灰度摄像头在传感器单元上没有滤色器。所以,它们是色盲,但每个传感器都能看到所有照射到它的光。因此,它们可以接收到更多的光,所以我们说灰度摄像头通常比RGB摄像头更“高效”。
在这里,看到尽可能多的光线非常重要。如果太暗,摄像头必须长时间曝光,手就会变得模糊,有时很难区分手指。如果我们训练对灰度图像进行操作的神经网络,我们就可以利用灰度摄像头的更高效率,并能够在更恶劣的条件下追踪手部。
2.8 好于预期,下一步!
考虑到项目这一部分的时间跨度很短,而且我刚开始时知道的很少,所以这个管道能正常工作令这我非常惊讶。我对迄今为止的进展感到兴奋。
自这个夏季项目结束以来,我们将学到的所有知识应用于训练更好的手部追踪管道。我们不想在这里深究,但简单介绍一下不会有什么坏处:
这是我最近录制的一个演示。所有一切都还在进行研发之中,而最终的产品会更好。在它真正成熟之前,我们还有很多工作要做。
3. 要不要试试我们的手部追踪?
当然,我向你展示的追踪性能尚不足以令人感到惊讶,但它是Linux端最好的产品,值得一试。如果你有Valve Index,你可以使用libsurvive构建Monado,并遵循这里的说明。
4. 想在Collabora从事类似的工作吗?
我认为这个项目真的很酷。在过去的四年里,我一直对开源软件、人机界面、计算机视觉以及知识共享无限制的自由非常感兴趣。获得实习机会对我来说是梦想成真。这意味着我可以在压力最小、工作与生活平衡良好的情况下全职从事我真正热爱的工作。
在加入项目之后,我学到了很多新东西。在Collabora,我训练了我的第一个神经网络。从那以后,我一直在学习并直接应用我所能学到的一切知识。在加入Collabora之前,我对Kalman Filters和One Euro Filters只是略知一二,但我从未在现实世界中应用过它们。我原来只是在学习理论,但现在我可以进行实际应用。
如果以上听起来像是随机的技术性话题,这正是目的。在Collabora,我可以毫不分心地深入研究机器视觉问题。
下面看看Collbora的XR团队中正在开展的工作吧:
我们致力于SLAM/VIO,这是一个完全不同的领域!光学手部追踪与SLAM唯一真正的共同点是,它使用相同的摄像头,而且运行速度非常快。
我们开发并维护xrdesktop,这是一个专为与传统桌面应用程序进行空间交互而设计的库。这是完全不同的领域。它的主要关注点不是追踪,而是计算机图形和用户体验。我们在去年夏天已经成功地完成了代码工作。
我们是Khronos OpenXR工作组的积极参与者,并致力于为你带来开放的、跨平台的、可互操作的XR。
当然,我们有Monado,我们正在与开源社区一起构建的OpenXR运行时!
对于XR而言,现在是一个非常吸引人的时刻,有大量有趣的项目等着你。几乎每天我都会出门工作而感到由衷的兴奋。毫无疑问,我热爱我所做的工作,能够在公开场合进行研究真的非常令人惊讶。我有幸知道,它将永远对所有人开放。无论我走到哪里,我都可以自由地使用、应用和讨论我现在正在做的工作。
如果你对软件自由感兴趣,对XR的low level生活感兴趣,我建议你申请成为实习生,或者是向Collabora申请工程职位。我保证你不会后悔,你会遇到一群不可思议的人,并且你会学到很多东西。