连AI都在看《英雄联盟》游戏直播
打游戏和看人打游戏,都是一种乐趣。
最近,吃鸡主播约战的事情峰回路转,最终还是没能上演。不光有人在游戏里使用外挂,看游戏直播的也有“外挂”,你信不信?这是真的。
观看游戏直播的群里体,现在多了一个特殊观众:AI。
AI在看哪个游戏的直播?不是最近大热的吃鸡,而是吃鸡制作人一直想要超越的巅峰:《英雄联盟》。
AI怎么看?以及为什么要看呢?
Part I:为什么?
为什么一个人工智能要看游戏直播?实际上,直播背后是这样一种挑战——让AI实时理解视频中正在发生什么,以及预测未来会发生什么。
而游戏是最好的训练场之一。因为在游戏环境中,可以生成大量的训练数据,既容易又便宜。所以AI研究人员非常喜欢在游戏领域搞事情。
你应该知道,所谓视频,不过是快速变化的一组图片。速度大约是每秒显示30或者60帧画面。在《英雄联盟》这款游戏中,画面上有队友也有对手,每个玩家控制的游戏角色都不一样。对于一个看游戏直播的AI来说,起码要搞懂这几件事:
英雄是谁?出现在哪?他们攻击力有多强,以及如何攻击对手。
比方对于下面这么画面。
要能像下面这样提取出核心信息。
Part II: 如何做到?
怎么才能做到?先来看看整个流程。
首先引入一个直播视频流,抽出每一帧画面,然后用AI进行逐一分析。这里,通常使用OBS把捕捉的RTMP流,发送到我们的服务器上。
接着一个运行RTMP模块的Nginx服务器,会收集这些数据流。
然后一帧帧的画面被喂给AI,然后神经网络在每一帧画面上完成标注,抽取出游戏对战信息。这个AI运行在GPU服务器上。
简单来说,整个流程就是下面这张图。
Part III: AI的任务
在《英雄联盟》中,有上百种不同类型的英雄,AI需要能够认出他们。
△ 四中不同的英雄
此外每个英雄都是一个能够全方位移动的3D模型,而且每个英雄都有不同的动作,AI需要在各种情况下认出对应的英雄,即便是乱战的背景下。
△ 画面中的英雄会有各种变化
而且AI还需要搞清楚对手的位置。原因很简单,距离跟战斗息息相关。
由于是处理实时游戏直播,所以AI的处理速度得非常快,至少得能做到每秒处理60帧画面,也就是说每一帧的处理时间要在16毫秒之内。
这中间有些处理技巧,比方你可以投入更多的服务器来处理每帧画面。而且最近几年出现了很多处理实时视频的神经网络,直接从中选一个最好的来用就行。
Part IV:YOLO网络
YOLO是一个缩写,代表You Only Look Once。顾名思义,这个算法只看一眼,就知道一帧画面里都有什么(分类)以及都在哪里(定位)。之前的网络都是分两步完成,先进性分类,再进行定位。使用YOLO网络,两步变一步。
下面这个视频中,借用一段007影片,展示了YOLO如何工作。
YOLO网络是由一个传统的卷积神经网络,以及一个非常不同的最后一层以及损失函数组成。在最后一层中,YOLO网络需要包含分类和位置信息。
YOLO网络还需要进一步把输入分割成n×n个网格来描述位置,并在每一个单元上计算输出。
提高YOLO网络位置精度的诀窍是,仅对处于单元中间位置的对象进行预测。由于包含高度和宽度两个参数,所以对象可以跨越多个单元格。这种方法的缺点是,YOLO网络得想办法解决一个网格内的多个对象。解决的办法是复制每个网格中的输出层,这会导致非常大的输出层,参考如下公式:
n×n×m×(4+1+C)
关于YOLO,网上有很多相关资料可以进一步学习。
Part V:训练AI
想让AI干什么,就得用相应的数据训练。上文中的007视频是用现实世界中人和物的数据集训练的,想让AI理解电子竞技的视频流,我们需要用电子竞技视频流中的画面来训练它。
YOLO网络很有意思的一点是,由于它对每个网格都独立进行预测,我们可以用一个英雄来训练网络,当一帧画面中有多个英雄时,只要它们在不同的网格里,网络的操作是类似的。
这大大地简化了训练问题,因为我们我们只需要记录游戏中任何时间点,屏幕上只有一个已知英雄的画面。细节不重要,不过游戏支持训练模式,我们可以指定哪个英雄出现。
我们可以录制一个视频,然后从中提取图像。我们知道有一个已知的英雄,但在做更多工作之前,并不知道英雄出现在画面的什么位置。
输入画面看起来是这样的:
为了获取英雄的位置,我们可以利用它头上有个形状固定且不旋转的红条,也就是血槽这一事实。英雄可以在3D空间移动,但它头顶的红色血槽和他自己的相对位置总是固定的。
但还有一个要注意的小问题,不同画面上的血槽可能看起来不太一样,他可能是空的,也可能是满的,还有一些其他的视觉差异,比如说上面出现的数字。
所以,当我们寻找血槽时,需要一个无论它是满的还是空的,上面数字是什么,都能和它匹配上的特征。
很幸运,血槽周围区域和遮罩(mask)组合起来识别它。遮罩去除了有差异的区域,让一直不变的区域显示出来。
在OpenCV的代码里,就是这样:
cv2.matchTemplate(frame, template, cv2.TM_CCORR_NORMED, mask=mask)
由于视频有压缩,这种匹配永远不能达到完美,但只要我们能让匹配度维持在90%,就能从每一帧画面获取可靠的位置。
找到血槽的位置之后,我们可以断定英雄就在血槽下边。在一帧原始画面上运行图像分析,我们就得到了需要训练AI去识别的位置。
我们在一个小程序中运行图像匹配h器时,能以每秒60次的频率提取输入视频的帧,然后标记出角色和位置。这样,就能很快生成大量的训练数据。
实际上,我们还会选择以慢一点的速度来生成训练数据,每秒忽略一部分图像,这样能让图像之间差异更大。
最后,我们需要用这些输入图像和生成出来的角色、位置标签来训练AI。
我先尝试了用Inception v3模型进行迁移学习,来训练YOLO网络。网络在亚马逊AWS云p2.xlarge机器上,用每一类英雄1000张图的训练数据集训练48小时。
我想说,AWS的AI类服务还是挺贵的,每小时90美分,48小时的训练花了我40美元,几乎是普通服务器成本的10倍。
Part VI:AI表现如何?
我们用一些录制好的视频,试试看效果如何。首先,测试只有一个英雄的画面。
YOLO在这段视频中表现良好。英雄出现在画面中时,能被正确识别身份和位置。没有英雄出现的时候,网络也能正确对待。不错!
不过涉及到多个英雄时,效果就没那么好了。比方下面这段视频,画面中有两个英雄,开始他们相互接近,然后又各自逃开。
当两个英雄重叠时,AI有时只能辨认出一个英雄,而不是两个。坦白说这也不奇怪,毕竟人眼可能都很难弄清楚实际情况。比方下面这帧画面中,应该有两个英雄:牛头酋长(Ali)和盖伦(garen),但AI只能正确认出一个。
还有一个问题。当两个英雄重叠时,AI有可能会把他们认成一个完全不同的英雄。这显然是一个不好的结果。比方下面这帧画面中,虽然只是一秒钟,但AI既没有认出Ali,也没有认出garen,却认为画面中是特兰德尔(trundle)。
当两个英雄分开,识别又正常了。
未来,我们可以有针对性的用重叠的英雄来训练AI。
Part VII:总结和后续
好的一面
- 追踪英雄表现良好。大多数情况下,AI都能判断英雄的角色和位置。
- 速度很快,每帧的处理时间为50毫秒。
- AI可以在一帧内识别多个英雄,即便训练基于单个英雄完成。
- 只在标准的云平台上就能做到这些。
差的一面
- 还处理不好位置重叠的英雄。
- 现在速度虽然不慢了,但想要达到每秒60帧的标准,必须使用多个GPU交错输出。
接下来,还想尝试不同的网络,不同类型的游戏。关键的是,想找到一个真实世界的案例,可以围绕直播视频用AI搭建一个产品。
好吧,今天就说到这里。
大吉大利,中午吃鸡。
— 完 —
连AI都在看《英雄联盟》游戏直播相关推荐
- Docker在英雄联盟游戏中的实践探索(二)
本文讲的是Docker在英雄联盟游戏中的实践探索(二),[编者的话]这篇博客是Riot的Docker实践系列博客的第二篇,主要内容是:基于Cloudbees镜像创建新的Dockerfile,设置了一个 ...
- Docker在英雄联盟游戏中的实践探索(五)
本文讲的是Docker在英雄联盟游戏中的实践探索(五),[编者的话] 这篇博客是Riot的Docker实践系列博客的第五篇,主要讨论了如何从头创建你的Docker镜像. 在以前的帖子中,我们讲解了如何 ...
- hd6630m可以玩lol吗_LOL为什么样我的PING值不高?电脑是联想E520 显卡是ATI Radeon HD6630M 玩英雄联盟游戏的时候会卡...
在上一篇文章中,小编为您详细介绍了关于<整机购买的戴尔台式机可以单独更换显卡么?联想电脑M8500T(台式机)如何加装固态硬盘>相关知识.本篇中小编将再为您讲解标题LOL为什么样我的PIN ...
- mysql英雄联盟卡_hd6630m可以玩lol吗_LOL为什么样我的PING值不高?电脑是联想E520 显卡是ATI Radeon HD6630M 玩英雄联盟游戏的时候会卡......
在上一篇文章中,小编为您详细介绍了关于<整机购买的戴尔台式机可以单独更换显卡么?联想电脑M8500T(台式机)如何加装固态硬盘>相关知识.本篇中小编将再为您讲解标题LOL为什么样我的PIN ...
- Python爬取熊猫TV 英雄联盟游戏分类下面所有主播的人气排行
编写这个原生爬虫项目的3个主要目的: 1.巩固 python 基础知识 2.了解合理的编码规范和方式 3.了解爬虫基本原理 项目分析: 1.爬取网站: 熊猫TV(https://www.panda.t ...
- Docker在英雄联盟游戏中的实践探索(四)
本文讲的是Docker在英雄联盟游戏中的实践探索(四),[编者的话]这篇博客是Riot的Docker实践系列博客的第四篇,主要讨论了如何添加一个基于Nginx的代理容器,以及如何用Compose来管理 ...
- 基于NodeJS英雄联盟游戏游戏综合网站
21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们所认识,科学化的管理,使信息存储达到准确.快速. ...
- lol登录服务器未响应w7,Win7下无法登入LOL英雄联盟游戏的原因及解决方案
在win7系统中玩一些游戏的时候,经常会碰到各种各样的问题导致无法玩游戏,最近有使用win7纯净版系统用户反映说在玩lol英雄联盟登录服务器的时候,无法登入游戏,或者登录客户端之后不能玩的问题,而这种 ...
- Docker在英雄联盟游戏中的实践探索(一)
本文讲的是Docker在英雄联盟游戏中的实践探索(一), [编者的话]Riot将Docker和Jenkins相结合,以此来构建流水线(Pipeline).这篇博客是Riot实践Docker的系列博客的 ...
最新文章
- C和C++安全编码笔记:格式化输出
- 阿里云 centos oracle安装
- 分词之后的如何做特征选择_干货分享!做外贸遇到空运订舱之后走不了如何处理,你知道吗?收藏...
- tcp unity 图片_用 Unity 做个游戏(七) - TCP Socket 客户端
- Linux C 算法分析初步
- Linux 上 安装 nginx、 阿里云服务器上安装 nginx
- ListView中convertView和ViewHolder的工作原理
- 教育部明确!这类人才聘期流出,取消称号和经费!
- X5045的C语言源码,X5045看门狗的单片机源程序和Proteus仿真原理图
- 第43条:掌握GCD及操作队列的使用时机
- CPU负载均衡之EAS
- access通过身份证号提取性别_从身份证号码中提取出生年月,性别等都不掌握,那就真的Out了...
- 微积分:常用公式、微分方程、级数
- 擦窗机器人毕业设计_家庭清洁机器人毕业设计
- 机器学习技法-01-2-Large-Margin Separating Hyperplane
- 计算机网络设备的种类,计算机网络设备选型依据.ppt
- OpenStack-M版(Mitaka)搭建基于(Centos7.2)+++十、Openstack对象存储服务(swift)上
- 不知道如何裁剪视频画面尺寸?这篇文章告诉你如何视频裁剪画面
- python网页关键字查询
- 一个屌丝程序员的青春(一零五)
热门文章
- Simulink代码生成: 使能子系统及其代码
- 元宇宙持续火爆,各地纷纷布局元宇宙
- linux中pe中文名称,原来如此,Linux系统也有PE,不过它叫...
- 一个IT男的500强生涯
- [自习任我行]第二阶段任务跟踪1
- learn.log - 进程管理器fastcgi原理及fastcgi_param详解
- 简单飞机模型静态/模态分析
- 凤凰卫视:专业、互动、持续的云服务助力凤凰新媒体转型
- 2019北京物联网智慧城市大数据博览会开启中国之路
- instr,left,mid 定位、取内容(字符串)函数