“ DamageTrack”:使用计算机视觉从游戏中提取独特见解

介绍

竞争性多玩家视频游戏已成为视频游戏行业的主导部分。 对于休闲玩家,尤其是职业玩家,视频游戏比赛的定量分析对于玩家获得反馈并改善他们的表现至关重要。 如果游戏开放其数据API,以便用户可以访问数据,那将很容易。 但是,数据API并非始终可用。 可以量化游戏玩法的第三方平台将为休闲和专业游戏玩家提供方便。

在2018年春季,我以数据科学研究员的身份参加了Insight数据科学计划。 我有机会向Mayhem咨询,Mayhem是一家直播视频游戏重播视频的公司。 他们拥有用户上传的大量游戏视频,并建立了一个定量分析平台来分析整个游戏中的玩家表现。 他们正在明确开发的游戏是《暴君》,这是暴雪的第一人称射击游戏。 《守望先锋》的目标取决于游戏模式,但不同游戏模式的总体主题保持不变:向敌人射击并尽可能多地造成伤害。 因此,玩家对敌人造成的伤害是玩家的关键绩效指标(KPI)。 但是,无法从视频中解析这些基本信息,因为它不会显示在屏幕上。 我的任务是从非结构化,未标记的视频数据中提取此损坏信息,以便客户可以将其集成到其产品中。 (请注意,游戏中还有其他机制可能会产生损害,但我们仅关注射击造成的损害,即造成损害的主要来源。)

方法

要估算损失,我们首先需要了解射击时发生的情况。 屏幕上有两个与损坏直接相关的对象。 第一个是屏幕底部的仪表指示器。 电能表是一项终极技能的能量计,这是一项强大的技能,并且在电能表装满后将可用。 对于我的任务而言必不可少的是,只要造成损坏,仪表的读数就会增加。 该数字已经从视频中解析出来,并且随时可用。 原则上,我可以将此最终阅读作为对造成的损害的良好替代。 不幸的是,并非总是如此。 根据游戏中使用的角色,可能还有其他因素,例如治愈和自然生成,会增加仪表。 此外,当酒吧充满电或正在使用终极技能时,无法获得仪表读数。 在这段时间里,没有任何关于通过读取仪表造成的损坏的信息。 我们需要找到更通用,更可靠的方式,以便能够推断整个游戏过程中的损坏信息。

此问题导致第二个对象,它是屏幕中间的一个十字。 这是一种旨在向玩家提供反馈的机制。 仅当镜头对准目标时才会显示。 此外,根据实际损坏,它具有不同的长度和颜色。 这是普遍且可靠的,可以预测损坏。 挑战在于建立十字架的定量表示并将该表示映射到所造成的损害。

该策略如下。 我使用十字架作为我们的特征。 为了标记这些功能,我使用最终阅读可以很好地代表损坏我们的训练数据的时间。 通过良好的代理,这意味着可获得最终读数并与损坏成比例。 通过对标记的数据进行训练,可以建立一个模型来建立十字形特征与损坏之间的直接关系。 使用此模型,我们可以通过带有或不带有仪表指示器的十字形特征直接预测损坏。

资料准备

功能工程师

为了捕获十字架的特征,我提取了十字架内或周围不同点的RGB强度作为时间的函数。 我为每个颜色通道设计的功能包括:

1.所有点的强度

2.所有点的强度变化

3.内点和背景点之间的强度差

4.内点与背景点之间强度变化的差异等。

首先想到的是将这些功能用于特定的框架。 但是,通过查看这些时间序列数据,我注意到相对于仪表读数的增加,十字架的时间漂移​​可能较小(我将在下一部分中用于标记数据的值)。 因此,我没有使用单个帧的强度,而是使用了一个时间窗的统计信息(均值和最大值),该时间窗从前两帧开始到后两帧开始。

资料标示

现在我有了这些功能,接下来就是标记该功能,以便我可以执行监督学习。 考虑到视频帧的数量,手动标记数据是不可行的。 拥有自动标记数据的方法至关重要,因为它可以使系统随着更多视频的出现而不断改进。我唯一可能使用的信息就是最终的仪表读数。 如前所述,该仪表读数在大多数情况下可以很好地代替损坏,并且Mayhem的计算机视觉引擎已经对其进行了解析。 有时在某些情况下无法使用极限仪表,因此我将它们从训练集中排除。 由于还有其他因素(例如技能损伤,治疗能力和自然生成能力)将有助于增加终极成绩,因此,我选择一位特殊的英雄作为我的训练材料。 英雄“寡妇制造者”是没有治疗技能的狙击手,每当她射中她都会造成相当大的伤害。 最终抄表的增加远比自然生成和技能损坏的增加大得多。 所有这些意味着,每当最终读数的跳跃大于2时,该跳跃就对应于具有十字特征的射击事件。 因此,通过提取最终阅读中的所有这些跳跃以及同步的十字形特征,我可以获得带有标签的出色训练数据。 即使模型是根据特定英雄训练的,但由于交叉特征在所有英雄中都是通用的,因此可以根据他们的设置调整伤害,从而很容易将其推广到其他英雄。 现在,最终的仪表读数与训练集中的损坏成正比,从现在开始,为了简单起见,我将其标记为值损坏。

数据管道

在详细讨论该模型之前,让我们先谈谈数据管道。 系统由在线部分和离线部分组成。 我基于Mayhem的代码库实现了在线组件。 随着新视频的到来,CV层会将信息解析为结构化数据,然后将其馈送到预先训练的模型中以生成损坏信息。

离线部分独立于Mayhem的系统。 结构化数据还将存储在本地进行培训。 由于单个视频中玩家可能使用多个英雄,因此管道可以将它们分别存储到不同的文件夹中。 即使模型仅使用Widowmaker数据,也可以使用其他英雄的数据来计算其伤害统计数据以调整伤害设置。 随着更多数据的进入,离线训练的模型将被用来代替旧的在线模型,从而以客户认为合适的频率提高性能。 请注意,到目前为止采用的培训过程不是增量的。 如果需要频繁更新模型,则应使用增量学习模型。

建筑模型

为了使用标记的数据构建模型,我需要进一步定义问题。 我应该使用什么型号? 由于我拥有被标记的数据的奢华,因此监督学习是我的选择,因为它更可靠且易于验证。 (附带说明:一种可能的替代方法是异常检测模型。由于我没有足够的时间来测试这种方法,因此我不确定性能会如何。但是,这种无人监督的方法无法通过增加数据来改善。)第一个明显的选择是对损害进行回归。 由于以下两个原因,我认为这不是一个好主意:首先,标签高度不平衡,并且大多数框架的损坏为0,而回归结果将高度偏向于0。其次,回归结果是针对特定条件训练的英雄将很难轻易推广到其他英雄。 因此,我求助于第二种方法,即分类。 通过对损伤值进行分类,我们可以定义不同类型的损伤。 对于模型的开发,我只有有限的数据量,因此我将损坏分为两种类型:正常损坏和爆头损坏。 任何大于此数量的伤害增加将被标记为爆头伤害,而其余部分将被标记为正常伤害。 可以轻松地将模型推广到具有更多数据的多个仓中,以具有更大的粒度。

关于数据的一件事是它们高度不平衡。 在我提取的数据集中的20,000个实例中,大多数都不属于类,没有损坏事件,其中只有133个是正常损坏,而其中有44个是爆头损坏。 由于我对少数群体最感兴趣,并且想增加模型的召回率,因此我使用了上采样方法“综合少数群体过采样技术”(SMOTE),以便使不同类别的人数相等。 那就是,当然,在我将数据分为训练集和验证集之后。 (一个常见的错误是在升采样后分割数据。由于这是一种合成的升采样方法,因此一些测试数据信息会泄漏到训练集中。)我使用时间窗口的统计值而不是时间窗口的统计值的原因之一该值也与这种上采样方法有关。 如果k个原始实例之间的特征存在偏差,则此合成过程将生成一个新实例,该实例在所有时间点上都具有一些平均值,不能代表实际的损坏事件。 相反,计算时间窗口的统计信息将不会出现此问题。

得到平衡后的数据集。 我训练了一个随机森林分类器来预测破坏类型。 然后,我使用保留的验证集测试模型。 有两个问题:很大一部分爆头伤害被归类为正常伤害; 这两个类的精度都较低。

经过一番探索。 我发现这两个问题来自游戏的其他两种机制。 首先,在某些情况下,爆头造成的伤害导致敌人的死亡,而健康状况却很差。 最终因损伤而增加的读数只能与健康一样高。 这意味着,在训练和验证集中将交叉特征标记为正常损坏时,交叉特征将显示为爆头,因为最终读数增加未达到阈值。 幸运的是,将来可以利用屏幕上的kill feed信息轻松解决此问题。 第二个问题来自另一种机制,称为受阻损坏。 在游戏中,当射箭落在某些英雄的盾牌上时,伤害不会消失,最终的读数也不会增加。 但是,十字特征仍将显示为正常损坏。 这种情况意味着它将生成很少量的未标记数据。 它们具有与正常伤害等级相同的功能,但被标记为“无”等级。 该标签噪声在none类中是最小的,因此只要我们不使用增强树方法,就不会在训练过程中引起问题。 但是,这将大大降低验证期间的精度,因为阻塞的损坏事件将导致误报。 为了确认这一点,我回到视频上,大多数误报是被阻止的损坏事件。 该模型可以正确分类功能,但是我们需要进行不同的验证。

结果

为了验证模型,我手动标记了新视频中每帧的损坏类型。 使用训练有素的模型,我能够在不同的阈值下计算两种损坏类型的精度和召回率。 由于输出是概率信息,因此客户可以根据需要调整分类阈值。 我设置阈值的方式使我的平均召回率为75%,平均精度为80%。

实际上,当最终信息可用时,该模型可用于提取受阻损坏。 如果模型以一定的置信度预测特征存在,但是附近的极限没有增加,我们可以将此事件分类为受阻破坏事件。 事实证明,该指标本身是评估玩家表现的另一个关键指标。

未来的改进

我认为有几件事可以改善模型性能,并有助于更好地推广到其他英雄:

1.如前所述,使用killfeed数据对kill事件进行不同的标记。

2.由于寡妇制造者的十字架总是很大,所以对于小的十字架特征来说没有足够的训练数据。 如果从其他英雄中提取训练数据,则将有助于提高模型识别小十字形特征的能力。

3.对输出执行更多的后处理,因为在某些情况下,窗口附近的多个帧会被识别为损坏帧,而它们应该属于单个拍摄事件。

4.在具有足够的损坏数据点之后,对所有类别进行欠采样可用于重新平衡样本。

结束语

综上所述,我设法建立了一个数据管道,该管道可以自动将非结构化视频数据转换为标记数据,该数据管道用于训练预测模糊指标的机器学习模型。 与从视频解析的代理信息相比,该预测是通用且可靠的。 该关键指标将作为客户游戏分析平台中的一项新功能实现。
最后,我想借此机会感谢Mayhem中的每个人。 与这些有才华和热情的工程师一起工作是我的荣幸。 我尤其要感谢我的联系方式:周凡和朱安行。 我还要感谢Eric Yuan帮助我进行AWS设置并教会了我专业开发实践。