摘要
玩家截一张游戏图,想让程序读出上面的数字:英雄面板上的攻击、防御、士气、运气和军队数量;生物信息面板上的名字、生命、伤害、先攻、速度;HUD(画面边缘常驻的英雄状态栏)上的攻防和法力。本实验(内部编号 B052)在已有的“手动单图读取”路径上加了这些数字字段的读取,只作为 Perception 模块里需要显式开启的功能,不改 App、状态估计或模拟器。
修订后的读取器在最新 71 张开发图上:363 个审核字段读对 351 个、读错 1 个、拒读 11 个;按图看,27 张有评分的图里只有 19 张所有字段全对(70.4%)。热身后整图端到端 p95 为 1.132 秒。这不满足“每个字段 ≥95%”和“十场独立对局”的产品目标,而且最新 5 场战斗来自同一个已曝光的录制时段。
要回答的问题
- 复用已有的区域定义、OCR 读取器和数字解析器,能把这些数字读到什么程度?
- 读错时是哪里出了问题——裁剪、图标、遮挡还是 OCR 本身?
- 从原图到 JSON 结果,热身后整图耗时多少?
数据与来源
- 281 张已审核图片(来自更早的 B047 审核集):前 210 张作训练/校准(165 训练、45 校准),修好配方之后才跑最新的 71 张。
- 最新 71 张来自同一时段的 5 场战斗,视为一个已曝光来源组。冻结的“来源 17–22”和历史 HUD 16 张始终没打开。
- 只对“明确标注过”的字段评分;部分标注不当作“其余都不对”。
方法
- 触发条件:英雄字段只在独立检测到英雄面板和头像后读取;生物字段只在唯一检测到居中的生物面板时读取;HUD 字段只在旗帜/行动条等独立证据确认头像后读取。名字不确定不会抹掉清楚的数字。
- 读取:一个常驻的 Paddle OCR 子进程(与 Torch 隔离)对每个裁剪读两遍:原尺寸和 3 倍放大。两遍分数都 ≥0.90 且一致才算一个候选——这是同一个模型读两遍,不是两份独立证据,也不是校准过的置信度。
- 原则:负数、
当前/最大对和伤害范围都保留显示原文;不截断数字、不删数字之间的空格、不按游戏资料改名字、不从相邻帧抄值;归属(我方/敌方)保持未知。
修订:找到错误后改了什么
助手逐张查看了训练/校准的 4 块错误图板:
- 士气/运气的裁剪里混进了金色图标,导致负号丢失。修订 2 改用只包含文字的窄带(原图 y 375–405)。
- 标题带从 978 像素收窄到居中 560 像素,修好了一个被截断的生物名。
- 两个生命值被读成
42/4和82/8,实际是被提示框挡住的碎片,OCR 分数还很高。于是加了一个很窄的“背景连续性否决”:生命值格下方一小条像素的 RGB 中位数在三段之间差超过 8,就不接受。训练集清楚格的差为 0–5,两个错例为 10/11。
没有降低数字置信阈值,也没有按真值挑路线。修好之后才在最新 71 张上跑一次,没有针对最新图再改再跑。
设置
评分把“拒读”和“缺失”都算失败。生物数量、英雄资源等都是显示原文,不代表隐藏的真实状态。计时包括原图 → UI 识别 → 进程间通信 → OCR → JSON,冷启动单独计。
结果
| 集合 | 图片 | 审核字段 | 对 | 错 | 拒读 | 缺失 | 全对图片 |
|---|---|---|---|---|---|---|---|
| 训练(初版) | 165 | 934 | 873 | 4 | 55 | 2 | 33/77 |
| 训练(修订) | 165 | 934 | 913 | 0 | 19 | 2 | 59/77 |
| 校准(初版) | 45 | 280 | 258 | 2 | 20 | 0 | 11/24 |
| 校准(修订) | 45 | 280 | 274 | 0 | 6 | 0 | 18/24 |
| 最新(修订) | 71 | 363 | 351 | 1 | 11 | 0 | 19/27 |
最新集按字段族:
| 字段族 | 对 / 声明 | 剩余问题 |
|---|---|---|
| 英雄数值与 7 个军队数量 | 178/187 | 9 个拒读,没有接受错值 |
| 生物标题与数值 | 173/176 | 2 个拒读,1 个接受了错误数量 |
| HUD 数值 | 最新集未标注 | 只有训练 48/48、校准 32/32 |
弱项:英雄运气 8/11、士气 7/11、军队第 6 格数量 9/11;生物士气 14/16、数量 15/16。校准集生物名只有 8/12。
修订去掉图标带后,训练/校准里 5 个被接受的负号错误全部消失,最新集运气 16/16。背景否决在 281 张图里否决了 6 个生命候选(含淡出面板等未审核格),这不代表 6 个都是错的,也不代表所有遮挡都能发现。
耗时(最新 71 张,热身后):整图 p95 1.132 秒,最大 1.231 秒;英雄面板 p95 0.289 秒、生物面板 0.260 秒、日志 0.530 秒。冷启动 UI 2.893 秒 + OCR 进程 5.678 秒,所以一次性冷用不满足 3 秒。
另有 1,004(训练)、252(校准)、441(最新)个读数没有标注、没有评分,多数是被其他面板压在下面的 HUD,不能称为已验证。
失败与负结果
- 最新集 12 个失败逐张看过:11 个是清楚的值因 OCR 分数低被拒;1 个是
battle-06-14的数量95/95下半部被提示框挡住,两遍都读成05/05,被接受为错值。这个错误保留,没有针对这张图打补丁重跑。背景否决目前只覆盖生命值,数量格没有遮挡检查。 - 评分程序初版遇到列表/字典混合标注和
42/不可见这类部分字符串时停止;修好评分程序而没有重跑推理或改标签。 - Perception 全套测试 7,198 通过、2 个既有失败、6 个跳过:两个冷导入测试在前面的测试把 Torch/CV2 加载进内存后失败,没有放宽断言。
局限
- 所有图片来自已曝光来源;最新集不是盲测。重复的字段和帧不是独立实验。
- 13 个选择侧栏布局、能力说明、攻击/法术预览、全面的局部遮挡判断、任意分辨率都未实现。
- 归属保持未知;不推断基础属性、装备或技能。
- 计时不含 App 截屏、显示和自动触发。
结论与下一步
数字字段读取已能在手动单图路径上工作,修订消除了图标混入导致的负号错误,但离产品目标还远:士气、运气、军队数量是弱项,被遮挡的数量会被读错。下一步是用训练来源做局部数字/可读性实验(尤其士气、运气、军队数量和被遮挡数量),并给 HUD 加明确标注,而不是给未审核输出打分。
Comments