基于卷积神经网络的《黑暗之魂》游戏AI设计
2022-03-09王靖
王 靖
(云南大学数学与统计学院,云南 昆明 650504)
1 游戏画面数据获取与预处理
图像采集以及预处理是计算机视觉技术的基础,其目的是通过目标与背景分离使得处理之后的图像更方便进行特征提取。采集和预处理的方法将会极大地影响计算机对数据的识别能力以及后续模型训练效果。通常来说,计算机视觉技术不仅能够描述具体的图象,同时还能够按照所描述的具体事物,对图象的代表进行分析,对图象的具体内容进行决定。基于人工智能技术的视觉研究,要对控制系统,及其图象等描述的更多内容进行初期景物的分析,以强调二维图象信息,三维景物之间的关系等,图象的理解要将物理规律与景物内容及其相关知识进行有效地联系。
1.1 图像采集
1.1.1 图像采集原理
由于计算机系统对画面的绘制是通过图形接口实现的,所以我们在编程实现自动获取大量图像时,不可避免地要调用系统的接口,对于用于测试的Windows NT系统,使用的接口为DirectX系列,所以我们需要调用相关的动态链接dll库,找到用于截图的接口(即Direct3D11CaptureFrame)实现编程截图。由于高分辨率的图片会导致数据过大,会极其严重地加大计算机的计算量,所以在测试时应该使用窗口模式的低分辨率游戏画面(800×600)来运行,并调高游戏亮度,降低光照特效以免对人物图像产生干扰。在记录下截图的同时,也应该记录下玩家此时的按键,作为训练集的Label[1]。
1.1.2 计算机环境以及软件选择
本文使用Itel Core i7 CPU,使用NVIDIA GTX 1050Ti GPU进行模型训练,软件环境为Windows10下的Python3.10环境,编程工具主要为Visual Studio Code,Tensorflow版本为2.x,游戏版本为Steam平台重制版的最新版本。下文编程环境与此一致,不再赘述。
1.2 图片预处理
1.2.1 图片的裁剪与边缘检测算法
由于我们需要获取人物HP(血量),所以我们需要裁减得到游戏的血条UI部分(即整个像素矩阵的400×150部分),并利用边缘检测算法得到剩余血量占比。在边缘检测算法中,常见的有整体嵌套边缘检测,快速边缘结构森林等,但基于计算量和性能的考虑,使用的是下面介绍的Canny算子。基于Canny算子的边缘进行检测分析,共涉及5个基本步骤,依次包含有高斯滤波、像素梯度计算模式和孤立弱边缘的抑制等。
(1)高斯滤波:其中对于高斯核来说主要具有x和y两个基本的梯度,对应高斯函数如下所示:
高斯滤波,即可利用一个尺寸型的二维高斯核心进行图像的卷积累分析,结合数字化的图像分析内容,实现离散矩形分析,这样连续性的高斯函数就变为离散近似型的,通过离散数据的采样,完成归一分析。
(2)使用Sobel算子计算像素梯度,Sobel算子是两个3×3的矩阵,分别为Sx和Sy。前者用于计算图像x方向像素梯度矩阵Gx,后者用于计算图像y方向像素梯度矩阵Gy。具体形式为
式中,*为互相关运算;I为图像灰度矩阵。需要说明的是,图像矩阵坐标系原点在左上角,且x正方向为从左到右,y正方向为从上到下。则有
可以得到梯度强度矩阵Gxy。
(3)非极大值像素梯度抑制。对应的非极大像素梯度抑制分析,消除对应边缘检测所带来的杂散响应,并具有边缘性的“瘦身”作用,其基本处理方法是基于目前像素强度与沿着正负梯度的正向强度进行比较和分析的,则可保留对应的像素边缘点,若不是最大,则可进行抑制,不可作为抑制点,为了更加精确的分析,可按照跨越的梯度方向进行相邻像素点的线性位置的比较和分析。
(4)阈值滞后处理。梯度的强度要低于低阈值,像素点才能够被抑制,不可作为边缘点使用。
(5)孤立弱边缘抑制。通常而言,由真实边缘引起的弱边缘像素点将被连接到强边缘像素点,而噪声响应则未连接。通过查看弱边缘像素及其8个邻域像素,可根据其与强边缘的连接情况来进行判断。一般可定义只要邻域像素其中一个为强边缘像素点,则该弱边缘就可以保留为强边缘,即真实边缘点。
1.2.2 颜色空间扁平化
由于三色RGB颜色空间在计算时会形成三维张量,会加大处理机的压力,所以我们需要通过色彩空间扁平化将RGB空间变换为灰度信息A,这个灰度值介于[0, 255]之间。使用公式A=0.299R+0.587G+0.11B即可完成变换,随后我们加大每一个像素相对于整个画面平均灰度的标准差,从而加大图片对比图以突出主体,变换公式为A*=A±1.3σ。
1.2.3 采用Grab Cut算法提取图像主体
GrabCut该算法利用了图像中的纹理(颜色)信息和边界(反差)信息,只要小量的用户交互操作即可得到比较好的分割效果。其核心思想是把图像转化为对应的网络加权图后,把图像问题转化为求解图的最小割。
2 AlexNet及其训练
2.1 Adam优化器
Adam算法,即一种对随机目标函数执行一阶梯度优化的算法,该算法基于适应性低阶矩估计。Adam算法很容易实现,并且有很高的计算效率和较低的内存需求。Adam算法梯度的对角缩放具有不变性,因此很适合求解带有大规模数据或参数的问题。该算法同样适用于解决大噪声和稀疏梯度的非稳态问题。超参数可以很直观地解释,并只需要少量调整。Adam算法与其他一些相类似的算法,其收敛速度在在线凸优化框架下达到了最优。经验结果也展示了Adam算法在实践上比得上其他随机优化方法。Adam是一种有效的随机优化方法,它只需要一阶的梯度,并且只需要很小的内存。该方法通过第一,第二梯度的估计,计算不同参数的自适应学习速率。
基于这些原因,本文在优化损失函数时候使用的优化器为Adam,下面是该优化算法的具体运行过程。
(1)给定超参数,α作为学习率,β1、β2作为矩估计,记f(θ)为待优化的函数,ε为一个很小的数。
(2)随机初始化θ的初始值θ0,一阶矩m0,二阶矩m1,时间步t初始化为0。
(3)更新时间步,也就是t←t+1。
(4)求出f(θ)在θ处的梯度gt,记作gt=▽θf(θt-1)。
(5)更新mt,更新公式为mt←β1mt-1+(1-β1)gt。
(6)更新vt,更新公式为vt←β2vt-1+(1-β2)gt2。
(9)更新θt,θt←θt-1-α。
(10)不断重复(3)~(9)的步骤直到收敛。
2.2 在Tensorflow框架下的实现
我们将游戏角色的行为简化分为如表1所示四种,是把这组向量当作整个卷积神经网络输入灰度矩阵后的输出。
表1 游戏角色行为
然后选定Adam优化器进行训练。在20个epoch里选择100个batch进行迭代,可以看到随着训练次数的下降,Lose Function的值不断下降。这里选择的Lose Function是整个分类的交叉熵,这个值可以反映Shannon信息论中两个概率分布间的差异性信息。公式如下:
式中,p(x)为真实概率分布,也就是Label中相应分量的值的值;q(x)则是我们估计的结果相应分量的值。
3 模型的实际测试效果
3.1 测试原理
在游戏过程中,我们可以通过不断获取截图,让之前训练的模型进行预测从而给出此时应该做出的操作,并通过Python语言编程实现模拟键盘相应的按键按下操作,即可测试我们的游戏AI的实际效果。
3.2 在敌人攻击时的持盾防御以及向后翻滚
图1 AI的举盾防御
我们在游戏的初始地区罗德兰,通过敌人“游魂”进行测试。可以发现,在模型捕捉到画面中的敌人有攻击趋势时按照一定的概率让玩家采取了防御或向后翻滚的躲避策略。
3.3 在敌人非防御状态下的主动攻击
我们在游戏的初始地区罗德兰,通过敌人“游魂”进行测试。可以发现,在模型捕捉到画面中的敌人在非防御状态下会主动对敌人进行攻击。
图2 AI的攻击行为
4 结束语
近年来,GPU处理速度的极大提高,机器学习和深度学习算法可获取的巨大数据量。机器学习对游戏的开发方式产生巨大影响,视频游戏开发越来越多地将机器学习作为游戏开发中的有用武器来智能地动态地响应玩家的动作。本文以《黑暗之魂》为例,展示如何利用深度学习技术让角色实现自动化和自适应的攻击与防御,塑造更加接近于人类行为的虚拟角色。研究之中的主要研究结果如下:一是通过Canny算子边缘检测方法,实现了将游戏UI变为具体数值。并通过颜色空间的压缩,对比度提高,将图像所占用内存大幅度降低,并更利于特征提取。使用Grab Cut方式实现了交互式的图片主体提取。此步的主要意义在于为模型的训练得到了大量数据。二是构建了卷积神经网络,在基于深度学习的模型研究中,选择AlexNet作为基础模型,微调模型的超参数,最终实现了误差函数的显著下降。三是将程序放在实际游戏环境中进行测试,展现了本论文提出的游戏AI确实可以模拟玩家在游戏中的部分行为。