摘要
游戏里一个单位攻击另一个单位时,屏幕上会短暂浮出伤害数字(“飘字”),左边带一个小图标:拳头表示伤害,骷髅表示死亡数量,例如“拳头 −314、骷髅 −5”。项目希望不打开战斗日志(Logs),直接从画面上读到这些数值,作为之后推断双方攻防属性的观察。
上一版读取器(v4)先找图标,再在图标旁的固定文字框里做两种尺寸的 OCR;为防止把两个飘字的文字混在一起,如果两个文字框共享墨迹就拒读。问题是:两行飘字上下靠得很近时,固定的上下边距会包进另一行笔画,导致本来可以读的两行都被拒绝。本实验新增一条受控规则:在原文字框里,如果确实有另一条墨迹带,并且图标中央对应的那一行上下都有完整空白行隔开,就把上下边距缩到那条空白行为止。
结果:旧的 34 张回归图接受结果完全不变;新 11 张图里预先登记的 14 个字面,接受数从 3 个增到 5 个(新增的两个与登记一致);还剩 9 个未接受(8 个未知、1 个未检出)。这只是开发样例上的局部修复,不是独立准确率。
要回答的问题
用“完整空白行”分开上下相邻的飘字,能否在不改变任何已接受读数、不放进错误读数的前提下,恢复一些被误拒的字面?
数据与来源
- 只使用用户指定的两段 10 月 10 日训练录像(16:57、01:39)中已经保存的截图,不另开录像、不新增训练来源。
- 固定上一轮的 34 张回归图(包括无飘字、淡出和未知的图),加上自动发现后预先目视登记的 11 张图。这 11 张图包含 14 个已知字面,v4 接受其中 3 个;另有两张魔法书页只确认了左侧露出的一条带状区域,不能当整图负例。
- 这些都是曝光过的开发图,不是留出测试集。
方法
规则(运行前写定):
- 在原文字框内,寻找覆盖图标中央半高范围的唯一连续墨迹行带。
- 只有当这条行带完整、高度满足现有数字组件下限与图标高度上限、上下都有空白行分隔,并且原框里确实存在另一条墨迹带时,才把上下边距缩到空白行。
- 不删墨迹、不补符号、不改横向范围、图标定位、颜色和 OCR 门槛(仍是两种尺寸、0.90 门槛、完整负号与组件检查)。
- 有多个中央行带、触边或与背景连通时,保留旧框,继续由原保护拒绝。
不按预期数字选框,也不尝试多个裁剪再挑 OCR 成功的那个。
实验后的收紧:第一次跑完后,生产版本进一步限定为“只有旧框里确实存在另一条墨迹带时才缩边”,单行文字保持原裁剪,避免对本来没冲突的 OCR 输入做无收益的改动;收紧后又完整重读了 45 张图。
设置
每一轮(v4 基线、实验裁剪、最终 v5)都重新定位并执行真实 CPU OCR,不复用旧 OCR 缓存;8 核限制、串行。45 张图读取时间合计:v4 32.85 秒、实验 33.01 秒、v5 33.00 秒(含读盘,不含模型初始化;不是 App 端到端速度)。
结果
| 材料 | v4 | v5 |
|---|---|---|
| 旧 34 张 | 原有接受/未知/空图 | 全部接受字面保持,没有新增接受 |
| 新 11 张中预先登记的 14 个字面 | 接受 3 个 | 接受 5 个,新增两个都符合登记 |
| 新 11 张中未接受的已知字面 | 11 个 | 9 个:8 未知、1 未检出 |
| 两张书页的已确认左侧条带 | 无提议 | 无提议 |
唯一改变接受值的图是 16:57 录像 587.2 秒的那一帧:“拳头 −314”和“骷髅 −5”从“共享文字区域、歧义”恢复为候选,目视完整原图和局部框核对无误。
接入 App 实际链路验证:01:39 录像 552.8 秒那一帧仍然未知;16:57 录像 587.2 秒那一帧读回 −314/−5。原来的 SE(状态估计)请求与结果保持不变,明确没有重算。相关软件测试:Perception 侧 78 项、App 侧 50 项通过。
失败与负结果
仍未解决的情形(都保留为未知):552.8 秒两个飘字左右横向串在一个框里;552.2 秒文字与背景粘连;610.4 秒和 673.6 秒负号漏读;406.4 秒文字重叠;586.6 秒笔画不足;1157.8 秒骷髅图标漏检。
过程中的失败:第一轮实验脚本把字符串传给要求路径对象的读图函数,在读第一张图前就失败;修正后用新目录完整重跑,旧失败目录保留。首次合同测试缺 App 源码路径,69 项通过/2 项导入失败,设置后通过;没有安装新依赖。
局限
- 只是开发样例上的局部修复,不能外推整局召回率。
- 外部审阅指出一个风险:弱笔画可能低于现有的墨迹阈值(> 35),在缩边时被裁掉。本实验的“空白行”只表示在现有阈值下没有前景,不能证明原彩色图上没有字符笔画;两种尺寸用同一引擎读出一致,也不足以排除这种误读。这是待验证的风险,还没有在实图中出现过。
- 没有自动遮挡认证、单位归属、同一飘字跨帧去重或属性推断。
结论与下一步
v5 保留:它只在确有相邻墨迹行、又有清晰空白分隔时改动裁剪,恢复了 2 个字面且没有改变任何旧结果。根据外部审阅建议,下一步暂缓继续微调 OCR,转去做状态估计的时间关联实验:固定三个已有窗口(587.1–587.2 秒的拳头/骷髅并列、595.6–596.1 秒重复的 −27、552.2–553 秒变化的字面),只用真实媒体时间、行动顺序、可见单位的身份/位置/数量和已接受的字面去建立“这个飘字属于哪次攻击”的候选;单凭时间相近、数值相等或离某单位最近,都不能确认为同一事件。也暂不做“结果不变就降低分析频率”,因为输出不变不等于状态稳定。
Comments