摘要

游戏战场上每一个兵堆(一群同种单位,作为一个整体行动)的脚下有一块小数量牌,上面写着这个兵堆还剩多少个单位。两次行动之间读出每块数量牌的变化,就能推算伤亡。

上一轮实验(内部轮次 r18)已经在用户框选的区域里读出了数量文字,但只得到“这里有个数字 8”,并不知道这个 8 属于哪块牌、哪个兵堆。本轮的问题是:在同一帧里,能否把一个数量文字连到一块可见的数量牌,再连到牌上方的兵堆身体,形成一条没有竞争对手的几何链?

做法是在已有结果上组合三个现成的读取器:数字文字框、数量牌检测、兵堆身体检测。对比两种找牌的方式:

找牌方式 10 个已接受数字中形成唯一链的个数
旧规则路径(由已读数字推导牌的搜索框) 9
已有的学习型数量牌检测器 10

多出来的一条来自一块旧规则路径没有找到、学习型检测器找到了的牌。这是本次选定数字的关联覆盖数,不是识别准确率,更不是“10/10 正确”。“唯一”只表示在当前检测到的框集合中没有竞争关系,不代表认证了真实单位、阵营或跨帧身份。

要回答的问题

  • 同一帧里,数量文字能否可靠地连到某块数量牌、再连到某个兵堆身体?
  • 一个独立训练的数量牌检测器能否缩小候选、补上规则路径的缺口?
  • 如果连不上,缺的是什么具体视觉线索?

数据与来源

  • 两段用户指定的训练录像(10 月 10 日 16:57 和 01:39),都是已暴露的开发资料,不是独立留出测试。
  • 只用已保存的 5 张原图:16:57 录像同一时间窗(内部称 W1)的 4 张,以及 01:39 录像第 553 秒的 1 张。
  • 输入是上一轮全部 13 份数量读取回执(包括空窗、顶部状态栏和负数对照,不能只取成功的):11 个窗口有文字、2 个窗口没有文字,共 13 个文字框,其中 10 个接受了字面值,3 个拒绝或未知。
  • 没有重新识别数字、没有解码视频、没有训练模型。开发答案只用来核对,不作为模型或关联的输入。

方法

  1. 兵堆身体:W1 四张图复用更早一轮已有的身体检测结果(共 53 个身体候选);01:39 那张图用已有的身体检测模型在 CPU 上补读一次(13 个身体),阈值不变。身体的兵种分类排名只做检查,不参与关联选择。
  2. 数量牌,两条路径:
    • 规则路径:已有的“数字证据”方法,根据读到的数字反推牌的搜索框。
    • 学习型路径:已有的学习型数量牌检测器,沿用旧验证时选定的门槛 0.1 和非极大值抑制(NMS,把重叠框去重的步骤)设置,CPU 运行,不调整、不重训、不下载。 两种框都不是人工认证的完整牌边界。
  3. 几何关联:沿用已有的“保留全部几何候选”方法——全图所有牌与身体的配对边都保留,不按最高分、数字大小、颜色、预期兵种或最近距离择一。文字到牌的连接条件预先固定:文字中心在牌框内,且文字面积至少 80% 在牌框内。一个文字对多块牌、一块牌对多个身体、多个身体对一块牌,全部保持为竞争关系。
  4. 状态估计侧(SE,把读到的观察累积成对局状态和对手构筑推断的模块)只消费保存下来的同帧 JSON,并核对原图、原录像和实际解码时点。“唯一”只指当前检测集合中互不竞争的一条链。

验收与停止条件(运行前写定):本轮必须得到一个可区分的结论——独立牌检测缩小了候选,或找到假唯一的反例,或指出具体缺失的视觉线索。若两条路径都恢复不了牌,就停止叠加阈值和换模型。

设置

  • 计算串行,限制在 8 个物理核内运行;模型和 SE 关联各只运行一遍。
  • 结果作为可删除的临时数据保存在对应录像的分析目录,附原视频链接、原始模型输出和可查看的 HTML;原图与原视频只引用、不移动。

结果

关联覆盖

来源 / 输入 规则路径唯一链 学习型路径唯一链 仍未知
W1 四图,7 个接受字面 6 7 中间一张右侧没有文字;2 个顶部状态栏文字和一个 −314 不进入牌链
01:39 来源,3 个接受字面 3 3 没有生成阵营、持久编号或事件归属
合计 10 个接受字面 9 10 另 3 个未知文字都没有对应的牌;2 个空窗保持未知

全图上规则路径共提出 58 块牌、学习型 68 块。本轮没有全图人工标注,所以不能据此比较两者的误报率或召回率。

补上的那块牌

W1 第一张图里的数字 8:学习型检测器给出牌框 [2231,1142,2301,1182],文字在框内,检测分数 0.8643(未校准的模型分数,不是概率)。在固定几何条件下,这块牌只连到当帧的一个身体,该身体也没有别的合法牌竞争;规则路径没有找到这块牌。相邻的数字 12 连到另一个身体,选择不依据数值或兵种排名。后两张图里的数字 3 各连到当帧的一个身体——不同帧的身体编号没有跨帧身份含义。

01:39 来源同一搜索窗里有 48 和 60 两个数字,由两块实际检测到的牌分开,各连到一个身体;一块蓝色牌上的 10 连到第三个身体。两条红牌关系都保留,没有挑一个“期望数字”覆盖另一个。

目视检查

逐张查看了 6 张局部叠框图(W1 四张、另一来源两张)和两段的完整原图上下文,文字框、牌框、身体框用不同颜色区分。关注的数字都落在对应的可见牌区域里,牌在相应身体下方,本次局部目视没有发现相邻牌串接。这是助手目视,不是用户复标。

耗时

学习型模型构造一次 0.178 秒,5 次 CPU 预测各 0.165–0.267 秒;另一来源的身体模型加载 1.347 秒;整个运行进程约 5.38 秒;SE 几何组合两来源分别 0.0051 / 0.0010 秒。这些是局部测量,不含完整 App、进程通信和 OCR,不是整帧热启动 p95。

软件检查

  • 新增 22 项“不利情况”测试通过,连同旧的同堆空间实验共 46 项(0.11 秒):数字、颜色、兵种分数不能改变关联;多身体、多牌、多文字、请求窗外的竞争牌、坏来源、坏时点、坏坐标与空窗都有覆盖。
  • 已有的数量牌模型适配、几何边、空间关联、规则路径与数据集相关测试 59 项通过(0.78 秒)。
  • 对保存结果做只读复核:两来源 10 组方法 / 帧结果与当前 SE 算法重算一致;改变所有真实读数、颜色和身体身份排名后,10 组关联保持不变;原图元数据未变。

软件测试不证明识别准确率。

失败与负结果

  • 中间帧仍未知:W1 中间那张图(586619.3667 ms),学习型检测器也找到了右侧那块牌,目视能看到运动中的字形,但上一轮的文字检测没有给出文字框。因此该请求保持未知,没有用前后帧的数字补写成 3。缺口已缩小到“数字检测 / 读取”,而不是“牌完全找不到”。
  • 身体分类没变好:该帧身体模型的最高候选兵种分数只有 0.1291,不是被认证的兵种。牌定位改善没有修好身体分类,不能让“唯一几何链”偷偷变成兵种身份。
  • 竞争仍普遍:外部审阅后又只读复查了 W1 第一张图的全图输出,发现 5 块学习型牌的身体关系是“有歧义”:一块牌同时连到两个身体;一个身体同时对应 4 块牌(所以即使某块牌只看到这个身体,也因身体端竞争而不能算唯一);另一块牌下有两个高度重叠的身体检测,没有被擅自合并。如果只保留用户框选区域附近的成功牌,就会丢失这种保护。画面确实密集重叠;这说明竞争关系被保留了,但不能说明假唯一已被排除,本轮也还没有找到独立标注的“漏检身体导致假唯一”的反例。
  • 运行前的工程小错误(字典写法、不存在的路径、命令通配路径)在模型运行前或只读阶段发现并修正,没有改数据。

局限

  • 三个读取器都看同一张原图,不是三份统计上独立的证据;NMS、门槛和身体漏检都可能制造假唯一。
  • 只有 5 张已暴露开发图、10 个接受字面;没有全图人工标注,无法计算召回或误报。
  • 没有可导入 App 的新关联附件,不是已安装产品功能;原 SE 和上一轮读数未改。

结论与下一步

已有的学习型数量牌检测器确实补上了一个规则路径漏掉的中间视觉对象,使 10 个已读数字都形成了检测集合内的唯一几何链;但“唯一”不能升级为实际归属或伤亡结论。

外部审阅建议与本地判断一致,下一轮优先级为:

  1. 先在 App 里做显式关联复核:复用已保存的同帧观察,用独立版本的附件保存文字引用、牌框、身体框、方法、来源和全部竞争边;界面写“观察文字”“可能关联”,不写“已确认单位数量”。验收包括来源与歧义拒绝、这 5 张图的真实竞争、另存 / 导入 / 原图回看,以及取消、换源、迟到结果的防护。
  2. 之后再对中间帧这块已定位的真实牌框做一次有预算的 OCR 补读对照,不为读出 3 而放宽条件。
  3. 最后才考虑跨帧的状态估计,不直接把 8→3 认定为伤亡。