摘要

游戏《英雄无敌:上古纪元》的战斗画面里有很多数字和文字:英雄的攻击/防御、生物的数量和属性、法术书里的说明、战斗日志(Logs,记录每次攻击、施法的文字列表)。本实验(内部编号 B025)回答一个比“全自动识别”更小的问题:如果已经知道某个字段在画面上的大概位置和格式,能不能从现成的 OCR 结果里可靠地读出它,并且在没把握时宁可说“不知道”?

首轮在一段开发录像的 9 张原图上,68 个人眼可读的字段严格匹配 62 个;47 个数字里 45 个读对、0 个读错被接受、2 个拒绝读取。之后又做了三轮扩充:用 OCR 检索补标 276 个字段、一个“无分数复读”规则恢复 12 个数字、四段录像新增 158 个字段核查。所有结果都来自已经看过的开发录像,区域是人工给的,不是独立准确率,也不是自动定位的成绩。

要回答的问题

  1. 给定区域、格式(整数、分数如 32/68、文字)和语义角色后,读数器能否读对?
  2. 没把握时(分数低、多次读法冲突、解析不了)能否明确拒绝,而不是删掉坏字符凑一个数?
  3. 日志里的句子能否被解析成“谁对谁做了什么”的结构?
  4. 后续扩充的参考数据,旧 OCR 能读对多少、差异出在哪?

几个术语:

  • OCR 分数:OCR 引擎给每段读出文字附带的一个 0–1 数值。本实验用 0.90 作开发阈值,它不是“读对的概率”。
  • 拒识:读数器主动返回“读不出/不确定”,字段留空,不当作 0。
  • 场景门控:先判断画面是否是正常游戏画面;暂停、断线、过渡画面等直接阻止读取。

数据与来源

  • 首轮试点:同一段开发录屏中 9 张 2560×1440 原图,已有整图 PP-OCRv6(一个开源 OCR 模型)缓存。人工核对后给定 23 个面板、72 个字段机会:68 个可读,4 个是“不可读/无文字”的对照。
  • OCR 检索补标(2026-09-10):从 7 个视频来源的 20 张已有原图里,新增 30 个区域框、276 个文字/数字框(法术书悬浮说明、生物属性面板、能力说明、英雄详情、专注值说明、战斗日志等)。参考由助手看图核对,状态是“待用户确认”。
  • 无分数复读(2026-09-12):9 月 8 日一段已曝光录像的 53 张缓存图。
  • 短悬浮与属性扩充(2026-09-13):从已有 OCR 的 403 张图里用文字检索选 13 张,来自四段开发录像。

所有原图都在开发集里,没有打开预留的验收录像。

方法

保守字段读取

输入是原图、缓存的 OCR 结果和给定的字段区域。程序只取“大部分落在字段区域内”的 OCR 框,原图读法和增强图读法分开保存,每次都解析完整的字面文字。出现以下任何情况就拒识:有低于 0.90 的字符段、解析不了、两次读法不一致。字段不从别的面板或别的时刻补值,屏幕左右也不被当作敌我。

开始前会核对原图和 OCR 缓存是否同源(尺寸、文件大小、修改时间一致),不一致就停止,避免把一张同尺寸的无关图片的文字错用过来。

日志句式解析

把日志的一行文字解析成结构(行动者、目标、动作、数值)。最初支持 7 类句式,后来加入“恢复魔力”“被召唤”扩到 9 类。多分句或否定句不会被吞成名字。

“完整高分读法 + 无分数一致性”

后来的扫描器会把 PP-OCRv6 的有分数读法和另一个模型(PaddleOCR-VL)的无分数数字重读一起保存。原严格规则只要某行没有分数就拒识,哪怕所有读法都一致。新规则(仅为私有实验):只对数字字段,要求至少有一遍完整读法的每一行都 ≥0.90,且其他完整读法全部可解析并一致;有跨界行、低分、冲突、多行数字时仍拒识。混合结果的分数仍记为空,不借分。

设置

  • 首轮评分时,预期值只给评分程序,不进入读数器;但区域、格式和角色是输入,所以结果只反映“给定区域”下的表现。
  • 每次复现必须写到新的输出目录,拒绝覆盖旧结果。
  • 无分数复读规则先冻结协议再运行;新出现的数字逐张看原图核对。

结果

首轮 9 张图

类型 参考可读 精确匹配 接受但有差异 拒识或漏读
数字 47 45 0 个错误接受 2
文字 21 17 2 个仅空白不同 2

4 个无文字对照全部拒绝。总体严格匹配 62/68。两次数字漏读:一个 HUD(画面边缘的英雄状态栏)350/350 因翻页上下文被拒,一个属性槽 7 OCR 根本没给文字;两次文字拒识来自日志多次读法冲突。

v1 曾得到 61/68,复核发现旧参考把所有空白删掉了;v2 保留空格后变成 62/68。这是参考处理修正,不是 OCR 进步。

日志句式

开发回放里 4 张已看过的日志原图含 105 条日志和 1 个轮次标题:44 条字段被正常观察,61 条因上游读法冲突跳过。

句式版本 精确 拒识
7 类 26 18
9 类 31 13

新增接受的 5 条全是“恢复魔力”;唯一一条召唤句在上游仍是冲突,没有端到端接受。

OCR 检索补标

276 个新标字段用原有几何选读回放,精确读回 262 个:数字 99/103、文字 163/173。失败包括图标字母 G/X 黏在数字上、“蕈菇魔法”被读成“曹菇魔法”、引号句号缺失、列表圆点漏读。这批是先用 OCR 搜到再标注的,不是独立留出集。精选的 159 张图里,“整帧完全标完”的数量仍为 0。

无分数复读

53 张图里 34 张通过场景门控,共 108 个面板、234 个字段机会。

字段状态 原严格规则 新规则
读出(OBSERVED) 0 12
无分数(UNSCORED) 160 148
低分 28 28
冲突 29 29
位置未定 14 14
解析不了 3 3

新增 12 个是底栏生命 6 个、生物面板数量 5 个、伤害范围 1 个,逐张核对都对;但只来自 11 张图、6 种不同值,核对发生在看过预测之后。历史 72 字段的输出完全不变。160 个无分数字段里,77 个因“框跨界”被拒——这不等于 77 个 OCR 错字。

短悬浮与属性扩充

开发录像 帧 字段 与旧 OCR 一致
9 月 5 日 3 32 32
9 月 7 日(早) 4 34 33
9 月 7 日(晚) 2 25 22
9 月 8 日 4 67 64
合计 13 158 151

七处不同:圣骑兵数量和相邻属性被读成一条混合读数(2 个字段)、属性 3 多出 X3、罗马数字 I 变成竖线、两处是比较程序把 (Shift) 排序错(不是识字错)、一处连接号形式不同(数字相同)。13 个无文字局部都没有被误读出文字。

失败与负结果

  • 首轮两次文字拒识、两次数字漏读保留。
  • 补标首轮发现两个日志框包进了旁边的“敌方回合”,缩框重做;首轮结果保留。
  • 无分数复读规则没有处理“框过宽把图标包进来”的情况:例如防御 25 三次读法都是 25,但一个框大到包入图标、分数 0.896,冻结规则仍拒识。
  • 英雄详情右侧资源的旧“魔法值”命名存在循环引用,不能作为独立语义依据。

局限

  • 所有区域是人工给的,没有评估自动定位、单位归属、独立视频准确率、完整日志语义、冷却解释、事件召回和生产延迟。
  • 4 个或 13 个无文字对照不能估计总体误放行率。
  • 参考是助手看图(模型目视核对),不是人工审核(REVIEWED);状态是“待用户确认”。
  • 软件测试(例如 Perception 全套 1,971 或 2,302 项通过)只证明程序合同,不是识别准确率。
  • 分数字段 102/119 的第二个数不被解释为游戏里的最大值。

结论与下一步

在给定区域时,“宁可拒识也不猜”的保守读数基本可行,首轮没有接受任何错误数字。但真正的难点在别处:自动找到面板和单个属性格、处理一个框里混进图标或邻格数字、在新录像上盲测。后续计划是让自动面板定位产生单格裁图后重读,分别报告“定位漏了”“读取拒识”“读出错值”三类错误;自动面板定位由 B027 单独评估。