原作:Abe Haskins
安妮 编译整理
量子位 出品 | 公众号 QbitAI

在这篇教程中,谷歌工程师Abe Haskins用简洁易懂的语言,教你用Unity3D和TensorFlow生产一只会投篮的AI。

不少人表示,文章中的这些gif图能看一天!教你用AI秒杀NBA球员的校车马上就要发车了,还不快准备上车?

准备阶段

在开始正式训练前,先检查下自己是不是准备好了下面这些工具:

  • 模拟篮球和物理环境Unity

  • 用于训练模型的Node.js和TensorFlow.js

  • 通过ML-agent asset包将模型嵌入Unity的TensorFlowSharp

  • 将TensorFlow.js转换成Unity中可用图的tsjs-converter

  • 将线性回归简单可视化的Google Sheets

所需工具就是这些了,接下来我将手把手教你解释清楚这些工具是怎样应用的。我建议大家先去将开源代码下载下来,方便后续的学习和理解。

代码地址:

https://github.com/abehaskins

明确目标

把目标想得简单些更有利于完成目标,我们可以把这个任务想象成:如果投球手距离篮筐的距离为x,用y程度的力度投球则会进球的简单问题。

这样一想是不是觉得模型都简单了好几度?如果你对如何在Unity中制作更复杂的AI感兴趣,你可以从Unity中查看完整的ML-Agents项目。

ML-Agents项目地址:
https://github.com/Unity-Technologies/ml-agents

篮筐和球

在这个游戏中,我们只需要投篮就好了。首先需要用到的就是Unity,你平时打游戏时看到的那个立方体的logo就是Unity的标志。它是一个游戏引擎,可以为所有平台构建2D和3D游戏。



Unity内置物理世界系统,还包括基础3D建模和脚本运行时(Mono),支持用C#编程。

把球场的大环境拼接起来并不复杂:

没错,图中的红色块就代表玩家。模拟篮筐上设置有隐形触发器,帮助检测小球通过篮筐的具体时间。

触发器使用教程:
https://unity3d.com/cn/learn/tutorials/topics/physics/colliders-triggers

如上图所示,在Unity编辑器中,肉眼可见绿色的隐形触发器。可观察到触发器分为上下两个,这样就能计算出球从篮筐顶部到底部落下消耗的时间。这两个触发器可在/Assets/BallController.cs中的OnTriggerEnter中查看。

上下都有触发器的另一个好处就是,可以据此判断小球的材料,帮助掌握distance和force.y两个核心变量。

投篮

打开/Assets/BallSpawnerController.cs,这是一个负责生产篮球并试图投中篮筐的脚本。你也可以在Shoot()结尾处查看这段代码。

不知道你有没有注意到,Instantiates代码处表示了一个全新的实例,可以在此处设置投篮的力度和距离篮板的距离。

如果你是在/Assets/BallController.cs处打开的,可以查看Start()方法,之后在加入新篮球时会在此用到这段代码。

换句话说,我们创建一个小球,然后给它一定大小的力,设置30秒后球将被自动销毁,来确保我们能处理源源不断新出现的球。

设置好一切后,我们看看自己的这个全明星投篮手是如何投篮的。你可以点击Unity编辑器中的播放按钮,我们会看到……

百发百不中!

为什么会出现这样的情况?答案就在于Assets/BallController.cs代码中float force = 0.2f这一行。这条线让所有球的行动轨迹保持一致,所以出现了一发都没进的惨烈结局。

当然~这不是我们想要的,所以我进行了下一步的与探索。

随机投篮,收集数据

我们可以通过简单将力量变为随机的方式,引入一些随机噪音。

这样就能推测出,能够投中的力度是什么样的。当然这需要一些时间~

如图所示,红色代表没有投中的球,绿色代表已经入篮的球。此时,任何力度的投篮都是我们可以使用的数据点,下面也会谈到这些。

同时,我们需要考虑到,我们希望红色的小球能从任何位置成功投篮,因此我们需要的不仅仅是只从一个地方投篮。在Assets/BallSpawnController.cs位置中,查找这些行并去掉MoveToRandomDistance()即可解决这个问题。

这样,如果我们再次运行,就可以看到红球在每次投篮后都能在球场上热情地跳跃。

随机运动和随机力量的结合创造了一种非常奇妙的东西:数据。如果此时查看Unity中的控制台,你能看到每次投篮时记录的数据。

每次成功投进都会被记录,并且到目前为击球的数量,距离篮筐的距离以及击球所需的力量都可查看。这些数据提升的速度比较慢,我们可以将MoveToRandomDistance()中的参数0.3f(每次投篮的延迟为300毫秒)改成0.05f(延迟50毫秒)。

现在,看看我们参数调试后的结果:

有没有发现,这其实是个不错的训练方式,系统显示成功率为6.4%了。下一步,我们准备将这些数据从Unity中提取出来,并构建一个模型预测所需要的力量。

预测、模型和回归

在用到TensorFlow之前,我们先让Unity环境中的红球完成大约50次命中。

此时如果查看Unity项目的根目录,则应该能够看到一个名为successful_shots.csv的新文件。这是来自Unity的原始转储,我们把这份数据导出来,以便在excel中分析它。

这个.csv文件只有三行,index,distance和force。我在谷歌表格中导入这个文件,创建了带趋势线的散点图,这样就能了解数据的分布情况了。

这些点组合起来可以发现一些规律。y轴为力度、x轴为距离。可以看到,所需的力与投篮距离之间有明显相关性,也有一些例外情况。

是时候让TensorFlow登场了,帮助我们用类似的代码创建更复杂的模型。比如,在一个完整的游戏中,我们可以涵盖进一些新功能。

现在需要创建我们的TensorFlow.js模型了。

在你喜欢的编辑器中打开tsjs/index.js文件,这是一个基于数据训练模型的脚本successful_shots.csv。训练和保存模型的方法如下:

我们从.csv文件中加载数据创建一些列x和y坐标点,让模型学会服从这些数据,之后,保存!

遗憾的是,TensorFlowSharp并不接受Tensorflow.js可以保存成的模型格式,需要我们做些翻译工作才能将模型引入Unity。

一般来说可以将TensorFlow.js Format转化为Keras Format,创建一个检查点;我们也可以将它们与Protobuf Graph Definition合并,创建检查点。

现在,我们看看在Unity里Assets/BallSpawnController.cs下的GetForceFromTensorFlow()中的模型是什么样子的。

比赛日

利用上面已经完成的系统,我们在模型上创建了一写变体,在训练500次时,模拟篮球的运行轨迹是这样的:

正确率提升了10倍!

这还只是训练500次的结果,剩下的交给你了~别忘了回头看看我最后生成的结果,这是多么可爱的游戏啊~

传送门

博客原文地址:

https://medium.com/tensorflow/tf-jam-shooting-hoops-with-machine-learning-7a96e1236c32?linkId=54634097

开源代码在此:

https://github.com/abehaskins

祝你好运~

作者系网易新闻·网易号“各有态度”签约作者

加入社群

量子位AI社群18群开始招募啦,欢迎对AI感兴趣的同学,加小助手微信qbitbot8入群;

此外,量子位专业细分群(自动驾驶、CV、NLP、机器学习等)正在招募,面向正在从事相关领域的工程师及研究人员。

进群请加小助手微信号qbitbot8,并务必备注相应群的关键词~通过审核后我们将邀请进群。(专业群审核较严,敬请谅解)

实习生招聘

量子位正在招募活动运营实习生,策划执行AI明星公司CEO、高管等参与的线上/线下活动,有机会与AI行业大牛直接交流。工作地点在北京中关村。简历欢迎投递到quxin@qbitai.com

具体细节,请在量子位公众号(QbitAI)对话界面,回复“实习生”三个字。

量子位 QbitAI · 头条号签约作者

վ'ᴗ' ի 追踪AI技术和产品新动态

手把手教你训练一个秒杀科比的投篮AI,不服来练 | 附开源代码相关推荐

  1. 实战|手把手教你训练一个基于Keras的多标签图像分类器

    图片来自 pexels,作者:Jean-Christophe André 2019 年第 63 篇文章,总第 87 篇文章 原文链接:https://www.pyimagesearch.com/201 ...

  2. 卷积神经网络训练准确率突然下降_详解卷积神经网络:手把手教你训练一个新项目...

    作者:Tirmidzi Aflahi 原文链接:https://thedatamage.com/convolutional-neural-network-explained/Tirmidzi Afla ...

  3. 手把手教你训练一个神经网络,打爆21点!

    转载自:大数据文摘 今天 大数据文摘出品 来源:Medium 编译:张卓骏.灿灿.王转转.李雷 21点又名黑杰克(Blackjack),起源于法国,已流传到世界各地,有着悠久的历史. 现在在世界各地的 ...

  4. Blender图解教程:手把手教你做一个马里奥金币 之 高模烘焙法(附模型下载 4月23日更新)

    本文是<[手把手带你Godot游戏开发 第二弹]名场面临摹>中马里奥·奥德赛教程的一部分. 文章目录 效果图 1. 低模 2. 高模 3. 烘焙法线贴图 a. 为低模添加材质 b. 设置窗 ...

  5. 独家 | 手把手教你怎样用Python生成漂亮且精辟的图像(附教程代码)

    作者:Fabian Bosler 翻译:车前子 校对:吴振东 本文约4800字,建议阅读15分钟. 本文将介绍如何利用Python生成图像并将结果做出可视化分析. 在上周的文章<用python从 ...

  6. 手把手教你写一个生成对抗网络

    成对抗网络代码全解析, 详细代码解析(TensorFlow, numpy, matplotlib, scipy) 那么,什么是 GANs? 用 Ian Goodfellow 自己的话来说: " ...

  7. 手把手教你写一个中文聊天机器人

    本文来自作者 赵英俊(Enjoy) 在 GitChat 上分享 「手把手教你写一个中文聊天机器人」,「阅读原文」查看交流实录. 「文末高能」 编辑 | 哈比 一.前言 发布这篇 Chat 的初衷是想和 ...

  8. 手把手教你完成一个数据科学小项目(9):情感分析与词云

    前言 请先阅读"中国年轻人正带领国家走向危机",这锅背是不背? 一文,以对"手把手教你完成一个数据科学小项目"系列有个全局性的了解. 本系列代码统一开源在Git ...

  9. python手机版做小游戏代码大全-Python大牛手把手教你做一个小游戏,萌新福利!...

    原标题:Python大牛手把手教你做一个小游戏,萌新福利! 引言 最近python语言大火,除了在科学计算领域python有用武之地之外,在游戏.后台等方面,python也大放异彩,本篇博文将按照正规 ...

最新文章

  1. DeepMind发布神经网络、强化学习库,网友:推动JAX发展
  2. Struts+2权威指南--基于WebWork核心的MVC开发源码下载
  3. 201C Fragile Bridges
  4. 学习python之序言
  5. Spring快速入门及深入
  6. mysql 登录及常用命令
  7. 【自动控制原理】渐进稳定与临界稳定的区别与联系
  8. 手把手教您:iOS 6.1~6.12 完美越狱教程
  9. mac ios 远程桌面连接到服务器配置,手把手教你苹果mac如何远程桌面连接
  10. eos区块链 java客户端_分享一个网友第一次开发EOS区块链总结的经验
  11. android 拍照申请权限,Android拍照6.0以上动态获取权限
  12. css实现图片毛玻璃效果
  13. 应用程序无法正常启动0xc00007b的解决(二)
  14. win10环境下Android SDK下载安装及配置教程
  15. Artemis客户端安装
  16. 什么是URL,URI或URN?
  17. 蓝鲸智云6.1软件单机部署安装教程
  18. BZOJ1064:假面舞会(DFS 思维)
  19. windows 操作系统种类
  20. 联想小新14Pro Ubuntu20.04 键盘失灵

热门文章

  1. Java JDK 10:下一代 Java 有哪些新特性?
  2. oracle 对象类型是什么意思,Oracle-对象类型
  3. java语言在线编译器的设计与实现,已获万赞
  4. 想搞定大厂面试官?4面阿里拿到P7Offer通用流行框架大全
  5. 记一次 GitHub 出现 ^M 符号的解决办法
  6. 第 1 章 JVM 和 Java 体系架构
  7. java 锁表后事务提交_关于synchronized锁在Spring事务中进行数据更新同步,仍出现线程安全问题...
  8. ubuntu20.04安装mysql_Ubuntu 20.04安装MySQL 8.0.20记
  9. Linux内核kernel升级失败,2.4.19的kernel升级问题!
  10. python的知识点运用_Python基础知识点