作者 | Wentao Yao, Zixun Sun, Xiao Chen
译者 | 孙薇
编辑 | Jane
出品 | AI科技大本营(ID: rgznai100)
【导读】近日,腾讯三位工程师在arXiv上发表了论文,分析如何利用算法,针对热门手游“王者荣耀”游戏视频进行快速检测与识别,辨识视频中的角色(即“英雄”),以推荐视频给目标受众。为了提取游戏视频标签,需要在游戏视频中检测并识别其中的英雄及其阵营。本文提出了一种有效的两阶段算法,基于血条模板匹配方法检测视频中的所有英雄,再根据阵营分类,然后使用一个或多个深度卷积神经网络识别英雄姓名。实验证明了方法的效率与准确性。
原文链接: https://arxiv.org/pdf/1907.07854
介绍
推荐系统在我们生活中越来越重要,作为其重要组成部分,内容标注在个性化推荐中起着重要作用。热门手游“王者荣耀”有着大量粉丝,除了玩游戏,许多玩家还会花费大量时间观看相关游戏视频。那么,用户在浏览游戏社区时,如何自动推荐其喜爱的视频便成为我们所要解决的问题。准确的推荐会极大激发用户兴趣,并提高用户体验。而标记游戏视频的重要前提,便是识别视频中的英雄。
通常,基于神经网络的目标检测与识别有两种流行算法。一是两阶段算法(two-stage algorithms):首先检测图像中的对象,并获得每个对象的边界框,然后识别各个边界框以获得对象类别。基于卷积神经网络的典型两阶段算法包括R-CNN、SPP Net、Fast R-CNN、Mask R-CNN等。而另一种则是一阶段算法(one-stage algorithms):在一次运行中直接检测并识别图像中的对象,包括SSD和YOLO等。
经过分析后发现“王者荣耀”游戏的英雄有个重要特征,便是血条。所有血条均有相同的外观(包括大小及形状),而唯一区别是血条颜色、生命值与水平。为此,本文将采用两阶段算法。第一阶段,基于模板匹配方法,检测视频中的英雄血条,并获得其边界框列表。第二阶段,训练一个深度卷积神经网络来识别各个边界框,获取英雄姓名。
数据集
经过验证,我们发现不同视频中的血条大小只与视频高度相关,因此我们将数据集中的所有视频转为标准高度,即720px,同时保持其宽高比不变。
为了进行大量训练,我们从一些热门的视频网站上收集了大量游戏视频,其中包括截至目前的所有英雄(共92个)。各个视频包含一个标签,标记其中的主要英雄。针对各个英雄,我们下载了大约4-5个视频,其中尽可能涵盖了此英雄的各种外观和皮肤。
除了外观分类器,框架右下角是主英雄的技能区域,同一个主英雄的技能区域完全相同。我们决定利用技能区域,以及其他两个基于卷积神经网络的分类器进行训练,以提高识别准确性。技能区域的位置并不固定,且随着视频宽高比变化。因此,检测技能区域的算法应调整视频的宽高比。同时,我们使用圆检测算法,基于裁剪的技能区域来检测首技能(即第一个技能)圈。
综上,我们收集三种类型的样本:英雄的外观、首技能和技能区域。
方法
(1)血条模板匹配
将视频中的英雄血条与预定义模板匹配。由于不同血条的生命值、颜色、水平的差异,必须设置遮罩,区分该区域是否用于匹配。
图1(a)用于匹配的血条模板
图1(b)模板遮罩,其中白色像素将用于匹配
针对通道输入的视频帧,先将其转换为灰度图像,然后执行模板匹配。所有输入图像需缩放至标准尺寸(即高度为720px),采用32位浮点图像。由于视频中英雄数量不定,我们需对原始视频帧和相应匹配图像进行观察,如图2:
图2(a)原始视频帧
图2(b)相应的匹配图像
图2(c)匹配图像的局部极大值
在图2(a)中,存在四个血条,在图2(b)中可以找到相对应位置。用恰当半径的极大值过滤器过滤匹配图像,则获得图2(c)。显然,四个极大值的位置对应四个血条。按照像素值降序,取前20个像素可快速处理图像并有效保留血条信息。我们设计了一个函数以计算像素分值,此函数基于两个要素——局部极大像素值,与周围像素的对比度,这两者都利于匹配模板。假设:极大过滤器区域中共有n个像素,将局部极大像素值设为v0,将过滤器中其他像素值设为vi(1≤i≤n),v0≥vi,然后计算:
其中α和β是平衡两部分权重的系数。分数越高,模板匹配的结果越好。排序后取前20,但由于不确定英雄数量,仍需设定一个阈值。
(2)非极大值抑制
英雄血条形状接近矩形,在模板匹配中,水平偏移不会显著减少匹配响应(因为模板水平线上的大多像素仍可以匹配图像中的真实血条像素)。为了避免相同血条出现多个检测结果,我们引入了非极大值抑制。在模板匹配阶段已经获得分值最高的前20个像素,我们按分值降序排序。使用四个属性(x,y,score,is_real_detection)描述每个像素。在非极大值抑制阶段,按照算法1设计抑制算法,其中Tx和Ty分别是水平和垂直偏移的阈值。我们将Tx设为模板宽度的一半,将Ty设为1像素。图4(b)显示了非极大值抑制后的检测结果,修复了所有的错误检测。
算法1非极大值抑制
(3)阵营分类
根据血条颜色,可将英雄分为三个阵营:自己(主英雄)、友军、敌军。由于血条生命值可能很低,我们采用了一种简单的算法,使用血条最左侧位置的平均颜色对血条进行分类。3通道平均颜色表示为(cr,cg,cb),英雄阵营的分类规则如下:
- 对于(r,g,b)中的颜色i,如果ci> 100且ci> 1.5 * cj(j≠i),则血条的颜色为i(绿色代表自己,蓝色代表友军,红色代表敌军);
- 如果没有ci符合上述规则,则:
- 对于(r,g,b)的每个i,如果满足70≤ci≤100,血条几乎为空,无法确定阵营;
- 否则并非血条,取消检测。
应用
为了识别英雄姓名,我们需要训练几个分类器。针对英雄外观,只需在检测到的血条下面为主英雄裁剪一个固定区域,外观图像尺寸为163×163;对主英雄的技能区域,根据视频的宽高比进行位置补偿。在下面的方程式中,带有下标s的变量x,y,w,h指技能区域,带有下标image的变量则指图像。wnorm是指标准化16:9调整后的图像宽度。
为了减少非游戏界面中技能区域的虚假裁剪,只在检测到主英雄时裁剪技能区域,大小为360×360。对于英雄的首技能,我们在提取技能区域的左下角运行圆检测算法。检测到至少一个圆的话,使用最大圆的中心和固定大小来裁剪首技能区域,大小为110×110。
图6:用于训练分类器的典型训练与测试样本
如上所述,我们使用检测算法自动收集培训和测试样本,对每个分类器,我们收集了超过10万的样本。表1列出了训练及测试样本的数量:
用到三种常用的深度卷积神经网络来训练分类器,包括: Inception V3/V4及Inception-ResNet V2,对于每个采样帧中检测到的英雄,通过分类器获得其姓名与可信度分数,再根据英雄姓名累积每个英雄的可信度分数。最终通过选择最高累积可信度分数的英雄来获得最终结果。
图7:英雄检测和识别的整体方案
实验结果
Inception V3 / V4和Inception-ResNet V2网络的输入图像大小均为299×299,使用检测算法提取训练和测试样本。使用平均准确度,将marco-f1和micro-f1作为三种样本和三种网络模型的评估标准。表2中列出了经过训练的神经网络的性能表现。使用Tesla M40 GPU,GTX1060 GPU。
根据表2,我们发现对于所有类型的图像,Inception V3网络优于Inception V4和Inception-ResNet V2网络,Inception V3网络运行速度比图像上的Inception V4和Inception-ResNet V2网络更快,因为其结构更简单,参数更少。每帧中所有英雄的检测时间约为80ms。每个框架中所有英雄的检测和识别的整个过程,包括主英雄的技能区域和首技能区域,对Inception V3网络是200ms,对Inception V4网络是280ms,对Inception-ResNet V2网络是320ms。
从实验中我们发现,在准确性和识别时间方面,Inception V3网络对于游戏视频中的识别任务比其他两个更复杂的网络更好。在任务中我们使用Inception V3作为基础网络。与YOLOv3比较结果如图8,YOLO倾向于仅检测图像中心的英雄,而我们的方法可检测识别图像中的所有英雄。
图 8(a)(b):YOLOv3与我们的方法的比较
(a)YOLOv3模型的检测和识别结果
(b)我们方法的检测和识别结果
虽然该方法表现良好,还是会有失败。最典型的是英雄的新皮肤及新增英雄,需要不断更新模型。
结论
本文为“王者荣耀”提出一种高效准确的英雄检测和识别算法,有助于快速定义游戏视频内容并加注标签和推荐。我们使用两阶段方法检测与识别视频中的所有英雄,这种方式性能上更优于YOLO等一阶段方法,训练和测试样本的工作量却大体相同。未来我们还将探索更多关于游戏视频内容理解的内容,如游戏视频场景识别和类型分类。并将工作扩展到其他游戏,如“英雄联盟”,这将使该算法通用性更强。
(*本文为 AI科技大本营编译文章,转载请联系微信 1092722531)