摘要
要训练和评估一个能读懂游戏画面的程序,先要知道手头的录像里到底出现过哪些内容。《英雄无敌:上古纪元》竞技场里有几十个法术(每个法术有 1–4 级,各级说明不同)、上百种状态效果、几百条生物能力、数百个英雄技能,以及战斗日志的各种句式。很多说明文字只有在鼠标悬停时才会出现。
本实验做了一份覆盖清单:从 49 段准入录像里按画面变化抽出 18,617 张原生截图(法术书页、选卡页、英雄窗口等),全部做整图 OCR,再与游戏安装数据里竞技场配置中出现的条目比对,统计每类内容在训练录像里有没有文字证据。然后按“怎么录”分组,生成一份给用户的补录清单。
结果:法术名几乎都有(63/64),英雄技能名字有一半以上;但法术各等级的说明(43/256)、生物主动能力(32/160)、备用攻击(1/71)、状态效果都缺得很多——它们只在悬停时出现,而现有录像很少悬停。所有结论都是机器预标注(PRELABEL),用户审核前人工审核数为 0。
要回答的问题
现有的训练录像覆盖了竞技场里哪些可能出现的内容?缺哪些?应该怎样补录才能高效地补上?
数据与来源
- 录像:49 段已登记准入的录像,按缩略图变化选出 18,617 帧,不限每局张数。其中开发(训练)用 14,011 帧(8 月底游戏更新后 12,505 帧、更新前 1,506 帧),测试用 4,606 帧。按画面类型:法术书 7,176、选卡类与确认页 10,135、英雄窗口 1,306。全部是原生 2560×1440 无损 PNG。
- 再加上之前一个实验已有的 3,853 帧(有损 JPEG),共 22,470 帧、306,918 条去重后的文字出现记录。
- 条目目录:来自游戏资料库的公开接口和只读的当前安装包竞技场配置。配置中正值 / 未禁用的引用只是“可能出现”的安装证据,不是经过验证的执行规则。
- 每读一段视频、扫描或 OCR 之前都核实登记;冻结的测试来源保持关闭。只有 8 月 31 日之后的开发录像算训练覆盖;测试录像和更新前录像单独计数。
方法
- 选帧。 稳定缩略图的 10×10 格中,最大均值变化 >8 就选为新帧。为了避免外围战场动画制造重复:选卡页只比较左侧 960 像素的英雄窗口;法术书和英雄窗口比较包含面板与悬停区域的窗口;其余比较整帧。场景标签本身不算字段证据。
- 抽帧。 跨来源批量定位没有在所有时间点上通过,因此正式补抽采用逐时间点精确定位,60 秒超时或坏帧记为缺口。
- OCR。 全部帧做整帧 OCR(PP-OCRv6 中等模型,GPU)。
- 比对规则。
- 共享的文字保持“歧义”,不计入已解决覆盖。
- 名字不会自动填充法术的四个等级;只有法术书格子右下角唯一的 1–4 数字,或没有歧义的说明,才提供等级候选。
- 法术等级覆盖需要完整说明;单位能力和英雄技能需要名字加说明;只有名字或只有格内等级算部分覆盖。
- 同一行重复出现按“视频 / 毫秒 / 框”去重。
- 接手后的修正(实验后半由另一个会话接手完成):
- 英雄技能说明在安装数据里的字段名叫
desc,目录只找了description,导致 717 个英雄技能条目全都没有说明文字;修正后 701 个有说明。 - 按显示名分组:英雄技能 227 个名字对应 717 个安装 ID(不同等级、阵营、竞技场 / 战役副本、伪技能),状态效果 400 个定义共用 137 个名字。如果按 ID 判,同名一律算歧义,英雄技能覆盖就是 0。于是另按显示名统计:一次名字读数的候选 ID 全在同一名字组里,就算“这个名字录到了”(仍不能说是哪一个 ID);按 ID 的严格统计保留不变。
- 名字下方的说明:OCR 常把说明拆成两行、丢掉行尾的字,精确模板匹配会失败。对英雄技能、状态效果、生物能力等,把名字下方 260 像素内的文字连起来,与目录说明(去掉数字占位)比相似度,≥0.8 记为“名字下方相似说明”。法术等级不用这个方法,因为同一法术四个等级的说明只差数字。
- 英雄技能说明在安装数据里的字段名叫
设置
GPU OCR 累计壁钟上限原定 7,200 秒,游戏运行时暂停。第一位执行者做到 15,727/18,617 帧时被用户叫停;接手者按用户指示把上限显式提到 9,600 秒,并把原因写进每次进度记录,补跑剩下的 2,890 帧用了 814 秒(同时有 CPU 测试在跑,比每帧 0.25 秒的预估慢)。累计记账 8,252 秒,其中包括叫停时 2,577.55 秒的保守补记(不是实测)。
结果
8 月底更新后的开发(训练)录像,只计竞技场配置里出现的条目:
| 类型 | 竞技场条目 | 已有文字证据 | 待补 |
|---|---|---|---|
| 法术名 | 64 | 63 | 1 |
| 法术等级(说明) | 256 | 43 | 213 |
| 状态效果(按显示名) | 103 个名字(237 个 ID) | 名字 37,名字与说明 19 | 84 |
| 状态说明文字 | 109 | 19 | 90 |
| 生物主动能力 | 160 | 32 | 128 |
| 备用攻击 | 71 | 1 | 70 |
| 日志句式 | 37 | 23 | 14 |
| 英雄技能(按显示名) | 212 个名字(673 个 ID) | 名字 121,名字与说明 67 | 145 |
| 生物能力说明(补充目录) | 400 | 152 | 248 |
“缺”包括没录到、OCR 漏读、同名同文无法区分,不表示游戏里没有。可出现性未确认的安装条目(不在当前竞技场配置里,或没有界面文字)只计数:英雄技能 69、生物能力说明 91、法术等级 146、法术名 26、状态说明 49、状态效果 219、生物主动能力 2。
补录清单按录制操作分组,例如:
- 法术等级:开局选法术后打开法术书,依次悬停各法术,每次切换等级都悬停一次,录清右下角等级、说明、消耗。唯一缺名字的法术是“地之怒”。
- 状态效果:对电脑施法或使用能力后,打开受影响生物的面板,依次悬停状态图标。
- 生物主动能力:选相应生物后打开面板悬停主动能力,再用一次并记录底栏冷却数字的变化(清单按兵种列出 128 项)。
- 备用攻击:悬停备用攻击按钮,切换攻击方式并录目标预览和动作日志。
- 日志句式:打开完整战斗日志,执行移动、攻击、反击、等待、施法、召唤等,保留动作前后。缺的 14 种句式包括建筑受损 / 被摧毁、英雄能力被禁 / 解禁、魔法书锁定 / 解锁等。
清单里还附了规则模拟器负责方提出的两个专项录制需求:同一种效果在未过期时连续两次命中同一目标后,状态图标和日志如何显示;被复活的部队本回合还能不能行动(现有日志几乎都是部队还活着时补回个体,整队复活只找到更新前的一次,无法定案)。
测试与检查:专项测试 20 项通过(新增 3 项:名字组覆盖、测试 / 更新前不算、丢字说明仍 ≥0.8 且无关说明 <0.8);浏览页 2,562 个条目、引用的 18,135 帧无缺图、来源组没有跨划分;无头浏览器在桌面和手机尺寸下检查通过,没有生成任何“已审核”标记。
失败与负结果
- 第一次执行中途被用户叫停(GPU 机时超预算),后由另一会话显式提高上限补完;补记的机时是保守估算。
- 目录字段名错误导致最初的英雄技能说明全部为空,接手后才发现并修正。
- 最初按 ID 统计,同名条目全部算歧义,英雄技能覆盖被算成 0;改为同时报告按显示名的统计。
- 最初的补录清单是 238 KB 的逐 ID 表,实用性差,改成约 20 KB 的分组清单。
局限
- 全部是 PRELABEL:“已有”只表示 OCR 读到了,没有人工核对。
- 相似度阈值 0.8 是按两三个例子定的,没有系统评估误配率。
- 名字组只说明“这个名字录到了”,不区分等级或阵营变体;状态说明文字没有名字,仍按文字逐条统计。
- 技能冷却、操作类型(近战 / 延展 / 远程 / 施法 / 等待 / 防御)、移动方式、操作前后的界面变化是另外的动态字段,需要动作前后的连续帧,本实验一律没有标注。
结论与下一步
现有录像对“名字”覆盖较好,对“只有悬停才出现的说明”覆盖很差。最有效的补录方式是有目的地悬停:每组先录 5–10 项,录完重跑覆盖统计就会更新清单。动态字段(预览种类、底栏时间线等)由后续的专门实验补。
Comments