摘要
战场上每个兵堆脚下有一块彩色小牌子(数量牌),红色或蓝色表示阵营,上面的数字是这一堆生物的数量。读准数量牌,就能在两次行动之间算出减员。现有读取流程(项目内称 A25 基线)在 4 张开发图、38 个可读目标上能读对 35 个。
本实验(编号 A26)分两部分:
- 试一个新的数量牌裁剪候选:只保留牌面彩色区域、把牌子外面的像素替换成牌面颜色,希望去掉背景和特效干扰后再交给 OCR。规则和参数在看图前冻结。结果在跑 OCR 之前就失败了:40 个已有候选只保留 14 个,两张雪地图全部被拒;就算保留的 14 个全读对,最多也只有 14/38 = 36.84%,已经低于基线的 35/38。负责人否决了第二阶段,没有做任何 OCR,也不再调参。
- 新增 8 张原图的完整数量牌参考:105 个可见数量牌区域,98 个可读、7 个不可读。负责人抽查后接受。它们是扩充的已曝光来源,不是认证过的盲测集。
要回答的问题
一个只依赖原始像素和已有牌框位置的“牌面裁剪”,能否在不丢目标的前提下给 OCR 提供更干净的输入?
数据与来源
- 裁剪检查:只解码 A25 的 4 张 2560×1440 原图,使用它们已保存的 40 个牌框候选,不重新检测。
- 新参考:8 张已有的原生截图,每张来自不同的录像;排除了 A24 用过的草地/雪地来源、旧调试来源和已知的续接录像。全部以前被其他读取器或人工看过,不是认证留出集。前 4 张拟作开发扩充,后 4 张拟作来源验证(待负责人决定)。
方法
冻结的裁剪规则(在任何图像检查之前提交):
- 输入只有原始 BGR 像素、已保存的牌框和算法给出的红/蓝外观。
- 用已有的 HSV 颜色区间找牌面填充;要求填充比例 ≥ 0.25、最大连通块占比 ≥ 0.70、牌面宽 ≥ 牌框 0.50、高 ≥ 0.45。
- 填充牌面外轮廓(以保留浅色数字的“孔”),外扩 1 像素,裁到牌框内;牌面以外的像素替换为观测到的牌面中位色。
- 颜色未知、填充不足、碎片化或过窄 → 未知、不裁剪。牌面外有浅色形状(可能是特效,也可能是被截断的真实数字)→ 也判未知。
- 不用 OCR、数字个数、数量范围、参考框、身体、卡片或面板作为输入;没有后备方案;看完 4 张开发图后不再调整。
新参考标注:选图前先看来源记录,冻结时只读 PNG 头信息。之后逐张以原生分辨率人工查看,列出所有可见的脚下数量牌(包括读不出的),数值来自牌上字形,从不取自旧 OCR、行动条或兵种名单;完全被挡住或在屏幕外的单位不重建。手工框表示带边距的文字区域,不是精确掩膜。
设置
0 次新候选检测、0 次 OCR/模型调用、0 次 GPU 调用;OpenCV 使用 2 个 CPU 线程,裁剪数组只在内存中,不生成新图片。4 张图解码共 0.146558 秒,裁剪处理 0.005128 秒(不含启动和人工查看)。
结果
裁剪候选
| A25 原图 | 候选 | 保留裁剪 | 判未知 | 可读目标中被保留 |
|---|---|---|---|---|
| 草地 1 | 13 | 9 | 4 | 9/13 |
| 雪地 1 | 13 | 0 | 13 | 0/12 |
| 草地面板 | 7 | 5 | 2 | 5/7 |
| 雪地面板 | 7 | 0 | 7 | 0/6 |
| 合计 | 40 | 14 | 26 | 14/38 |
被拒的 26 个中,24 个因为“牌面外有浅色形状”,2 个因为“多个颜色区域、找不到可靠牌面”。浅色形状规则把雪地和背景里普通的浅色像素也当作威胁,所以雪地图全军覆没。事后(只为覆盖率统计)对照已保存的目标分配:保留的裁剪覆盖手工区域的 53.80%–82.76%,但这既不能证明数字完整,也不能证明被截断——主要失败已经是覆盖率太低。
新参考(8 张图)
| 原图 | 拟议用途 | 可见数量牌 | 可读 | 不可读 |
|---|---|---|---|---|
| 10 月 1 日 18:13 | 开发 | 14 | 13 | 1 |
| 10 月 1 日 17:49 | 开发 | 14 | 13 | 1 |
| 10 月 1 日 00:44 | 开发 | 14 | 14 | 0 |
| 10 月 1 日 00:23 | 开发 | 14 | 14 | 0 |
| 9 月 30 日 23:33 | 验证(待定) | 14 | 14 | 0 |
| 9 月 29 日 22:15 | 验证(待定) | 14 | 13 | 1 |
| 10 月 1 日 20:52 熔岩图 | 验证(待定) | 7 | 6 | 1 |
| 熔岩开局 | 验证(待定) | 14 | 11 | 3 |
| 合计 | 8 段不同录像 | 105 | 98 | 7 |
105 个牌子中红色 56、蓝色 49,颜色都能直接区分;98 个可读数量中一位数 3 个、两位数 72 个、三位数 23 个。7 个不可读是被生物、装备、盾牌或鼠标完全挡住。负责人打开全部 8 张原图,独立核对了 38 个可读数量和全部 7 个不可读,接受这份参考。
失败与负结果
- 裁剪候选在 OCR 之前就因覆盖率上限(36.84%)低于基线(35/38)而被否决;第二阶段未批准,不做 OCR、不调参、不换候选。
- 第一次运行“已保存结果验证器”时失败:Python 的整数键在 JSON 中变成了字符串键。修正的是只读元数据比较器本身,没有改动任何推理、参数、原始决定或人工数值;之后验证通过,并增加了 JSON 往返断言。
局限
- 被规则拒绝不代表那 24 个目标不可读,它们仍留在分母中。
- 8 张新参考是已曝光来源的扩充,认证过的独立盲测对局为 0;不覆盖整图的界面、身体、身份或关联。
- 10 项软件测试通过只验证合成数据上的边界行为,不证明人工标签或识别准确率。
结论与下一步
“把牌面以外抹掉”这条路在雪地和浅色背景上过于保守,无法超越现有基线,已结案。新得到的 105 个数量牌参考可留给今后另行授权、另行冻结的基线评估使用。如果需要一个真正未见过的数量盲测集,建议的最小采集是:4 段新的、未曝光的对局录像,每段 1 张批准的原生战场帧,每帧至少 13 个可读脚下数量、总计 ≥ 50,在任何读取器运行前冻结来源与参考——这只是提议,未执行。
Comments