摘要

在《英雄无敌:上古纪元》的竞技场模式里,玩家开战前要在一系列“选择页”上挑英雄、主技能、子技能、宝物和生物,每页给出几张卡片,每张卡片有一个图标和印在旁边的名字。要训练一个“看图标认身份”的模型,首先需要大量带正确身份的图标样本。本实验换了个思路:既然名字已经印在屏幕上,就先用 OCR(光学字符识别,把图片里的字读成文字)读出名字,再到项目的游戏知识目录里查它是谁。

结果:

  • 生物选择页:407 张截图、1,221 个标题,1,218 个唯一匹配到目录中的名字或已有别名(99.75%),3 个保持“未解决”。
  • 扩展到五类选择页的小样本演示:20 张截图、64 个标题,61 个匹配、3 个未解决。
  • 把这些读名结果作为标注建议,之后助手处理了 527 帧中全部 1,277 个待审对象。

这些数字都是“能在目录里找到唯一匹配”的覆盖率,不是准确率——没有独立的人工真值对照。读出名字也不能证明对应的图标裁图是干净可用的。

要回答的问题

  1. 在已知是哪种选择页的截图上,读固定位置的标题文字,能为多少图标找到唯一的目录身份?
  2. 哪些情况会失败,失败时程序能否老实地说“不知道”,而不是猜一个最像的?
  3. 这些读名结果能否安全地用作标注建议,加快身份审核,同时不破坏已有的人工决定?

数据与来源

  • 截图来自用户自己的竞技场录像中已归入某类选择页的帧。“这是哪种页面”是输入假设,不由本实验判断。
  • 名字目录来自项目的游戏知识模块,只读:英雄 108、主技能 30、子技能 180、宝物 151、生物 148。生物目录包含全部 148 种,而不仅是竞技场可抽到的那些,避免把意外出现的名字硬塞进子集。
  • 算法不读取任何已有的身份标注,图标裁图只用于展示证据,不参与决定名字。

方法

整个流程是:

已知页面类型 + 截图
  -> 固定的标题区域(宝物页先判断布局版本)
  -> 本机 OCR 读文字
  -> 规范化拼写与技能等级前缀
  -> 只在对应类型的目录里查名字/别名
  -> 中英文身份,或“未解决”

具体步骤:

  1. 按页面类型取标题区域:以 1920×1080 为参考按比例缩放(本版只支持 16:9)。子技能页有四个目标:一个大的父技能图标加三个子技能,分别保留各自类型。
  2. 宝物页的布局判断:先读一个已知按钮(如“REDRAW/重抽”)的位置,读到就用新版卡片布局,否则用旧版。这只决定几何位置,不决定身份。
  3. OCR:标题放大 3 倍后交给 Windows 自带的中文 OCR;如果没有得到精确匹配,再做一次局部对比度增强后重读。
  4. 规范化:保留原始识别文字;统一空格、标点、全半角、大小写和繁简字形。主技能页额外解析开头的等级前缀(如“高级”“进阶”“专家”)。
  5. 查目录:只在该页面应有的类型里查。唯一的精确名字或已有别名才算解决;编辑距离接近的“模糊候选”只展示,绝不当作身份;空结果、冲突、歧义一律保持未解决;不借邻近帧补名字。

例子:主技能页读到“高级秘术”→ 去掉等级前缀得“秘术”→ 这是已有别名 → 巫术 / Sorcery。同一页的“召唤秘术”独立解析为“召唤巫术 / Summoning Sorcery”,不会被当作父技能。英文名来自目录,不是机器翻译。

升级前后的生物是不同的实体,只在展示时按家族归组。

设置

  • 生物选择页完整运行:407 张截图,来自 16 段录像,每张 3 个标题。
  • 五类选择页演示:每类按均匀间隔选 4 段录像,每段取时间中点那一帧,共 20 张;选样不看标注、模型预测或 OCR 是否成功,所有选中目标都报告。
  • 结果全部记为“未经人工核验”,图标可用性记为“未评估”。

结果

生物选择页

运行 标题数 唯一匹配 未解决
24 帧试点(15 段录像) 72 72 0
首次完整运行 1,221 1,215 6
最终运行(加入繁简规范化) 1,221 1,218(99.75%) 3

首次运行的 6 个未解决里有 3 个是繁体字“縛”造成的,加入标准字形规范化后解决。最终运行中,原色读图解决 1,206 个,15 次对比度重试又补回 12 个,共对应 138 个不同的生物编号,耗时 38 秒。

五类选择页演示

页面 截图 唯一匹配 未解决
英雄 4 10 / 12 2
主技能 4 12 / 12 0
子技能页(含父技能) 4 15 / 16 1
宝物 4 12 / 12 0
生物 4 12 / 12 0
合计 20 61 / 64 3

原色读图匹配 59 个,5 次对比度重试补回 2 个;4 张宝物图中 1 张触发新版布局。提取、OCR 和查表共 2.69 秒(不是实时性能基准)。最初的几何草稿在同样样本上只有 53/64,看图后修正了宝物卡片偏移、技能标题带位置和缺少的“进阶”前缀,没有为单帧做特例;但正因为这些样本参与了开发,它们不是留出测试。

用作标注建议

  • 把读名结果作为“首选建议”写入待审核数据:976 帧、2,928 个裁图中,2,497 个标题与裁图几何对齐且精确匹配,849 个建议因此改变;3,239 个已有人工审核对象全部保持不变。这些是辅助覆盖和改动数,不是正确率。
  • 后来又用另一轮整图 OCR(PP-OCRv6)对 186 张关键帧的 617 个固定图标位置生成关系预标注,530 个解析成功、87 个未解决。
  • 用户把生物、英雄、技能的身份审核委托给助手后,助手处理了 527 帧中全部 1,277 个待审对象:1,225 个正身份,52 个质量负样本(21 被遮挡、22 空面板或非目标、9 淡入淡出)。
队列 总帧数 本次处理 处理后待审
英雄 363 0 0
主技能 557 171 0
子技能页 390 151 0
生物选择 615 205 0

其中 1,165 个对象是旧标题 OCR 与新整图 OCR 结果一致、场景符合、图标位置重叠度 IoU ≥ 0.65,并检查图标内部没有悬浮提示文字;112 个例外逐图看原图。另对自动通过组做了 150 个针对性复核(覆盖全部 145 个身份),未发现身份或可见性错误——这是针对性覆盖,不是随机抽样的准确率。这些标签记为“助手审核”,与用户逐张确认分开保存。

失败与负结果

  • OCR 读错一个字时,程序选择不猜:英雄“拉·达沃克”被读成“拉·迭沃克”,“约翰·约翰森”被读成“约翰·药翰森”,都只显示为模糊候选,身份保持未解决。
  • 目录缺别名:某子技能标题被稳定读成“时间扭曲”,但已载入的别名里没有这个写法;目录里有“时间跃迁 / Time Shift”。本次不擅自认定两者相同,也不修改目录,留待别名审核。
  • 名字可读不代表图标可用:悬浮提示框可能盖住图标而标题依然清晰,淡出中的技能也可能文字可读。读出名字不能把无效裁图变成有效训练样本。审核中还找到 10 个场景判断为“无遮挡”、但裁图内部有悬浮文字的样本,都归为遮挡负样本。
  • 一次中间运行因 Windows 长路径写入错误中断,没有产出结果,也不作为结果展示;最终版改用更短的派生文件名。

局限

  • 匹配率是覆盖率:没有独立人工真值,精确匹配也不保证一定正确。重复帧和布局假设限制了它能说明的范围。
  • 只支持已知页面类型和 16:9;未见过的布局、换行的长名字、过时别名、页面类型判错和叠加窗口都是已知失败方式。
  • 子技能页审核只覆盖父技能图标,三个子技能的独立框和身份尚未完成。
  • 生物目录覆盖统计显示:被选中的分类器使用 141 个生物编号,但当时只有 17 个编号、28 个经过核实的实战裁图,验证/留出集里没有生物裁图——覆盖不等于准确。
  • 战场上的生物、纯图标按钮、悬停/禁用/动画状态需要视觉或时序模型,不在本实验范围。

结论与下一步

“先读印在旁边的名字”是给选择页图标获取身份的高效办法:大部分标题能唯一匹配,失败时会老实地留空,并已用于大批量的标注辅助,未覆盖任何人工决定。下一步:明确选择助手审核的标签作为训练集、按录像切分,重训并比较图标裁图分类器;为子技能补独立对象。2026-09-09 起本实验还扩展到战斗中的面板/提示框条件标签(22 张助手审核原图,尚未训练分类器),攻击/法术的目标伤害预览另由专门实验负责。