为了能安心追剧,技术宅奶爸都做了些什么……

选自 Medium,编译 机器之心

长期以来,「奶爸」+「萌娃」一直是一个不被看好的组合,甚至有人说,「父爱如山体滑坡」。不信的话,以下都是证据:

人类幼崽似乎是台永动机,在一天 24 小时任何时间段里都有可能向你发难。你能让自己睡个安稳觉的方法看来是在白天消耗他们的精力,因此人们想出了各种各样的方法。

当然,并不是所有的奶爸都这么不靠谱,也有人带起娃来挺正常的,Agustinus Nalwan 就是其中之一。

Agustinus Nalwan 是 Medium 上的一位博主,曾经从事计算机视觉、3D / 动画、游戏开发等方面的工作,目前供职于澳洲最大的汽车交易平台 carsale.com.au。

他有一个两岁半的儿子,名叫 Dexie。Dexie 非常活泼,喜欢动物,尤其是老鹰,经常学老鹰在家里飞来飞去。

孩子的这种举动一般也就引起家长的「哈哈」一笑,但 Nalwan 可不是一般的家长,他一直在尝试用技术增添带娃的乐趣。去年三月份,Nalwan 就开发过一款具有玩具识别能力的系统,可以和儿子互动并根据他手里的玩具播放相关视频。

这个项目帮他拿到了英伟达「Jetson Project of the Month: Qrio – an interactive AI bot」活动的大奖,奖品是一台英伟达 Jetson AGX Xavier。

Jetson AGX Xavier 的配置信息。

这是一种算力不小的开发者套件,曾被京东、美团、菜鸟的无人快递车用作计算核心。鉴于 Jetson AGX Xavier 配置还不错,Nalwan 决定用它来帮儿子做一个新玩具,实现他「展翅高飞」的梦想。

新玩具名叫 Griffin(神话中的狮鹫),最终实现效果是这样的:

当然,奶爸也可以跟着一起玩:

或者自己玩:

这么好的带娃经验当然要分享出来。在最近的一篇博客中,Nalwan 完整地介绍了他打造 Griffin 的完整过程,手头有娃的可以参考一下。

以下是 Nalwan「从零开始」构建整套姿态识别游戏的历程。

物料准备

要实现上图中的效果,Griffin 需要具备以下模块:

- 3D 游戏引擎:借助一个用 OpenGL 写成的飞行模拟器生成带有山脉、天空和 Griffin 的 3D 魔幻世界。

- 人体姿态估计:使用 OpenPose 姿态估计模型和 SSD 目标检测模型来持续检测玩家的身体姿态,作为系统的输入,以控制 Griffin。

- 动作映射和手势识别:将身体姿态转化为有意义的动作和手势,如抬起左 / 右翅膀、左右翻滚身体、起飞等。

- 通信系统:使用 socket 将姿态输入送进 3D 游戏引擎。

以下是整个系统所需要的硬件:

- NVIDIA Jetson AGX Xavier:这是一个 GPU 驱动的小型嵌入式设备,用来运行以上所有模块。它可以通过一个简单的 HDMI 接口支持音视频输出。此外,他还有一个以太网接口,方便联网。你甚至可以插入鼠标和键盘在该设备上进行开发和调试,因为它有一个功能齐全的 Ubuntu 18.04 OS。

- TV(带有 HDMI 输入和内置扬声器):作为游戏引擎的显示器。

- 摄像头:我用的是 Sony IMX327。其实这里只需要 224x224 的图像分辨率,因此也可以选低端一点的摄像头。

- Blu-Tack:把所有硬件拼接在一起。

Jetson AGX Xavier、 IMX327 摄像头和 Blu Tack。

实现

1. 构建 3D 游戏引擎

为了更好地模拟飞行体验,Griffin 系统将以第三人称视角渲染 3D 世界。想象一下在 Griffin 正后方有一个摄像头看着他所看的地方。为什么不用飞行模拟器那样的第一人称视角呢?因为看到鹰的翅膀并同步移动自己的手臂,可以帮助 Dexie 快速学习如何控制这个游戏,并拥有一个更沉浸式的体验。

自行构建 3D 游戏引擎并非易事,可能需要好几周的时间。现在大多数开发者只使用专门的游戏引擎,如 Unity 或 Unreal。但是很遗憾,我找不到可以在 Ubuntu OS/ARM 芯片组上运行的游戏引擎。一种替代方法是找到在 OpenGL 上运行的开源飞行模拟器。这可以保证游戏引擎能在 AGX 上运行,因为它支持 OpenGL ES(OpenGL 的轻量级版本)并且得到硬件加速。如果你不想游戏引擎以龟速运行的话,则这是必要的条件。

幸运的是,我找到了一个满足标准的 C++ 开源飞行模拟器,并做了以下修改:

 我用基于目标的系统替换了基于按键的飞行控制系统。

这样我就可以不时地设置 Griffin 身体的目标旋转角度,之后这一旋转目标将通过手势识别模块自行设置,该模块可以映射 Dexie 胳膊的方向。

 我增强了静态 3D 模型管理,以支持层级结构。

原始的飞机模型是作为一个刚体移动的,它没有移动的身体部位。但是 Griffin 有两个翅膀,需要独立于身体单独运动。为此,我添加了两个翅膀,使之作为身体之上的单独 3D 模型。我可以单独旋转每个翅膀,也可以移动 Griffin 的身体,间接移动两个翅膀。实现该目标的一种恰当方式是构建骨骼动画系统,将身体部位组织为树结构的形式。但是,由于我要处理的身体部位只有三个(身体和两个翅膀),因此我可以选择一种简便的方式。为了编辑鹰和树 3D 模型,我使用了一个免费易用的 3D 编辑工具 Blender。

在 Blender 中编辑鹰的 3D 模型

 我添加了 Griffin 起飞状态的树模型,以及无需重启应用即可重启游戏的游戏状态。Griffin 有两种状态:站立(站在树枝上)和飞翔。

 我利用 libSFML 添加音效播放:当 Griffin 起飞时,会出现鹰的尖啸和风声。

2. 构建人体姿态估计模块

该模块旨在检测来自摄像头输入的人体姿态。

具体而言,我们需要知道左 / 右手肘、左 / 右肩膀、脖子和鼻子的位置,才能驾驭 Griffin 的翅膀和身体,并触发特定的姿势。OpenPose 是一个流行的开源库,并具备大量估计人体姿态、手部姿势和面部特征的 AI 模型。我使用的是人体姿态估计 COCO 模型,以 resnet18 作为骨干特征提取器。该模型可以实时检测 18 个关节点,包括上述我们所需的 6 个点。

COCO 关节点图

这里存在一个大问题:OpenPose 基于 PyTorch 框架构建,在 NVIDIA AGX Xavier 中运行速度很慢(4FPS),因为它无法利用重度优化的 TensorRT 框架。幸运的是,还有一个厉害的工具 torch2trt,它可以自动将 PyTorch 模型移植到 TensorRT 框架中!具体步骤是:安装 OpenPose,将 PyTorch 转换为 TensorRT,下载预训练 resnet18 骨干模型。

为了获取来自摄像头的视频内容,我使用另一个库 Jetcam。只需要四行代码,就可以运行。

人体姿态估计

这样就得到了可以 100FPS 速度运行的人体姿态估计模块!

经过一些测试后,我发现有时候这个模型会将随机对象错误地识别为关节点(假正例,如下图所示),这会给 Griffin 的动作控制带来麻烦。

3. 使用 Amazon SageMaker JumpStart 构建目标检测模型

解决该问题的一种方式是添加一个辅助 AI 模型,用目标检测模块来提供人体边界框,这样就可以排除掉在边界框以外检测到的人体关节点了。此外,这些边界框还可以帮助在一堆人中识别主要玩家,距离摄像头最近的人应该是主要玩家。

在之前的项目中,我手动训练过 SSDMobileNetV2 目标检测模型。这次我选择使用 Amazon SageMaker JumpStart,只需一键操作就可以从 TensorFlowHub 和 PyTorchHub 部署 AI 模型。这里有 150 多个可选的模型,其中就有经过完全预训练的 SSDMobileNetV2。

从 Amazon SageMaker Studio 中启动 JumpStart

在 Amazon JumpStart 中选择 SSDMobileNetV2 后,只需一键操作就可以部署模型。有了目标检测模型后,我可以为边界框以外的关节点添加 exclusion logic,这样假正例就会少很多!

在人体边界框以外的关节点被排除在外

4. 构建动作映射和手势识别模块

该模块对于将人体姿态估计模块检测到的 6 个关节点动作转换为更具意义的输入至关重要。这包括三种直接的动作映射:

飞行时的身体转动:

用于控制 Griffin 飞行时的方向。身体转动可以通过横轴和左右手肘向量之间的夹角进行计算(下图上)。在飞行时,两只翅膀基于这一转动角度同步移动。选择手肘而不是手腕是为了最大化可见度,因为手腕经常会掉出摄像头视角或被其他身体部位遮挡住。

② 站立时的翅膀旋转:

这纯粹是出于美观,为了让游戏更具趣味性,给人一种站立的时候可以单独控制每个翅膀的印象。这通过横轴与肩膀 - 手肘向量之间的夹角进行计算(下图下)。最终的翅膀旋转角度会添加 15 度,以加大翅膀的动作,毕竟人长时间举高胳膊会很累。

身体转动和翅膀旋转时的动作映射

③ 蹲伏:

这是另一个美观动作,可以让人感受到能够控制 Griffin 起飞前的蹲伏姿势。这通过脖子 - 鼻子向量和肩膀向量之间的长度比进行计算。蹲伏得越深,脖子和鼻子之间的距离越短,而左右肩膀之间的距离保持不变,因此长度比变小。

蹲伏动作映射

④ 起飞姿势:

当左右肩膀之间的中心点在一秒内上下移动的幅度超过阈值时,则该动作会被识别为起飞姿势。阈值是肩膀之间的长度。当这一动作被触发时,Griffin 会跳下树枝,开始飞翔。

 游戏复位姿势:

当左右肩膀的水平位置反转时则为游戏复位姿势,如玩家背对摄像头。游戏将复位,Griffin 回到站在树上的姿势,准备下一次飞行。

起飞和复位手势识别

5. 通信系统

现在,我们完成了三个主要组件,只需要将它们粘合在一起就行了。

我们需要将姿态估计模块检测到的人体关节点发送至手势识别模块,这个任务比较简单。但是,将动作和姿势映射结果发送至 3D 游戏引擎就不那么简单了,因为游戏引擎是用 C++ 写的。你可能会疑惑为什么不用 Python 构建 3D 游戏引擎,原因在于没有靠谱的方式来使用 Python 访问 OpenGL。此外,即使可能,我也不想花费好几周时间将 C++ 转换为 Python 代码。

此时我需要以最小花销高效地在这二者之间传递信息。对于游戏引擎而言,最小花销是非常重要的因素,输入控制器和动作发生之间出现 100ms 的延迟都会导致玩家失去沉浸式体验。因此,两个单独应用之间的最好通信媒介是 socket。由于这两个应用在同一台计算机内,因此延迟会在 5ms 以内。

在 C++ 中,我们简单地使用 sys/socket 库,而在 Python 中,我们可以使用 socket 框架。从现在开始,我把手势识别和姿态估计模块称作 Python app,该客户端发送五种信息:roll_target、lwing_target、rwing_target、body_height 和 game_state。把 3D 游戏引擎称为 C++ app,充当监听并不断接收上述信息的服务器。

为了将这五种信息 / 变量正确地从 Python 映射到 C++ 上,在发送之前我们需要将其放置在 Python C-like 结构中。

class Payload(Structure):_fields_ = [(“roll_target”, c_int32),(“lwing_target”, c_int32),("rwing_target", c_int32),("body_height", c_int32),("game_state", c_int32)]

在 C++ app 中,它们以本机 C 结构形式接收。

typedef struct payload_t
{    int32_t roll_target;    int32_t lwing_target;int32_t rwing_target;int32_t body_height;int32_t game_state;
} payload;

从下面的架构图可以看出,通信层由一个位于 Python app 中的客户端模块和一个位于 C ++ app 中的服务器模块组成。

Griffin 的整体架构图

校准与测试

准备就绪后,我设置了 Griffin 系统以执行校准和测试。这套系统的性能要比我预测的好很多,在执行所有实时 3D 渲染和姿态估计时一直都保持在 60FPS 的帧率,看来英伟达的 Jetson AGX Xavier 性能强大不是说说而已。在下面的视频中,你可以看到校准和测试的过程。这个视频帧率较低,是因为我在 Ubuntu 桌面上以 15FPS 录屏,尽量减少对 Griffin 的影响。

Griffin 系统的校准与测试

起飞

最后,是时候让 Dexie 用 Griffin 尝试第一次飞行了,这才是真正的大考。我在客厅里架设好了系统,我儿子一直在不耐烦地等待行动。

Dexie 使用 Griffin 飞行的经历

我只演示了一遍如何控制 Griffin 系统,跳一下就是起飞,展开手臂依靠姿势控制翅膀,Dexie 就学会了。由于游戏是第三人称视角,所以他很快就发现画面中翅膀的运动是直接和自己姿势同步的。随后他就开始享受自己的飞行体验了。没有什么是比你自己更好的游戏控制器了——记住乔布斯在发布第一代 iPhone 时嘲笑手写笔时所说的话。

有意思的是,Dexie 有次快要撞山时,他奋力扬起手臂想要来个急转弯,但由于我设置了最大旋转角度限制,Griffin 不允许他飞特别极限的角度,随后他就撞了山…… 当时是这个样子:

Geek老爸硬核带娃

Dexie 在 Griffin 上的首飞

他上来就玩了半小时,发疯似地挥舞着手臂,直到疲倦袭来。最重要的是,那天晚上他睡得很香,对我们来说这是一次胜利!我有更多时间追剧了 :)

总结

构建这样一套系统让我学到了很多,同时获得的乐趣也很多。总体来说我学到了:

  • Torch2trt 是一个很强大的工具,可以自动将 PyTorch 模型转化为 TensorRT 版,让 AI 模型在 Jetson AGX Xavier 上运行地更快。很多最先进的 AI 模型都是用 PyTorch 构建起来的,但手动将它们移植到 TensorFlow 上可不是好的体验。
  • 英伟达 Jetson AGX Xavier 的性能非常强大!很多人说它可以实时处理 30 个 1080p 视频流的计算机视觉模型处理任务,看来的确是这样。
  • 亚马逊 SageMaker JumpStart 提供了大量流行的 AI 模型,并让它们非常易于部署。
  • 构建 3D 游戏引擎的经历让我重拾之前作为游戏和电影 SFX 开发人员的经历,再次用起了生疏的 OpenGL、C++ 和三角学方面的技能。
  • 说到动作识别游戏,人们自然会想到 Xbox——我本可以用 Unity 引擎和 Kinect 传感器在 Xbox 上构建一个 Griffin,但是这样不就没有太大意义了吗?有时从头构建一套系统才是乐趣所在。
  • 扮演老鹰是一个很累的工作,尤其是长时间抬起手臂这件事。不过真正的老鹰是通过上升气流获得帮助并滑翔在天空中的。

不知这样的一段经历,是否能给你一些启发?最后,作者计划在近期将项目代码开源出来。

参考内容:

https://agustinus-nalwan.medium.com/making-my-toddlers-dream-of-flying-come-true-with-ai-tech-85e40d7144a2

AI图书推荐

▊《集成学习:基础与算法》

周志华 著 ,李楠 译

  • 国内独本剖析集成学习的著作
  • 森林书破解AI实战难题

▊《联邦学习》

杨强 刘洋 程勇 康焱 陈天健 于涵 著

  • 国际首部全面、系统论述联邦学习的中文著作
  • 面向数据安全和隐私保护机器学习学术成果和应用案例
  • 数据孤岛和数据保护难题破解之法

▊《强化学习(第2版)》

【加】Richard S. Sutton,【美】Andrew G. Barto 著

俞凯 等 译

  • 人工智能行业的强化学习圣经
  • 强化学习领域奠基性经典著作!

▊《知识图谱:概念与技术》

肖仰华 等 编著

  • 力求涵盖知识图谱相关的基本概念与关键技术
  • 总结了十多个知识图谱工程项目的落地经验

▊《知识图谱:方法、实践与应用》

王昊奋 漆桂林 陈华钧 主编

  • 揭秘知识图谱全生命周期技术
  • 探索垂直领域知识图谱构建方法与应用落地
  • 促进人工智能从感知时代向认知时代跨越

▊《深度学习500问:AI工程师面试宝典》

谈继勇 主编

  • 系统地描述深度学习的基本理论算法及应用
  • 帮助读者系统地了解整个领域的知识点

用AI「驯服」人类幼崽,手头有娃的可以试试相关推荐

  1. 第四冠!腾讯AI「绝艺」斩获世界智能围棋公开赛冠军

    导语:腾讯围棋AI「绝艺」世界大赛再夺金,三年四冠,砥砺前行! 中国围棋协会主办的2019「中信建投证券杯」世界智能围棋公开赛今天在山东日照落幕.由腾讯 AI Lab 研发.担任中国国家围棋队的训练专 ...

  2. 再三年!腾讯AI「绝艺」与中国国家围棋队续约

    感谢阅读腾讯AI Lab微信号第94篇文章.本文将介绍「绝艺」与中国国家围棋队续约的情况. 腾讯AI Lab研发的围棋AI「绝艺」昨日与中国国家围棋队续约.在过去的两年里陪伴国手们横扫棋坛的世界顶级围 ...

  3. 多图详解 DeepMind 的超人类水准星际争霸 AI 「AlphaStar」...

    雷锋网(公众号:雷锋网) AI 科技评论按:英国当地时间 1 月 24 日,DeepMind 在伦敦组织线上直播,向全世界的游戏 AI 研究人员以及游戏爱好者们介绍自己的 AI 研发最新进展. 参加直 ...

  4. AI「干掉」程序员后,又对艺术家下手了

    几十年前,柯达说出了那句经典的广告语,「你负责按快门,剩下的交给我们」.在未来,AI 兴许也会打起类似的广告,「你什么都不用干,剩下的交给我们」. 人工智能领域缺钱,但这两个月来,他们不缺「好消息」. ...

  5. 旷视AI「炼丹房」Brain++ 再升级!首席科学家孙剑发AI「灵魂」三问

    来源:新智元 [导读]从深度学习算法.计算机视觉算法到AIoT算法,从开源框架旷视天元到AI生产力平台Brain++,旷视十年故事,旷视首席科学家.旷视研究院院长孙剑讲给你听. 万万没想到,我和小伙伴 ...

  6. AI「复活」《延禧攻略》众生相

    金磊 发自 凹非寺 量子位 报道 | 公众号 QbitAI 一部<延禧攻略>,让清朝古装剧在国内大火了一把. 敢爱敢恨的魏璎珞,贤良淑德的富察皇后,深藏不漏的纯妃-- 人物特点各个鲜明,令 ...

  7. 旷视AI「炼丹房」Brain++ 再升级 首席科学家孙剑发AI「灵魂」三问

    万万没想到,我和小伙伴们被旷厂拿去「炼丹」了. 没错,就是这个炼丹炉! 站在炉子中央,各种算法代码眼前飞闪,让我体验了一把时空穿梭的快乐. OMG!真·颅内高潮... 业界认为「炼丹」过程正如算法研究 ...

  8. 泪目!上海00后小伙AI「复活」奶奶,100%还原音容笑貌,却引发巨大争议

    [导读]最近,00后小伙用AI技术和奶奶实现「对话」,数字生命要成为现实了吗? 你有没有特别想念的人?可能ta是你的亲人,也可能是你的伴侣. 无论ta是谁,在我们的回忆中永远有他们的一席之地,他们一辈 ...

  9. 涨粉6万,带货百万,人类幼崽竟靠干饭实力圈粉?

    "可爱""吃货"是视频号馒头小胖墩儿出现频率最高的词,许多用户看到才3岁的馒头小朋友努力干饭的搞笑视频,纷纷被他圈粉了. 2020年11月,馒头麻麻开始在视频号 ...

  10. 数学与 AI「融通」 ,徐宗本院士进行超强“迁移学习”

    来源: AI科技评论  编辑 | 唐里 徐宗本院士在数学与 AI 之间进行了一次超强的"迁移学习". 9 月 21 日至 22 日,为期两天的 CCAI 2019 正在秋意浓浓的中 ...

最新文章

  1. 什么是推理统计(inferential statistics)?
  2. python2 转 python3 代码
  3. aspose.word在某个字后面自动换行_在Arctime里制作字幕如何自动换行?如何添加注释、广告语?...
  4. 数据可视化,必须注意的30个小技巧!
  5. android 获取sim卡,Android 获取手机SIM卡运营商
  6. oracle 12542,TNS-12542: TNS:address already in use
  7. Z-BlogPHP 1.7 Tenet 正式版源码
  8. 同为EA888发动机,迈腾和奥迪A4L,为何差价10万多?
  9. VB打开文本文件各种方法
  10. Redis中的事务和三特性
  11. ST-LINK V2.1 制作(含源码及其原理图)(type-c接口)可以配合robomaster 开发板下载口或者直接用杜邦线连接下载,支持串口调试
  12. 论坛网站进行帖子保存php,PHPwind论坛专用采集器
  13. matlab绘制三维立体图
  14. Java学习之【Object】
  15. 5G通信技术解读:波束成形如何为5G添翼?
  16. html表格中字与字间距如何调整,excel表格字间距怎么调
  17. Git 之三 常用命令:仓库创建、提交、分支等
  18. Wireshark基本介绍
  19. [转载]java图片缩放处理
  20. 算法设计与分析 二叉树

热门文章

  1. Pandas高级教程之:Dataframe的合并
  2. 拼装机器人感想_机器人学习心得总结
  3. windows补丁下载地址
  4. delphi串行通信源码教程
  5. 西北工业大学生态环境学院张文宇课题组博士后招聘启事
  6. 防毒墙APT防护抗DDOS攻击
  7. JavaScript代码如何在VScode进行调试?
  8. 求一个联想扬天M4680N BIOS升级软件
  9. android+3.1.2+imagebutton监听,android Button ImageButton 差别
  10. 奶瓶(beini)破解无线密码流程:安装、抓包、从虚拟机(VMware)拷贝握手包(拷贝到硬盘、U盘)、跑包...