摘要

这款回合制战棋游戏的战场是一块由 137 个六边形格子组成的棋盘。玩家选中一支部队时,游戏会用黄色或绿色的细线勾出一片区域(例如可以走到的范围),地图上还有岩石之类的障碍,移动时会出现一条白色虚线路径。本实验想让程序只看截图像素和一份已校准的格子位置表,就回答三件事:哪些格子有可见障碍、哪些格子落在黄/绿轮廓里面、白色路径大致在哪里。

这是一个多轮的开发研究(原编号 B07,2026 年 9 月 8 日迁移为 B16)。主要结果:

  • 障碍物:小样本试点里学习型分类器测试 F1 85.7%;但在三段全新录像上用冻结模型检查,F1 只有 65.5%,雪地场景完全失败。
  • 高亮区域:从简单颜色阈值,到“先找轮廓边、再判断格子在不在里面”,再到学习“这条边是不是轮廓”的分类器;最后一次冻结检查(10 张图、2 段录像)黄色召回 97.1%、绿色 97.5%,已知格子上零误报。但重叠区样本来自同一局的两张图,雪地黄色没有出现在最终检查里。
  • 白色路径:只做了探索,精确率很低。

所有标签都是助手看原图画的草稿,等待用户审核;程序只给出“视觉候选”,不保证走法合法,也不判断颜色代表哪一方。

要回答的问题

  1. 一个格子的地面上有没有可见的固体障碍物?
  2. 一个空格子是否在黄色或绿色轮廓圈出的区域里面?两种颜色能否分开?
  3. 白色路径线大致经过哪些地方?
  4. 这些判断换到没见过的录像上还成立吗?

数据与来源

  • 输入是原始录像截图(统一缩放到 1920×1078)加上一项前序实验审核过的 137 格网格投影。程序看到的是原图,不是标了编号的检查图。
  • 试点数据:20 张截图,9 训练 / 3 验证 / 8 测试,同一段录像只出现在一个分区。测试集只来自 3 段录像。
  • 标签规则:只给“看得清”的格子打分,没标的格子是“未知”,不算负例。障碍指格子地面上可见的固体环境物体,不是游戏内部的碰撞表;生物是明确的负例。高亮区域指黄/绿轮廓并集内的空格子;选中部队脚下的圆环、蓝/红目标格是别的界面信号,不算。被遮挡的格子一般不标。
  • 后续扩展:全部 21 段竞技场录像(约 17.2 小时)都有粗时间线;陆续增加的颜色标注最终达到 84 张图、21 组录像,其中 74 张用于训练和选择。
  • 所有标签都是助手视觉草稿,尚未人工审核(不是 REVIEWED)。

方法

第一步:试点(障碍 + 区域 + 路径)

每个任务比较三类方法:简单像素统计;考虑几何的统计(区域:把彩色证据吸附到六边形边上再填充封闭区域;障碍:把凸起物纹理和周围地面比较);学习型小块外观分类器(ExtraTrees 随机树、线性/RBF 支持向量机,按验证集 F1 选择)。不使用预训练大模型。

第二步:高亮区域 v2——先找边,再投票判断“在不在里面”

简单颜色统计的问题是:区域内部的格子几乎没有颜色,颜色只在细细的轮廓线上;而“轮廓完全闭合才填充”的规则只要缺一条边就整块失败。v2 换成:

  1. 把像素转到 HSV 色彩空间,按色调分出黄、绿两类(这只是外观类别,不代表敌我)。
  2. 计算“对立色强度”(例如黄色 = min(R,G) − B),要求候选轮廓线比两侧都明显,从而压制大片均匀着色的地面。
  3. 在网格的 456 条边上各采样 24 个点,判断这条边是否是轮廓边。
  4. 从每个格子中心向 18 个方向发射射线,穿过奇数条轮廓边就投“在里面”一票;至少 40% 的方向投票才判为在内。这样少几条边不至于整片区域消失。投票比例只是一致程度,不是校准过的概率。

参数在 60 种组合里按验证集选择,先冻结配置,再由另一位标注者放出 8 张保留图做测试。

第三步:十一种颜色/线条方法对比

用 24 张已标注图、按录像留一交叉验证,比较了放宽黄色色调范围、软颜色、Lab 色彩空间、多尺度、Top-hat、Canny、共享边补全、逻辑回归边分类器、ExtraTrees 边分类器等 11 个版本。

第四步:按颜色分别建模的线条 + 网格求解

黄色用局部背景加“黄色半透明叠加”拟合,绿色用软颜色加两侧对比;每条边选一个统一的法向偏移;再对每种颜色解一个小的整数优化问题(让“格子在内/在外”与“边是否为轮廓”在异或关系上尽量一致)。

第五步:学习型轮廓边分类器 + 新录像

从四种线条剖面、两种颜色各提取 12 个统计量,共 96 个特征,训练 ExtraTrees 判断一条边是不是轮廓。为了分清“换算法”和“加数据”的贡献,用完全相同的设置分别在 53 张和 74 张图上训练,再在 10 张保留图上比较。

设置

  • 障碍/区域指标都是稀疏格子判断的精确率、召回率、F1,不是整幅分割的 IoU;同一局的多张截图彼此相关,不是独立试验。
  • 路径指标:中心线 10 像素容差,离标注远的预测长度算误报。
  • v2 的测速:56 张已缩放图、缓存网格,CPU 中位 44.9 毫秒;第四步约 290 毫秒;第五步约 0.405 秒。都不含视频解码、缩放和网格构建,不是端到端延迟。

结果

试点(8 张测试图)

任务 / 方法 TP FP FN 精确率 召回率 F1
障碍 · 简单统计 27 35 75 43.5% 26.5% 32.9%
障碍 · 几何统计 20 73 82 21.5% 19.6% 20.5%
障碍 · ExtraTrees 99 30 3 76.7% 97.1% 85.7%
区域 · 简单统计 335 118 26 74.0% 92.8% 82.3%
区域 · 几何填充 266 42 95 86.4% 73.7% 79.5%
区域 · RBF SVM 361 161 0 69.2% 100% 81.8%

学习型区域模型把测试中所有已标注格子都判为“在内”(真阴性 0),召回 100% 只是这个原因。103 个生物格负例中,学习型障碍模型误判了 23 个。

一个三帧的“新岩石出现”案例:5 个新岩石格在“学习分数变化”排序的前 5 名里全部出现,而原始像素差只有 2 个进前 5。原因(是否由死亡触发)没有核实,只是案例研究。

障碍:冻结模型换到三段新录像

任务 TP FP FN 精确率 召回率 F1
障碍 ExtraTrees(20 张新图) 171 29 151 85.5% 53.1% 65.5%
区域 RBF SVM(18 张有区域标签) — — — — — 60.9%

同一段录像的 3 张雪地图漏掉了全部 57 个障碍正例。

高亮区域 v2(8 张冻结后保留图,743 个格子判断)

层 TP FP FN 精确率 召回率 F1
黄+绿并集 364 0 2 100% 99.45% 99.73%
黄色层 31 21 64 59.62% 32.63% 42.18%
绿色层 340 0 12 100% 96.59% 98.27%

同样的标签上,旧 HSV 方法 F1 66.08%,旧闭合轮廓方法 68.58%,“全部判在内”是 66.01%。64 个黄色漏检全部来自一张雪地图:宽绿色区域里包着一圈细黄色边界。并集分数高掩盖了颜色没分开。

十一种方法(24 张图、按录像交叉验证,回顾性)

没有任何版本两种颜色都做到精确率和召回率 ≥ 90%。只把黄色色调上限从 40 放宽到 57,就能把那张雪地图从 0/64 修到 64/64(1 个误报),但全部 24 张图黄色精确率仍只有 70.5%。ExtraTrees 边分类器黄色 F1 最高(84.4%),逻辑回归绿色最高(96.3%),但两者都漏掉那张雪地图的全部 64 个黄色正例。

按颜色建模 + 网格求解(第二次冻结检查,9 张图)

方法 黄色 TP/FP/FN 黄色 P/R 绿色 TP/FP/FN 绿色 P/R
原 HSV + 射线投票 178/60/96 74.8%/65.0% 127/1/48 99.2%/72.6%
放宽黄色色调 180/55/94 76.6%/65.7% 127/1/48 99.2%/72.6%
按颜色线条 + 网格求解 261/0/13 100%/95.3% 162/1/13 99.4%/92.6%

但第一次冻结检查(20 张图)绿色召回只有 79.0%,其中 120 个漏检来自两张草地图,这个失败被原样保留。两色重叠区仍只有 27 TP / 1 FP / 18 FN(召回 60.0%)。

学习型边分类器:只差训练数据的对比(10 张保留图、927 个已知格子)

方法 黄色 TP/FP/FN 黄色 P/R 绿色 TP/FP/FN 绿色 P/R
旧规则 + 网格 177/0/170 100%/51.0% 156/1/159 99.4%/49.5%
同样的树,53 张图训练 310/0/37 100%/89.3% 286/0/29 100%/90.8%
同样的树,74 张图训练 337/0/10 100%/97.1% 307/0/8 100%/97.5%

多 21 张训练图,黄色漏检 37→10、绿色 29→8,没有新误报。重叠区 145/0/15(召回 90.625%),但 160 个重叠正例全部来自同一局的两张红色地面图;所有黄色正例只来自一段录像,最终检查里没有雪地黄色。

白色路径(探索)

两张测试路径图来自同一段录像。例如其中一张:霍夫直线法召回 83.1%、精确率 7.5%;按网格中心采样召回 71.6%、精确率 20.6%。只能说明在已标注的那一段附近有响应,不是完整路线正确率。

失败与负结果

  • 障碍模型换录像后召回从 97.1% 掉到 53.1%,雪地场景全军覆没。这是冻结方法的跨录像失败,不是新数据训练的收益。
  • 试点学习型区域模型实际上是“全判为在内”。
  • 第一次冻结检查草地绿色大量漏检。
  • 尝试过但没采用的探针:放松负边权重(重叠 TP 35,但误报 81)、直线斜率搜索、几种响应函数(黄色精确率掉到 45.1%,或重叠误报 194 个)。
  • 用“移动距离形状”做硬约束的探针反而更差:在 74 张开发图上总错误从 61 增加到 305。诊断发现这个探针并不知道部队真实的起点和步数,而是在全图任意位置找一个距离形状,常被部队脚下的选中圆环吸引;在一张图上,正确形状只以 0.339 的分数之差输给错误形状。所以这不能证明“已知起点的移动约束没用”。软几何约束在一张图上找回了 7 个绿色格且没有已知误报,但仍属开发数据。
  • 一处标注更正:放大原图发现有一条“白色路径”其实是绿色虚线,因此删掉这一路径标签及其指标,其他标签、模型和阈值都不变,更正前的结果另存保留。

局限

  • 所有标签是助手草稿,未经人工审核;同一局多张图高度相关;保留录像数很少。
  • 前面检查过的图都已参与过方法设计,后来的数字很多只能算开发结果。
  • 只看单张图,不推断颜色归属哪一方、悬停触发原因或走法合法性;被占用格、选中圆环被手动排除,没有被测试。
  • 速度只测了特征和求解部分。

结论与下一步

“先找轮廓边、再判断格子在不在里面”的思路,加上学习型边分类器和更多数据,已经能在保留图上把黄/绿区域找得相当准;障碍检测在新场景(尤其雪地)上明显不够。下一步最有价值的不是在同一个轮廓附近多标几个格子,而是:用户审核现有草稿、收集真正不同的战场布局、雪地黄色样例、受控的悬停前后对比,以及自动遮挡判断的评估。