3

游戏中的图像识别:CV的新战场

 3 years ago
source link: https://segmentfault.com/a/1190000040377189
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

概述

CV(Computer Vision)在现实世界的应用相对比较成功,如日常生活中的人脸识别,车牌识别,指纹比对,电子稳像,行人,车辆的跟踪,等等。那么在其他领域呢,比如大家常玩的手机游戏,CV又可以有哪些应用呢?游戏场景的图像和现实场景的图像还是有差别的,有些游戏的场景相对比较复杂,如特效干扰、游戏人物不似真人一样有规则,艺术字体也不像车牌一样字体固定,并且有统一底色等等;有些元素是相对比较简单的,如游戏中的固定位置的固定图标等等。简单的游戏元素可以用传统图像检测的方法,也可以取得比较好的效果。本篇文章,将带领大家一起分析常见的游戏场景的识别。

1. 处理流程

游戏场景的识别可以主要分为两个模块,GameClient和CVServer, GameClient模块负责从手机或是PC端实时获取图像,并转发给CVServer。CVServer处理收到的游戏图像,结果返给Game Client。Game Client根据需求进一步处理后,再反馈给游戏端。流程如图1所示。

图1游戏场景识别主流程

2. 应用举例

上一小节主要跟大家分享了游戏场景识别的主要流程,这一小节我们将主要分析图像识别在游戏中的应用。

2.1 游戏状态的确定
每个游戏UI称为一个游戏状态。游戏可被认为有很多不同的UI组成。先建立好这些UI的样本库,实时获取一张游戏画面时,比对当前的图像和样本图像,可判断出当前的游戏状态。比对两张图像是否相似的方法很多,这里我们以特征点匹配为例,主要步骤如下:

Step1:样本图像的特征点提取,测试图像的特征点匹配

图2特征点提取

Step2:特征点匹配

图3特征点匹配

Step3:匹配筛选

图4根据ratio-test进行匹配筛选

ORB特征点匹配是相对比较成熟的技术。在采集到的测试数据集中,会因为手机分辨率,刘海或渲染的不同,导致图像的大小或UI渲染位置等差异比较大,常用的模板匹配很难适配这种情况。基于特征点的匹配方案则不会存在这种情况,特征点一般是指图像中的角点,或是显著点。跟图像中物体元素所在的位置和大小关系不明显,所以适用性更强。ORB特征点是将FAST特征点的检测方法与BRIEF特征描述子结合起来,并在它们原来的基础上做了改进与优化。ORB特征点具有旋转不变性和尺度不变性。下面分别介绍特征点提取、特征点描述、特征点匹配和特征点筛选。

2.1.1 特征点提取:FAST

FAST的基本思想,若某像素p与其周围邻域内(1到16),足够多的像素点相差较大,则该像素可能是角点。原始的FAST特征点是没有尺度不变性的,OPENCV中的ORB的实现通过构建高斯金字塔,然后在每一层金字塔图像上检测角点,来实现尺度不变性。原始的FAST也不具有方向不变性,ORB的论文中提出了一种利用灰度质心法来解决这个问题。对于任意一个特征点p来说,定义p的邻域像素的矩为

,其中 I(x,y)为点(x,y)处的灰度值,图像的质心为:

,特征点和质心的夹角,即为FAST特征点的方向:


图5 FAST 特征点图示(图像来自论文:Faster and better: A machine learning approach to corner detection)

2.1.2 特征点描述:BRIEF

BRIEF算法的核心思想是在关键点P的周围以一定的方式选取N个点对,然后把这N个点对的对比结果组合成一个长度为n的二值码串,作为该关键点的描述子。ORB在计算BRIEF描述子的时候,建立的坐标系是以关键点为圆心,以特征点P和取点区域的质心(Q)的连线为X轴建立的二维坐标系。圆心是固定的,以PQ为x轴坐标,垂直方向为y轴坐标,在不同的旋转角度下,同一特征点取出来的点对是一致的,这就解决了旋转一致性的问题。

2.1.3 特征点匹配:Hamming Distance

两个等长二进制串的汉明距离是两个二进制串对应位置的不同字符的个数。ORB中用Hamming Distance来衡量两个描述子之间的距离。

2.1.4 特征点筛选:Ratio-Test

Ratio-Test用来剔除距离比例(最近邻距离/第二近邻距离)近似的模糊匹配点对。这里使用一个参数ratio来控制剔除距离比例在一定范围之外的特征点。由下图所示,可知ratio为0.75左右时,可以把正确匹配和错误匹配情况的最好的分离。

图 7 最近邻距离和第二近邻距离的ratio图,实线为匹配正确时的ratio的pdf,虚线为错误匹配时的ratio的pdf。图像来自论文:D. G. Lowe. Distinctive imagefeatures from scale-invariant keypoints, 2004

2.2 场景覆盖率

基于特征点匹配的方法,也可用在场景覆盖率的应用上。首先是加载核心场景的模板图像,AI在运行过程中会采集大量的游戏运行中的游戏截图。基于这些游戏截图形成的测试数据集,遍历每一张测试数据集,分别基于部分图像的特征点算法匹配核心场景图像和测试图像,全图像的特征点匹配方法匹配核心场景图像和测试图像,最终筛选出匹配结果,过滤得到匹配到的核心场景的图像。通过匹配到的核心场景的图像和数目,推测AI运行过程中的场景覆盖情况。

2.3 游戏中数字的识别

游戏中的数字图像很多,如关卡数,得分数,倒计时数等,我们可以基于CNN的方法对数字进行识别。基于CNN的分类方法很早就被提出,早期比较经典的CNN网络是1998年提出的Lenet网络,Lenet网络采用2层卷积,2层池化层,2层全连接层,最后一层softmax层组成。输入的是数字图像,输出的是数字图像的类别。

图 6 Lenet网络

我们可以先对全数字图像进行分割,分割成一个一个独立的数字,然后通过Lenet网络对每一个数字图像进行预测,输出的数字图像类别即为识别出的数字,最后再对全数字进行组装,得到最后的全数字识别结果。

图 7 数字识别过程

随着网络结构加深,卷积功能的加强,以及GPU和大数据带来的历史机遇,CNN近些年呈现爆炸式发展。而且CNN不仅用于分类,还可以用来对物体检测,即最后一层由原来的输出物体的类别,到输出物体在图像中的位置和在此位置处的物体的类别。我们可以采用折中速度和准确度的算法YOLOV3,并基于工程的图像特征,基于减少网络层个数和减少特征图个数两个方向去优化网络,近一步优化网络速度。

图 9 数字识别和重组的过程

2.4 固定位置固定图标的识别

模板匹配的应用很多,我们就固定按钮的识别,提示信息的识别,卡住状态的检测这三个方面举例说明。游戏主界面中,英雄的技能,装备,操作键等这些按钮一般都是在固定位置。提取按键为可用状态时的按钮图标作为模板,实时获取的游戏界面检测到模板,检测到就说明当前这个按钮可用。游戏AI获取这些按键的信息后,即可采取相应的策略,如释放技能,购买装备等。游戏提示信息也是类似,游戏界面中固定位置出现一些提示信息,如图7中显示的路线指示信息,游戏结束状态(成功/失败)等,游戏运行状态(开始)等。我们先采集这些提示信息出现的位置,以及这些提示图标模板,在游戏实时运行过程中,在出现的位置处,实时匹配是否和采集的图标模板匹配,如果匹配到了,说明当前出现了此提示信息。如匹配到游戏成功图标,则在此局中的AI策略应该给予奖励,相反应该给予惩罚等。

图 10 固定Button的识别

图 11 游戏提示图标的识别

模板匹配的思想是在一幅图像中寻找与另一幅模板图像最匹配部分。流程如图12所示。

图 12 模板匹配的过程

模板匹配的处理步骤如下:

Step1:从原图像的左上角开始,从左向右,从上到下,步长为1,采用滑动窗口的方式,依次去计算模板图像和窗口子图像的相似度。
Step2:把相似结果存在结果矩阵中。
Step3:最终在结果矩阵中找到最佳匹配值,如果越相似,值越大,那么结果矩阵中最亮的部分,即为最佳匹配。
openCV中提供了接口函数cv2.matchTemplate(src, tmpl, method) 进行模板匹配,其中method表示匹配方法的选择。

2.5 基于像素特征的物体过滤

根据各通道颜色值的范围,对检测区域内像素进行过滤,可以得到符合这种颜色特征的目标物在什么位置。

游戏中血条的颜色特征也是比较明显的。如红色血条的R通道值比较大;绿色血条的G通道值比较大; 蓝色血条的B通道值比较大。我们提取血条的颜色特征,根据颜色特征可以过滤出血条像素点,很多像素点组成了血条,计算血条的连通区域,可以知道血条的长度,进而可以知道血量百分比。通过血条像素点的过滤,我们即可知道当前游戏主界面友方单位(绿色血条或蓝色血条),敌方单位(红色血条)的位置属性,血量百分比属性。根据这些属性游戏AI可以采取逃跑,向前攻击,组队等不同的策略。

图 13 血条百分比计算的流程

MOBA类游戏,常在小地图中,出现我方塔和敌方塔。提取塔的颜色范围R(0, 90),G(90, 190),B(110,200)。在小地图范围内,过滤像素灰度值在此范围内的像素点,即可知道我方(敌方)塔在什么位置,以及塔的血量(像素点的多少)。如果小地图中出现了自己的英雄,且自己英雄头像周围有绿色外接圆,我们也可以提取出绿色外接圆的像素值范围R(80, 140),G(170, 210),B(70,110).通过各个通道灰度值过滤出自己英雄在什么位置,进而进行寻路或是策略选择等。

图 14 MOBA类游戏中小地图像素点筛选的应用

2.6 其他
图像识别在游戏中的应用还有很多,比如游戏场景中的行人检测,英雄检测,花屏检测,空气墙,穿模,去重等等。

3 总结

本篇文章主要介绍了图像识别在游戏中的应用,如游戏状态的确定,场景覆盖率的计算,游戏中数字的识别,固定位置固定图标的识别等。希望读者看了本篇文章后,对图像识别在游戏中的应用有进一步的认识。

“UQM 用户质量管理”专业的游戏客户端性能(卡顿、发热、内存/CPU、网络等)和异常(崩溃闪退、ANR、Error)的监测分析平台。借助深度质量的大数据分析,为游戏业务提供全方位的质量监测、数据分析、业务洞察服务。

点击链接:

UQM 用户质量管理丨 WeTest行业领先的质量云服务厂商 了解详情


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK