当前位置:千优科技>行业资讯>详情

用AI「驯服」人类幼崽:这个奶爸找到了硬核带娃的乐趣

2021-01-12 23:34:23 浏览:335次 来源:互联网 编辑:leo 推荐:人工智能

为了能安心看几集Netflix剧,技术宅奶爸都做了些什么……

用AI「驯服」人类幼崽:这个奶爸找到了硬核带娃的乐趣

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

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

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

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

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

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

用AI「驯服」人类幼崽:这个奶爸找到了硬核带娃的乐趣

这个项目帮他拿到了英伟达「JetsonProjectoftheMonth:Qrio–aninteractiveAIbot」活动的大奖,奖品是一台英伟达JetsonAGXXavier。

JetsonAGXXavier的配置信息。

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

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

用AI「驯服」人类幼崽:这个奶爸找到了硬核带娃的乐趣

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

用AI「驯服」人类幼崽:这个奶爸找到了硬核带娃的乐趣

或者自己玩:

用AI「驯服」人类幼崽:这个奶爸找到了硬核带娃的乐趣

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

传说中狮身鹰首的griffin。《哈利波特》中的Gryffindor学院意为金色的griffin。

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

物料准备

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

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

JetsonAGXXavier、IMX327摄像头和BluTack。

实现

构建3D游戏引擎

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

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

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

在Blender中编辑鹰的3D模型。

构建人体姿态估计模块

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

COCO关节点图。

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

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

人体姿态估计。

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

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

使用AmazonSageMakerJumpStart构建目标检测模型

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

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

从AmazonSageMakerStudio中启动JumpStart。

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

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

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

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

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

蹲伏动作映射。

起飞和复位手势识别。

通信系统

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

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

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

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

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

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

Griffin的整体架构图。

校准与测试

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

用AI「驯服」人类幼崽:这个奶爸找到了硬核带娃的乐趣

用AI「驯服」人类幼崽:这个奶爸找到了硬核带娃的乐趣

Griffin系统的校准与测试。

起飞

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

Dexie使用Griffin飞行的经历。

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

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

Dexie在Griffin上的首飞。

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

总结

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

不知这样的一段经历,是否能给你一些启发?

最后,作者计划在近期将项目代码开源出来。

标签:AI数据人工智能

版权声明:文章由 www.e1000u.com 整理收集,来源于互联网或者用户投稿,如有侵权,请联系我们,我们会立即处理。如转载请保留本文链接:https://www.e1000u.com/article/10255.html