发布人:本文由 Google AI 的 ML 研究产品经理 Igor Kibalchich 策划撰写
请注意,本文所体现的信息、用途及应用完全是 Video-Touch 客座作者的观点。
您可能看过一些科幻电影,电影中的人可以用身体动作来控制机器人。如今,借助现代计算机视觉和机器人方法,我们能够把这种体验变成现实,而且和电影一样精彩奇妙。
受新冠病毒影响,在如此艰难的时期,为了让远程控制和远程操作变得切实可用,我们开启了 VideoTouch 项目。
Video-Touch 是第一个人机交互系统。它允许多名用户,在世界任何地方通过视频通话应用(例如 Google Meet、Zoom、Skype)对其进行控制。
Video-Touch 系统的实际运用:单个用户在 Video-Touch 通话期间控制机器人。注意抓住试管时传感器的反馈 [源视频]
我们考虑过,是否有可能只用自己的手来远程控制机器人,而不借助手套、操纵杆等任何额外的设备,同时不产生明显的延迟。于是,我们决定使用计算机视觉来实时识别动作,并实时传递给机器人。在 MediaPipe 的帮助下,我们将其变为了现实。
操作系统大致如下:
1. 通过视频会议应用,在用户设备上获取网络摄像头视频,然后将其发送至机器人计算机(“服务器”);
2. 用户的网络摄像头视频串流通过 OBS 虚拟摄像头工具被捕捉到机器人的计算机显示器上;
3. 识别模块在 MediaPipe 的帮助下读取用户的动作和手势,并通过 ZeroMQ 发送给下一个模块;
4. 在动作捕捉数据的基础上,机械臂及其抓手由 Python 控制。
图 2:Video-Touch 系统的整体方案:从用户的网络摄像头到机器人控制模块 [源视频]
从方案中可以清楚地看出,用户在操作机器人时只需稳定的互联网连接和一个视频会议应用。所有的如屏幕捕捉、手部追踪、手势识别和机器人控制等计算,都可以在 Wi-Fi 与机器人连接的单独设备上进行(只是另一台笔记本电脑)。接下来,我们将对流水线的各个环节进行详细说明。
视频串流和屏幕捕捉
用户可以使用任何一台能够实现跨设备传输视频的软件。在实验中,我们使用的是视频会议的桌面应用。用户在其设备上呼叫一台显示器与机器人相连的计算机。这样,机器人就可以看到来自用户网络摄像头的视频串流。
现在,我们需要某种机制来把用户的视频从视频会议传递到识别模块。我们使用的是 Open Broadcaster Software (OBS) 及其虚拟摄像头工具来捕捉打开视频会议的窗口。这样我们就获得了一个虚拟摄像头,它现在有来自用户网络摄像头的帧及其独特的设备索引,可以在识别模块中进一步使用。
识别模块
识别模块的作用是捕捉用户的动作并将其传递给机器人控制模块。MediaPipe 会在此发挥作用。我们为捕捉手部动作寻找了最有效、最精确的计算机视觉软件。我们发现了许多令人兴奋的解决方案,但事实证明,对于如此具有挑战性的任务(实时设备端手部运动精确识别),MediaPipe 是唯一适合的工具。
我们对 MediaPipe 手部追踪模块进行了 两项关键修改:增加了 手势识别计算器 并集成了 ZeroMQ 消息传递机制。
在上次 发表文章 的时候,我们有两个版本的手势识别实现。第一个版本如下图 3 所示,所有的计算均在手部姿势识别计算器内进行。计算器将特征点作为输入进行缩放,也就是说,这些特征点根据手的边界框大小(而非整个图像的大小)进行标准化。接下来,它会识别 4 种手势(另见图 4):“移动”、“倾斜”、“抓取”和“无手势”(论文中的“手指距离”手势是实验性内容,没有包括在最终演示版中),并输出手势类名称。尽管这个版本十分稳健实用,但它只是基于简单的启发式规则,如:“如果此特征点 [i].x < 特征点 [j].x,那么它是一个‘移动’手势”,而且对于手部旋转这类现实生活中的情况,此版本无法识别。
图 3:修改后的 MediaPipe 手部特征点 CPU 子图。注意手部姿势识别计算器(HandGestureRecognition calculator)
为了缓解泛化不良的问题,我们实施了第二个版本。我们在手动收集和加标签的 1000 个关键点的数据集上训练了来自 scikit-learn 的梯度提升分类器:“移动”、“倾斜”和“抓取”类各有 200 个,而“无手势”类有 400 个。顺便说一下,如今可以通过最近发布的 Jesture AI SDK repo(注:我们团队部分成员的另一个项目)轻松获取此类数据集。
我们使用缩放的特征点、关节间的角度以及成对的特征点距离作为模型的输入,来预测手势类。接下来,我们尝试只传递缩放的特征点,而不传递任何角度和距离,结果在 200 个关键点的本地验证集上获得了 91% 的类似多类准确率。对于这个版本的手势分类器,还有一点是我们无法直接在 C++ 中运行 scikit-learn 模型,所以我们用 Python 进行实现,作为机器人控制模块的一部分。
图 4:我们模型所识别的手势类(未显示“无手势”类)
发表后,我们立即推出了一个在 Keras 中训练的全连接神经网络,它采用的数据集与梯度提升模型相同,而得到的结果更好,准确率达到 93%。我们将这个模型转换为 TensorFlow Lite 格式,现在我们可以在手部姿势识别计算器中直接运行手势识别 ML 模型。
图 5:用于手势识别的全连接网络转换为 TFLite 模型格式
得到当前手部位置和当前手势类后,我们需要将其传递给机器人控制模块。进行这一步时,我们借助了高性能的异步消息功能库 ZeroMQ。为了在 C++ 中实现这一点,我们使用了 libzmq 库和 cppzmq 标头。利用 请求-回复 方案:识别模块 C++ 代码中的 REP(服务器)和机器人控制模块 Python 代码中的 REQ(客户端)。
因此,借助我们修改过的手部追踪模块,现在能够将运动捕捉信息实时传递给机器人。
机器人控制模块
机器人控制模块是一个 Python 脚本,它将手部特征点和手势类作为输入,并输出机器人移动命令(在每一帧上)。运行该脚本的计算机通过 Wi-Fi 与机器人连接。我们的实验中使用了搭载 Nvidia GTX 1050 Ti GPU 的 MSI 笔记本电脑。同时尝试在 Intel Core i7 CPU 上运行整个系统,由于有高度优化的 MediaPipe 计算图实现,该运行也是实时的,延迟可以忽略不计。
在目前的流水线中,我们使用了 Universal Robotics 的 6DoF UR10 机器人。由于使用的抓手是双指的,我们不需要每个特征点与机器人手指关键点的完整映射,只需要手中心的位置。借助此中心坐标和 python-urx 软件包,我们现在能够在所需的方位和方向上改变机器人的速度:在每一帧上,我们计算当前手中心坐标与前一帧坐标之差,从而得出速度变化矢量或角度。最后,此机制看起来与人们用操纵杆控制机器人的方式非常相似。
图 6:手型机器人的控制逻辑遵循操纵杆的理念,其运动方向是预定义的 [源视频]
高密度触觉传感器的触觉感知
灵巧的操纵要求具有较高的空间分辨率和对物体和环境的高保真触觉感知。最新的传感器数组非常适合机器人操纵,因为它们可以很容易地挂接到任何机器人末端执行器上,并适应任何接触面。
图 7:高保真触觉传感器数组:a) 数组在抓手上的位置。b) 抓手抓取移液管时的传感器数据。c) 抓手抓取试管时的传感器数据 [源发布文章]
Video-Touch 嵌入了一种高密度的触觉传感器数组。它们安装在双指机器人抓手中。每个指尖上都挂接一个传感器数组。单个电极数组可以感应 5.8 平方厘米的帧面积,每帧分辨率为 100 点。感应频率等于 120 赫兹。每个点的力检测范围为 1 至 9 牛顿。因此,机器人以 200 点的分辨率(每个手指为 100 点)检测施加在机器人手指抓取的固体或柔性物体上的压力。
从传感器数组处收集的数据经过处理后,以动态手指接触映射图的形式向用户显示。压力传感器数组让用户能够感知被抓物体的顺应性、硬度、粗糙度、形状、方向等物理特性。
图 8:多用户机械臂控制功能。用户能够在常规的视频通话过程中执行 COVID-19 检测 [源视频]
尾注
如此一来,借助 MediaPipe 和机器人,我们建立了一个有效的多用户机器人远程操作系统。在未来,远程操作系统的潜在用途将包括医疗检测,以及在难以进入的环境(例如外太空)中进行的实验。该系统的多用户功能解决了有效远程协作的实际问题,允许在多人小组中进行需要手动远程控制的项目工作。
我们流水线的另一个优势特点是,人们可以使用任何带有摄像头的设备,例如手机,来控制机器人。除了机械臂,人们还可以操作其他如,边缘设备、移动机器人或无人机等硬件设备。当然,目前的解决方案具有一定的局限性:延迟时间、z 坐标(深度)的利用,以及手势类型的便利性都有改进的空间。我们十分期待试用 MediaPipe 团队的更新,并期待着尝试新类型的抓手(带手指的抓手)、双手控制,甚至是全身控制(期待“铁甲钢拳”!)。
希望这篇文章对您和您的工作有所帮助。保重身体,坚持编码。非常感谢您的关注!
原文:Video-Touch: Multi-User Remote Robot Control in Google Meet call by DNN-based Gesture Recognition
中文:TensorFlow 公众号