导语
2020 年 7 月,我们探讨了 AI 与自动化测试的关系,并向大家介绍了腾讯互动娱乐事业群 TuringLab 团队出版的《AI 自动化测试:技术原理、平台搭建与工程实践》一书。这本书将 TuringLab 团队基于深度学习的自动化 AI 测试框架基础的开发与应用经验详细的展示在读者面前,与读者分享了腾讯游戏是如何将 AI 技术与自动化测试相结合完成测试需求的。在文章推送(超链接:https://mp.weixin.qq.com/s/vKhfddXnWZFXcQmU1734xQAI)后,不少用户留言反馈了对书中提到的 SDK 的浓厚兴趣,并询问如何下载使用。
现在,Game AI SDK 开源版本正式对外发布!欢迎各位开发者下载体验(超链接:https://wetest.qq.com/product/game_ai_sdk)。
本篇文章将用 4k 字左右的篇幅,向读者们详细介绍 Game AI SDK 的相关内容。同时,为了更好的了解用户的使用反馈和意见,TuringLab 团队的技术大佬们创建了技术交流 QQ 群(群号:1095989343),欢迎大家加入。
基于图像的游戏场景自动化框架
一、 概述
在自动化测试领域,针对游戏场景的自动化是一个难点,目前还没有通用的技术方案。这是由于游戏是高度个性化的产品,不同品类游戏玩法差异极大。每款游戏通常都是独立设计开发,游戏开发商也不对外暴露统一的接口,这也意味着传统的基于 API 接口进行自动化的方案在游戏领域并不通用。此外,期待游戏开发商对外提供统一的自动化接口,也是件不现实的事情。
为了支持游戏场景的自动化,基于图像识别和游戏 AI 等方面技术,腾讯 Turing Lab 开发了基于游戏图像的 AI 自动化框架——Game AI SDK。整个方案不依赖游戏开发商提供任何 API 接口,以游戏图像作为输入,以触屏操作为输出,类似于我们人类玩游戏的过程。示意图如下所示:
目前 Game AI SDK 已经在多个品类多款游戏的自动化测试上进行了验证和应用,并取得了良好的效果。一个典型的 AI SDK 应用示意图如下所示:
l 左侧为游戏终端设备,运行待自动化测试的游戏;
l 右侧为游戏自动化框架 AI SDK,根据输入图像决策游戏操作;
l AI Client 连接了游戏终端设备和 AI SDK,从终端设备上实时获取游戏图像,并将 AI SDK 决策的游戏操作转换为触屏操作
二、 AI SDK 架构介绍
1、 技术架构
AI SDK 整体技术框架如下图所示,主要包含 IO Service、Manager Center、UI 自动化、游戏场景识别、AI 自动化等几个模块。
各模块的核心功能如下:
l IO Service
负责 AI SDK 的输入输出控制,输入为游戏图像,输出为点击、滑动等游戏动操作;同时还负责 AI SDK 内部服务状态的上报。
l Manager Center
从 IO Service 接收输入图像,分发给 UI 自动化模块或 AI 自动化模块,并转发 UI 自动化和 AI 自动化的游戏动作输出;同时也负责 AI SDK 服务状态的异常监控等。
l UI 自动化
通过图像识别算法,识别游戏图像中用户配置的 UI 按钮或弹窗,并根据用户配置的 UI 操作,决策出该如何进行 UI 自动化流程,并最终进入游戏场景中。
l 游戏场景识别
根据用户定义的场景识别配置文件,识别游戏场景内的游戏元素(敌人、血条、技能状态、数字等)。场景识别的各项游戏元素的结果,将作为特征数据输入给 AI 自动化模块,具体需要识别哪些游戏元素,根据 AI 需求自行定义。
l AI 自动化
根据场景识别后得到的特征数据,进行 AI 决策,输出游戏操作,游戏操作通常为点击某个像素、在某像素区间滑动。
1、 数据流程
AI SDK 自动化流程可分为游戏 UI 自动化和游戏场景自动化两个阶段,UI 自动化根据用户配置定义进入特定游戏场景,游戏场景自动化则在游戏场景中进行战斗、驾驶、升级等各种游戏自动化操作。两个阶段可以不断循环重复,每个阶段的数据流程如下:
1) 游戏 UI 自动化阶段
l AI Client 从手机端获取游戏图像后,经过 1、2、3 步骤将图像发送给 UI 自动化模块
l UI 自动化模块识别 UI 界面中的按钮或弹窗,决策出需要进行的 UI 操作,并经过 4、5、6 步骤将 UI 动作输出至 AI Client
经过若干次 UI 自动化操作后,游戏从 UI 场景进入到游戏场景,进入游戏场景自动化阶段。
2) 游戏场景自动化阶段
l AI Client 从手机端获取游戏图像,经过 1、2、7 步骤将图像发送给游戏场景识别模块,并识别出游戏场景中各项游戏元素
l AI 自动化模块经步骤 8 获取到识别结果后,根据游戏 AI 算法或特定逻辑规则决策出 AI 动作,经 9、10、11 步骤将 AI 动作输出至 AI Client
经过一段时间的游戏场景自动化操作,游戏场景结束,又返回到 UI 自动化阶段。
三、 游戏场景自动化
由于游戏品类比较多,从格斗游戏、赛车游到 FPS 射击游戏,不同游戏场景的游戏玩法差异极大;游戏画面中的元素包括敌人、道具、怪物甚至卡牌,不同游戏画面中需要识别的游戏元素也存在极大差异。能够适用于多种游戏场景的自动化是 AI SDK 的核心功能,下面主要介绍 AI SDK 针对游戏场景的自动化方案。
1、 游戏场景识别
游戏场景识别模块中提供了模板匹配、梯度模板匹配、特征点匹配、目标检测、深度神经网络等多种算法,识别游戏场景中的游戏元素,并对外输出图像识别结果。具体识别哪些元素,用户可由场景识别配置文件自行定义。在 AI SDK 的场景识别中,主要将游戏中需要识别的元素分为以下几类:
l 固定物体目标
主要采用各种模板匹配算法检测游戏场景中的固定目标物,如游戏中的按钮、图标、技能状态等。该方法会返回场景中检测到的目标物以及像素坐标。
l 形变物体目标
主要采用卷积神经网络检测游戏场景中的图像形状易发生变化的目标物,如游戏角色、建筑物、车辆、怪物等。该方法会返回场景中目标物的位置及类别。
l 像素目标
检测出游戏图像检测区域内满足特定条件的像素点,该方法会返回符合条件的所有像素点集合。
l 数字
该方法会返回游戏场景中检测区域内的数字和其所在的像素位置等信息。
l 血条
该方法会返回游戏场景中检测区域内的血量百分比和血条位置等信息。
在实际应用中,通常我们将一个目标物和几个同类别的目标物定义为一个 task 任务,一个复杂的游戏场景可能包含几十个需要识别的 task 任务。要完成一次场景识别,需要所有 task 任务都完成。游戏场景识别模块的技术架构如下图所示:
1、为了降低任务检测的时间消耗(如果场景识别耗费太多时间,那么场景识别之后进行的 AI 决策就会存在很高的时延,严重制约 AI 自动化的表现),采用了多检测任务并行运行的方式,充分利用多核 CPU 资源。
2、对于采用深度网络模型进行检测的可形变目标物,任务耗时往往比较长,会严重影响每一次场景识别的性能。这里对深度网络模型进行了裁剪优化,减少卷积核数目、减少全连接层神经元个数,在保证识别准确率的情况下,尽量降低深度网络模型的性能开销。
3、针对游戏场景的图像特点,如游戏图像中存在很多的 “半透明” 的情况。即在识别目标物的时候,会受到背景图像的严重干扰,如下面图例所示。在游戏场景中,除了前置的图标不变外,图标的背景会不断发生变化。直接使用常见的模板匹配方法检测这些 “半透明” 目标物都不够理想,针对此类问题,场景识别模块的算法也做了专门的优化。
2、 游戏 AI 自动化
游戏 AI 自动化模块主要从场景识别模块得到识别结果,进行 AI 决策,并输出游戏操作(游戏操作通常为点击、滑动某个像素坐标点或区域)。游戏 AI 是一个复杂的问题,从简单的硬编码规则、状态机、行为树 AI,到模仿学习、强化学习等基于深度学习的 AI,再到蒙特卡洛搜索树 AI,不同类型游戏的 AI 决策往往需要不同的 AI 方法,或者多种 AI 方法来解决。为了便于扩展和支持不同类型游戏的 AI 算法,AI 自动化模块被设计为插件运行模式,不同的 AI 算法以插件的形式实现,并由 AI 自动化模块加载运行。
AI 自动化模块包含两种插件,分别是 Env 插件和 AI 插件。Env 插件主要是获取场景识别的结果,并转化为特定的数据特征,数据特征可以是图像像素值,也可以是其它类型的结构化数据,或者两者的合集。AI 插件主要是游戏 AI 算法的实现,根据 Env 插件转化后的数据特征,进行游戏动作决策。Env 插件和 AI 插件的运行示意图如下:
每一次游戏场景自动化过程中,Env 插件和 AI 插件的运行过程如下:
l 进入游戏场景时,触发 AI 插件的 OnEnter 接口调用
l Env 插件的 IsStart 接口根据场景识别结果,判断游戏场景开始执行时,触发 AI 插件的 OnStart 接口调用
l 之后进入 AI 主循环,AI 插件调用 Env 插件的 GetState 接口获取场景识别结果特征数据,进行 AI 决策,输出游戏动作 action,然后调用 Env 插件的 DoAction 接口执行游戏动作
l Env 插件的 IsOver 接口根据场景识别结果,判断游戏场景结束时,触发 AI 插件的 OnOver 接口调用
l 离开游戏场景时,触发 AI 插件的 OnLeave 接口调用
如果需要扩展新的游戏 AI 自动化功能,按照要求实现 Env 插件和 AI 插件接口即可。为了便于实现插件,AI SDK 中提供了两组 API 接口,分别是 Action API 和 Agent API。其中 Action API 对游戏中常见的各种动作进行封装,直接调用其中接口就可以输出各种游戏动作;Agent API 用于获取游戏场景识别的各项结果,可以方便地获取游戏中各种目标物或按钮、图标状态等信息。值得注意的是,Env 插件和 AI 插件并不是一一对应的关系,如果不同游戏的 AI 算法是一样的,只有特征数据的解析方式存在不一致,那么 AI 插件就可以对应不同的 Env 插件。AI 自动化模块的技术架构如下:
除了提供插件系统及其运行框架外,AI SDK 中还内置了强化学习、模仿学习地 AI 插件和 Env 插件,用户可以直接使用,不需要做任何改动。此外还提供了常见游戏类型的 AI 自动化算法框架,其中已经实现了 AI 插件和 Env 插件的诸多功能。可基于这些常见游戏类型的算法框架,再结合自身的特殊自动化需求,实现 Env 插件和 AI 插件。
在实际的游戏场景自动化中,有以下几点需要注意:
1、 单纯的一个 AI 算法很难满足实际自动化需求,往往需要在 AI 算法之上附加一定的规则,如采用模仿学习 AI+ 少量规则的方式来实现;
2、 为了在游戏场景自动化过程中覆盖更多的情况,可以在特定 AI 算法之上附加一定的随机性,让 AI 能探索更多的场景;
3、 游戏场景识别的结果不能达到百分之百准确无误,针对识别结果做一些简单的过滤或处理,能很好的提升 AI 自动化的鲁棒性;
4、 由于所有的游戏动作最终以模拟触屏的方式执行,控制好游戏动作中触屏的时长、滑动的像素距离都能提升我们 AI 的表现。
四、 应用举例
目前 AI SDK 已经在竞速类、赛车类、FPS 类、MOBA 类、MMO 类等多种类型的游戏场景中进行了自动化验证,取得了不错的应用效果。能够针对多种游戏场景进行自动化测试,且不需要游戏端提供任何接口。一些游戏中的应用效果视频如下:
从运行方式上,AI SDK 可在本地部署运行,进行单独的游戏 AI 自动化测试。如果要进行批量大规模自动化测试,也可以部署在云端,提供线上游戏 AI 自动化测试服务,如下图所示:
五、 总结和展望
本文介绍了基于图像的游戏场景自动化框架,框架的优点是不依赖游戏端提供接口或数据,方案通用性强,可适用于绝大多数游戏场景的自动化测试。且游戏场景自动化插件完成后,随着游戏版本的迭代更新,只要游戏的玩法不改变,已经实现的自动化过程一般不需要做修改,自动化过程维护的成本比较低,不需要随着游戏内部实现的改变而修改。
同时 AI SDK 目前也存在一些问题,尤其在易用性方面,如何让使用者更容易的使用是下一步要解决的问题。虽然 AI SDK 内置了常用游戏 AI 算法,提供了常见游戏类型的 AI 自动化框架模板,可以有效的降低接入新游戏进行游戏场景自动化的成本,但对使用者也有一定能力要求。我们也在尝试将一些简单且通用性强的 AI 自动化过程来通过工具配置的方式让用户来完成,让一些普通用户也能够完成一些场景的 AI 自动化。其次,在场景识别模块,提升目标物识别准确率,对实现 AI 自动化有诸多好处。而在提升识别准确率的同时降低性能开销,也是需要持续优化的问题。
目前腾讯 Turing Lab 编著的关于 AI SDK 及其应用的书籍《AI 自动化测试:技术原理、平台构建与工程实践》已上架可于京东进行购买(超链接:https://item.jd.com/12679219.html#noneAI)。 ADK 也已经对外开源开放,欢迎各位开发者下载体验。(超链接:https://wetest.qq.com/product/game_ai_sdk)
AI SDK 技术交流 Q 群|1095989343
性能测试技术交流群:720150565
查看 PerfDog 详情:https://perfdog.qq.com/?ADTAG=media.dev_website