摘要

在《魔法门之英雄无敌:上古纪元》的竞技场模式里,开战前会有一张“最终确认页”,完整展示我方构筑:英雄、属性、8 个主技能及等级、每个技能下的子技能、装备、10 个可见法术及等级、7 支军队及数量。把这一页读准,等于拿到了我方的完整构筑。

本实验(编号 B149)改进生产读取器在这一页上的逐字段准确率,原则是“对的读数不能变错,宁可未知也不要错”。在训练池 69 张冻结案例上,错误从 8 个降到 0,漏读(输出未知但真值已知,包括空槽)从 1,217 降到 104,没有任何字段由对变错。测试池只读一次,在修正标注格式问题后为 2,442 对、0 错、229 漏。真值来自助手像素精审,不是人工真值。

要回答的问题

在不改变输出格式、不让任何对的字段变错的前提下,能把确认页的漏读和错读降到多少?剩下的问题是什么性质?

数据与来源

  • 训练池(本实验只用它调参):58 局旧录像的确认页、1 张被精审拒收的半透明淡出确认页(作为压力案例,构筑真值来自同局其他帧)、10 个 10 月训练截图包,共 69 个冻结案例。真值是精审者核对后的我方构筑。
  • 测试池:旧录像测试局、10 月测试包;只由主会话在最后读一次。冻结留出录像从未打开。
  • 一组子技能的参考图曾被怀疑有误,这些行一度单列、不进主表、也不为它们调参(后来该怀疑被撤销,见测试池部分)。

方法

每个字段分为:对、错、漏(未知但真值已知)、并列(未知,但证据里列出的“参考图完全相同”集合中包含真值——像素层面不可区分)、真值未知。

逐个诊断基线的漏读与错读:

问题 原因 修复 效果(训练池)
日光时间/炽热艳阳、夜影时间/幽深夜晚两对子技能读不出(25 处) 两图标只差一个小角标,整图相关差 0.01–0.09,低于 0.08 门槛 两个参考共用一次配准,只在两参考像素不同的区域比较 412 个子技能位离线检验:新增 23 对、0 错
魔法神箭/穿刺法术 两个参考图像素完全相同 不猜,证据中给出并列 计为并列
空装备槽(366)、空技能/子技能位 空装备槽是藏青底上的灰色剪影;空技能位是均匀深色方块 统计判据,在证据中标 empty_slot: true 接受帧上全部空位标出,0 误标
两个非竞技场法术读不出(9 处) 不在比对库;其中一个与“闪现”相关 0.738,有误读风险 加入比对库作干扰项;命中时只写入证据,字段值保持未知 证据 9/9 与真值一致
两个法术分数贴着门槛 整列法术相对固定框偏约 −14 像素 用至少 3 个已识别法术的中位偏移重新居中一次,结果必须等于第一遍首选 +3 对,0 错
化身召唤档位读错(6 错) 基础/高级/专家三档图标相同,档位不可见 值设为未知,证据给出三档并列 6 错→并列;代价:2 个原本碰巧对的与 8 个等级变为并列/漏
士气 0 读不出(3) 两次 OCR 都读“0”,但有一次分数略低于 0.80 只对士气/幸运:两次一致且都 ≥ 0.5,再由独立数字字形原型读出同一值才接受 +3 对;字形原型在 204 个属性数字上 0 次“自信但错”
“开始游戏”被读成“开怡游戏”,整页不支持 OCR 两次一致地错一个字 仅当另两项旁证都成立时接受,并写警告 该页 66 字段恢复
军队数量 54→5(鼠标遮挡)、50→501(淡出帧) 遮挡使可见数字偏离居中;淡出帧笔画矮 检查数字笔画高度、居中偏差、笔画数,不合版式则数量设为未知 2 错→漏;淡出帧另 6 个原本对的数量也弃权
主技能已识别但等级读数低分,整格连子技能被清空(2 格) 旧守卫本为“空白深色格”设计,误伤清楚的图标 格内确有图标时保留身份、等级设为未知 +2 技能、+3 子技能

兼容约束:公开函数签名、默认值、错误类型、已保存格式都不变;字段集合仍是 66 个、状态只有“候选/未知”两种。新信息只进入证据字典。检查过下游:战斗记录 App 和状态估计(SE,把观察累积成对局状态的模块)都硬性要求状态与值一致,新增“空”状态会破坏它们,所以空槽只在证据里标出;非竞技场法术身份也会让 App 整页拒绝导入,所以只进证据。69 份新输出送入两个下游的严格校验,69/69 通过。

设置

每次生产改动后在同一冻结案例上全量重跑,错误数不得增加。单帧约 7–8 秒(GPU OCR + 模板匹配)。粗略计时:修改前中位 6.96 秒,修改后 7.27 秒(多了 39 个非竞技场法术干扰项;机器上同时有其他负载)。

结果

训练池 69 帧,逐字段(主表)

字段 基线 对/错/漏 修改后 对/错/漏/并列(空槽标记计为“空”) 修改后只看字段值 对/错/漏/并列
英雄 67/0/2 68/0/1/0 68/0/1/0
主技能 337/0/183 512/0/8/0 345/0/175/0
技能等级 369/0/13 375/0/7/0 375/0/7/0
子技能 443/0/553 960/0/16/20 484/0/492/20
法术 551/6/33 562/0/20/8 562/0/20/8
法术等级 653/0/37 658/0/32/0 658/0/32/0
军队 441/0/7 448/0/0/0 448/0/0/0
军队数量 473/2/8 474/0/9/0 474/0/9/0
装备 555/0/366 916/0/5/0 564/0/357/0
属性 439/0/15 448/0/6/0 448/0/6/0
合计 4,328/8/1,217 5,421/0/104/28 4,426/0/1,099/28

“只看字段值”一栏里,为兼容严格的下游,空槽仍输出未知,所以 995 个空槽在该视角下仍是“漏”;证据里的空槽标记在 68 张接受帧上对 995/995 个真值空槽全部给出,且没有标在任何有物体的位置。

按来源:58 局旧录像 3,825/7/1,010/0 → 4,782/0/32/28;淡出压力帧 21/1/61/0 → 16/0/67/0;10 月 10 包 482/0/146/0 → 623/0/5/0。全部 6,279 行的转移:对→对 4,372、漏→对 1,109、错→并列 6、错→漏 2、对→并列 2、对→漏 14(都是有意的弃权)。

测试池(34 张确认页,主会话只读一次):第一次评分出现 56 个“错”,逐条核对原图后全部是标注格式问题——有 8 局的标注者用了自己的装备槽位名称,评估把这些槽当成空(读取结果与标注逐件一致,39 处);另一局标注先列战斗法术书、后列确认页法术,按位置比对全错(17 处)。只修改真值解析(不重读图片、不改读取器)后:

范围 对 错 漏 并列 真值未知
全部来源 2,442 0 229 4 419
其中 10 月测试 474 0 4 1 249

第一次评分原样保留。被怀疑参考图有误的子技能分组后来撤销(规则模拟器方面确认游戏里同图、靠父技能可区分),计入主表。修改前读取器在测试池上的基线因用户游戏期间暂停而没有跑完。

失败与负结果

  • 化身召唤档位、军队数量版式检查都以“弃权”换掉错误,导致少数原本碰巧对的字段变为并列或漏。
  • 淡出帧除军队头像和 9 个装备外全部未知。
  • 一个法术重新居中后分数 0.741 仍未过门槛;一个子技能“属性加成”不在参考里,仍未知。

局限

  • 真值来自助手精审,不是人工真值;分数是相关系数,不是概率。
  • 只验证了 2560×1440 录像帧,其他分辨率的阈值未验证;训练池每局都是 7 队、≥10 个法术,军队/法术空位没有样例。
  • 魔法神箭/穿刺法术(20 处)与化身召唤档位(8 处)像素不可区分,只能给并列;两个非竞技场法术身份只在证据里,等待下游扩充白名单。
  • 测试池缺修改前基线,无法直接给出测试池上的前后对比。

结论与下一步

在不改变输出格式、不让对的变错的前提下,确认页的错误清零、漏读大幅下降。剩余问题主要是“像素上就分不出来”或“下游合同不允许写入”。建议(需要下游负责方配合):让 App 和 SE 显示或采用空槽证据;双方同步扩充非竞技场法术白名单后再把证据升为字段值;化身召唤档位交给 SE 按技能等级规则决定。