安妮 编译整理

量子位 出品 | "大众年夜众号 QbitAI

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

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

手把手教你演习一个秒杀科比的投篮AI不服来练|附开源代码

准备阶段

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

仿照篮球和物理环境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明星公司CEO、高管等参与的线上/线下活动,有机会与AI行业大牛直接互换。
事情地点在北京中关村落。
简历欢迎投递到quxin@qbitai.com

详细细节,请在量子位公众年夜众号(QbitAI)对话界面,回答“演习生”三个字。

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

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