摘要
在《魔法门之英雄无敌:上古纪元》的竞技场模式里,开战前会有一张“最终确认页”,完整展示我方构筑:英雄、属性、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 按技能等级规则决定。
Comments