摘要
之前的伤害反推实验(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%。
结论与下一步
开局截图已经能读出大部分战场状态,中后段因遮挡大幅下降。下一步是同局多张截图之间的累积:数量变化加上日志伤害行,用于联合推断对方加成;以及尸体、障碍和局部数量牌探测。
Comments