摘要

之前的伤害反推实验(P122)结论是:要推准对方的技能装备,必须知道每次行动前的完整战场状态。用户随后选定这条根本路径。本实验(内部编号 B143)回答:给一张战斗截图,能否读出战场上每个“兵堆”(一格上同一种生物的一组单位)的四件事——站在哪一格、属于红方还是蓝方、数量多少、是什么兵种?

做法是把三个已有的读取器组合起来:数量牌(每个兵堆脚下显示数量的小牌子,边框颜色表示阵营)、行动条(屏幕底部按行动顺序排列的卡片,带兵种图案、数量和颜色)、生物身体识别(在战场上框出生物形象并判断兵种的模型)。开局截图上逐兵堆全对率达到 91.1%,但中后段战斗只有 76.8%–79.8%。

要回答的问题

单张截图上,逐兵堆“格子、阵营、数量、兵种全部正确”的比例能达到多少?哪些因素限制了它?

数据与来源

  • 开局集:51 帧、578 个兵堆,由并行标注助手逐帧看原生像素标注(单人复核,不是独立人工真值)。按截图包划分:训练 28 帧 328 个兵堆,测试 20 帧 224 个(开发验证用),另 3 帧 26 个只作训练参考。
  • 中后段集:从 24 段截图包录像补标 74 帧、911 个兵堆:训练 44 帧 549 个,测试 30 帧 362 个;另列出 101 具尸体(不算兵堆)。
  • 冻结留出材料和九月留出来源均未打开。

方法

几个已验证的事实:

  • 镜头固定:早先实验留下的一个网格映射矩阵,叠画到 21 张布阵图和 24 张战斗图(雪地、熔岩、草地、不同对局)上都与游戏的六边形格子对齐,所以 137 格棋盘只需要一个矩阵。
  • 格子底色(红/蓝)在雪地和熔岩地图上误判多,不单独使用。
  • 数量牌位置固定:在 48 张图上读到 523 块牌,牌中心 ≈ 格中心 + (−4.9, +33.6) 像素,因此每块牌能唯一落到一个格子。

逐步加入的版本:

版本 内容
v1 数量牌 → 格子、数量、阵营;兵种用行动条上“同色同数量唯一”的卡片匹配
v2 + 身体检测/身份模型补未知兵种
v3 + 没有数量牌的身体也补成兵堆;未读数量用同帧行动条补
v4 + 竞技场固定初始数量表(推算)
v5 + 在预期位置探测被漏掉的数量牌;“按数量改判兵种”只限布阵;用同局更早截图补阵营色

v4 的依据:竞技场每个兵种的初始数量是安装数据里的固定值(141 种),同族基础与升级形态数量不同(例如米诺陶 50、升级 36)。若身体给出的兵种与读到的数量不符,而前 3 名候选中恰有兵种的表值等于该数量,就改用它;布阵截图中兵种已知、数量没读到时填表值。表值是计算值,不是观察,下游必须保留来源。

所有规则选择只看训练标注,冻结后在测试上评一次(v1/v2 的测试汇总曾被看过,测试不算完全未触碰)。

设置

“全对”= 格子、阵营、数量、兵种全部等于标注;漏检 = 标注格上没有输出;多报 = 输出格不在标注中。生产模块(组合与推算)在 Perception 和状态估计(SE,把观察累积成对局状态和对手构筑推断的模块)中各自实现,并接入 App 的“敌方推断”页签,默认使用常驻子进程(模型只加载一次)。

结果

开局集:

版本 训练全对 测试全对 测试漏检 测试多报
v1 159/328(48.5%) 91/224(40.6%) 13 0
v2 286/328(87.2%) 191/224(85.3%) 13 0
v3 304/328(92.7%) 199/224(88.8%) 3 0
v4 310/328(94.5%) 204/224(91.1%) 3 0

v4 测试分字段:数量 215/221、兵种 213/221。按来源看,数量牌直接读数 202/203 对,同帧行动条补 5/5,表值推算 8/9(错的那个是兵种先错了)。

中后段集(冻结 v4 生产路径评一次):

划分 全对 漏/多 阵营 数量 兵种
训练 549 421(76.7%) 21/4 455 439 501
测试 362 278(76.8%) 4/3 294 287 346

v5(训练上选择,测试各评一次):

测试集 v4 v5
开局 224 203(90.6%) 201(89.7%)
中后段 362 278(76.8%) 289(79.8%):阵营 294→344,数量 287→297
合计 586 481(82.1%) 490(83.6%)

(开局 v4 这里是 203 而不是 204:生产模块在同一格读出两块牌时保留离预期位置更近的那块,与实验脚本差 1 个。)

军队层面:把每局截图按时间串起来,列出敌方兵种。规则:兵种由行动条/表值推定、或在两张以上截图出现、或身体分数 ≥0.5 才算“已佐证”,其余单列“待核对”。测试 10 局:全部列出准确率 70/73(95.9%)、开局部队召回 68/70;只计已佐证 70/72(97.2%)。

延迟(有并行负载,仅参考):常驻服务热启动后每张中位 1.69 秒、p95 2.09 秒;App 走服务路径约 1.1–1.5 秒;首张含冷启动 14–42 秒。

失败与负结果

  • 否决“用整局兵种名单纠正身体身份”:训练上 2 处改对、7 处改错。原因是行动条只显示 13 张卡,满编 14 队时总有一队不在行动条上,名单外的身份往往是对的。
  • v4 的“数量等于表值就改判兵种”在中后段改对 6、改错 7,v5 因此限制在布阵阶段,代价是开局测试兵种 213→208。
  • 数量牌探测原型放宽位置后颜色错 11,已收紧。
  • 曾试“同格两块牌时优先保留读出数字的那块”,对唯一一例无效,已撤回;这是看过测试样例后的检查,不算新测试结果。
  • 剩余错误:被挡住的数量牌(身体、翅膀、火墙、预览、光标)无从读数;身体模型低分时混淆升级形态(如黑龙/黑龙升级);漏检多是牌和身体同时被遮挡。布阵截图没有行动条,部分数量要靠同局后续截图累积,这属于状态估计的职责,单张图保持未知是正确行为。

局限

标注是单人助手复核,不是独立人工真值;测试集不是完全未触碰;没有跨更多对局的独立留出;延迟没有在无竞争负载下正式测量。逐兵堆全对率远低于 95%。

结论与下一步

开局截图已经能读出大部分战场状态,中后段因遮挡大幅下降。下一步是同局多张截图之间的累积:数量变化加上日志伤害行,用于联合推断对方加成;以及尸体、障碍和局部数量牌探测。