加入体感控制,这位小哥破解了原版任天堂的拳击格斗游戏「拳无虚发」。
在经典红白机上玩拳击游戏是很多人的童年回忆,其中就包括任天堂 1987 年发布的拳击格斗游戏——「Punch Out(拳无虚发)」。在这款游戏中,玩家的设定是一个拳击小白,需要在教练的指导下战胜各种大块头对手,最后挑战终极大 boss 拳王泰森。当然,泰森本人也玩过这款游戏。随着网游、大型单机等各种游戏的兴起,红白机逐渐退出历史舞台,成了怀旧的代表,早期版本的「Punch Out」也很少有人玩了。但最近,一位名叫 Ian Charnas 的网友又把这款游戏翻了出来,而且自己开发了一种新的玩法——加入体感控制。简单来说,在这款 DIY「拳无虚发」中,你可以借助摄像头和 AI 算法控制游戏中的角色,就像在玩 Switch、Xbox 的体感游戏,但成本几乎为零。为了增加游戏的沉浸感,他甚至在身上绑了个电击臂环,从而在受到攻击时能得到更真实的反馈。那么,这个新游戏是怎么做出来的呢?Ian Charnas 在视频中介绍了几个主要步骤。首先,你要找到一个能进行实时姿态估计的算法。Ian 用的是谷歌的 MoveNet,这个模型能够快速、准确地检测人体的 17 个关键点。接下来就要想办法将游戏从原始的游戏盘导到电脑浏览器上。由于 80 年代的任天堂连 USB 接口都没有,Ian 就先把原始游戏机改装了一番。成功把游戏代码导入电脑之后,Ian 又找了一个任天堂模拟器来运行该游戏。此时,一个体感游戏基本完成。但真正上手玩之后,Ian 发现了一个问题:姿态识别输入比手柄输入要慢,但对手的出拳速度并没有变,这就很难赢。要想赢,要么提高自己的出拳速度,要么拖慢对手的速度,Ian 选择了后者。这就需要修改游戏代码。但「拳无虚发」的原始游戏代码并不是写给人看的:为了读懂这些代码,Ian 对源代码进行了逆向工程(反汇编),并对游戏人物的速度进行逐一修改,使得每一个人物都是可被击败的。在完成这些操作之后,Ian 成功打败了终极 boss 泰森。最后,Ian 还把游戏以及配套的教程放到了网上,点击以下网站、打开摄像头就可以试玩:https://reallifepunchout.com/MoveNet 是个什么模型?
上述进行实时姿态估计的算法用到了谷歌今年推出的 MoveNet 模型,它是一个预训练模型,所以设置好以后即可使用。该模型能够快速、准确地检测人体的 17 个关键节点(如脚踝、膝盖、肩膀、手肘、手腕、耳朵、眼睛和鼻子等),能够以 50+ fps 的速度在笔记本电脑和手机上运行。该模型已在 TF Hub 上提供,有两个变体,分别称为 Lightning 和 Thunder。Lightning 适用于对延迟要求严格的应用,而 Thunder 适用于对准确性要求较高的应用。因此,我们可以看到 Thunder 模型的关键点得分通常会比 Lightning 略高。MoveNet 在两个数据集上训练完成:COCO 和一个名为 Active 的谷歌内部数据集。其中 Active 数据集通过在 YouTube 上的瑜伽、健身和舞蹈视频中标注关键点(采用了 COCO 的 17 个身体关键点标准)而产生。训练时,每段视频不超过三帧,以增加场景和个体的多样性。通过完全在客户端运行该模型的方式可实现对运行速度的需求,即在使用 TensorFlow.js 的浏览器中运行且在初始页面加载后不需要服务器调用,也不需要安装任何依赖项。MoveNet 可以通过快速动作和非典型姿势跟踪关键点。传统方案(上)与 MoveNet(下)在高难度姿态检测上的对比结果,传统方案会跟丢关键点,而 MoveNet 不会MoveNet 是一种自下而上的估计模型,使用热图来准确定位人体关键点。该架构由两个组件组成:一个特征提取器和一组预测头。预测方案大致遵循 CenterNet,但变化明显,提高了速度和准确率。所有的模型都是用 TensorFlow 对象检测 API 进行训练。MoveNet 中的特征提取器是带有附加特征金字塔网络 (FPN) 的 MobileNetV2,它允许高分辨率(输出跨度为 4),此外还提供语义丰富的特征图输出。该特征提取器具有四个预测头,负责密集地预测:人体中心热图:预测人体实例的几何中心;
关键点回归域:预测人体的全部关键点,用于将关键点分组到实例中;
人体关键点热图:预测所有关键点的位置,不依赖于人体实例;
2D 每关键点偏移域:预测从每个输出特征图像素到每个关键点的精确子像素位置的局部偏移量。
MoveNet 模型分四步来完成预测,过程如下图所示:TF Hub 运行:http://tensorflow.google.cn/hub
Lightning:https://hub.tensorflow.google.cn/google/tfjs-model/movenet/singlepose/lightning/3
Thunder:https://hub.tensorflow.google.cn/google/tfjs-model/movenet/singlepose/thunder/3
参考链接:https://blog.tensorflow.org/2021/05/next-generation-pose-detection-with-movenet-and-tensorflowjs.html