摘要

攻击预览是玩家悬停目标时出现的两行小字:上行前面是骷髅图标(预计击杀数),下行前面是拳头图标(预计伤害,常为“227-248”这样的区间)。本实验修了两个问题:

  1. 回合最后一个单位的预览被拒:读取器要求行动条(显示行动顺序的卡片条)上当前回合至少 2 张卡才算战斗版式。回合最后一个单位行动时,当前回合只剩它自己一张卡,预览就被整帧拒绝。改为“当前回合至少 1 张、整条至少 2 张”。
  2. 读出的数值有错:整帧 OCR 有时把骷髅图标读成数字“5”、漏掉区间的短横、把背景数量牌的数字并进来等。本实验不改读数,而是增加一道可信度核验:检查每行前面确实有完整显示的图标,并用“字宽模型”检查读数的字符数与画面上的白字宽度是否吻合,不通过就输出未知。

结果:训练集保留的 70 个全部正确;测试集只跑一次,输出从 56 个(6 个错)变为 51 个(0 个错),58 个真实预览中 7 个变成未知。

要回答的问题

  • 回合最后一个单位的预览能否正常读取?
  • 能否在不改变读数的前提下,可靠地识别并丢弃错误读数?代价是多少正确读数?

数据与来源

  • 训练集:训练池截图包中的预览帧,路由读出 82 个数字对,对应 78 个真实预览。全部与截图并排目视核对(AI 助手目视核对)。
  • 测试集:测试池 53 帧、56 个原有数字对,加问题 1 新读出的 3 帧;逐个对照截图。测试帧只用于评估,结果出来后没有再调整。

方法

训练集错误分析(82 个输出中 9 个有问题):

原因 个数
骷髅图标被 OCR 读成“5”,又与同一伤害行配成第二个预览 2
区间短横与“4”的横杠粘连,OCR 漏掉短横(如“474685”) 4
背景数量牌的数字并进击杀行(“4-634”,真值 4-6) 1
法术书里英雄属性栏的图标 + 数字被当成预览 1
预览左半被界面挡住,数字不全 1

此前一种“图标锚定”读法在同一批上 70/78 对、3 个错,且会漏掉淡入的预览,不能直接替换;早先也试过放大、拉伸、二值化等 OCR 变体,救不回粘连的短横。所以这里只核验、不改读。

核验步骤(对每个数字对):

  1. 在每行文字框左侧小窗口里用模板相关找图标(0.70–1.30 倍尺度;模板是从训练帧裁出的骷髅和拳头)。相关 <0.62 → “图标缺失”。
  2. 行文字必须延伸到图标右边至少半个图标高,否则这“行”就是图标本身被读成了文字。
  3. 图标必须完整显示(图标框内第 97 百分位灰度 ≥215;完整显示的 ≥235,淡入或被挡的 ≤195)。
  4. 两个图标上下排列。
  5. 字宽:量出图标右边到文字框右缘之间的白字宽度,减去按字符估计的宽度(每个数字 0.448、短横 0.378、括号 0.575、百分号 0.288 个图标高;在 145 行正确读数上用最小二乘拟合,残差标准差 0.056)。残差 < −0.4 说明读数里有画面上没有的字;> +0.25 说明画面上的字比读数宽约 2/3 个短横,即有字没读出来。

不通过的数字对不输出(未知),并写明原因。输出格式不变,相关分数和宽度模型都不是概率。

设置

核验放在攻击任务里、治疗预览剔除之后。用保存的路由结果回放评估,并用完整路由器重跑训练集确认一致。

结果

训练集:

保留 其中对 丢弃 丢弃里确实错/假
旧路由 82 73 — —
加核验后 70 70 12 9

被丢弃的 3 个正确读数:两个拳头被界面“X”按钮挡住,一个是淡入中的半透明预览。完整路由器重跑训练 78 帧:保留 71 个(含问题 1 新读出的一张),全部正确;攻击任务耗时中位 0.32 秒、最大 1.0 秒,没有变慢。

测试集(只跑一次):

输出 其中错
旧路由 56 6(5 个错值 + 1 个把拳头读成“0”的假预览)
加核验后 51(原有 49 + 新读 2) 0

58 个真实预览中 51 个读对输出、7 个未知:6 个是旧路由本就读错的(骷髅读成数字 3 个、短横丢失 2 个、被伤害飘字挡住 1 个),1 个是淡入中的正确读数。问题 1 新读出的 3 张测试帧中 2 张读对,1 张骷髅被读成“8”,现在不输出。

失败与负结果

  • 核验以召回换精度:测试中 7 个真实预览变成未知,训练中丢了 3 个正确读数。
  • 错误读数本身没有被修好,只是被拦下。

局限

  • 数据规模有限,测试帧含测试池录像,只用于这一次评估。
  • 预览两行的含义(击杀/伤害、百分比)仍只是候选,攻击者与目标的关联不变。
  • 185 项攻击预览与路由相关测试通过,只证明代码行为。

结论与下一步

“图标 + 字宽”核验在训练和测试上都把错误输出降到 0,且不变慢,作为生产改动保留。下一步考虑找回被丢弃的读数:骷髅被读成数字时,真正的击杀数字就在骷髅右侧,可局部重读;漏了短横时,字宽已经说明少一个字,可按数字等宽定位短横再拆分。两者都必须先在训练集上证明不引入错值——此前一次横线补救就曾把 449 错拆成 4-49。淡入预览一律未知,因为同一次悬停通常还有完整显示的帧。