摘要
这款回合制战棋游戏的战场是一块由 137 个六边形格子组成的棋盘。玩家选中一支部队时,游戏会用黄色或绿色的细线勾出一片区域(例如可以走到的范围),地图上还有岩石之类的障碍,移动时会出现一条白色虚线路径。本实验想让程序只看截图像素和一份已校准的格子位置表,就回答三件事:哪些格子有可见障碍、哪些格子落在黄/绿轮廓里面、白色路径大致在哪里。
这是一个多轮的开发研究(原编号 B07,2026 年 9 月 8 日迁移为 B16)。主要结果:
- 障碍物:小样本试点里学习型分类器测试 F1 85.7%;但在三段全新录像上用冻结模型检查,F1 只有 65.5%,雪地场景完全失败。
- 高亮区域:从简单颜色阈值,到“先找轮廓边、再判断格子在不在里面”,再到学习“这条边是不是轮廓”的分类器;最后一次冻结检查(10 张图、2 段录像)黄色召回 97.1%、绿色 97.5%,已知格子上零误报。但重叠区样本来自同一局的两张图,雪地黄色没有出现在最终检查里。
- 白色路径:只做了探索,精确率很低。
所有标签都是助手看原图画的草稿,等待用户审核;程序只给出“视觉候选”,不保证走法合法,也不判断颜色代表哪一方。
要回答的问题
- 一个格子的地面上有没有可见的固体障碍物?
- 一个空格子是否在黄色或绿色轮廓圈出的区域里面?两种颜色能否分开?
- 白色路径线大致经过哪些地方?
- 这些判断换到没见过的录像上还成立吗?
数据与来源
- 输入是原始录像截图(统一缩放到 1920×1078)加上一项前序实验审核过的 137 格网格投影。程序看到的是原图,不是标了编号的检查图。
- 试点数据:20 张截图,9 训练 / 3 验证 / 8 测试,同一段录像只出现在一个分区。测试集只来自 3 段录像。
- 标签规则:只给“看得清”的格子打分,没标的格子是“未知”,不算负例。障碍指格子地面上可见的固体环境物体,不是游戏内部的碰撞表;生物是明确的负例。高亮区域指黄/绿轮廓并集内的空格子;选中部队脚下的圆环、蓝/红目标格是别的界面信号,不算。被遮挡的格子一般不标。
- 后续扩展:全部 21 段竞技场录像(约 17.2 小时)都有粗时间线;陆续增加的颜色标注最终达到 84 张图、21 组录像,其中 74 张用于训练和选择。
- 所有标签都是助手视觉草稿,尚未人工审核(不是 REVIEWED)。
方法
第一步:试点(障碍 + 区域 + 路径)
每个任务比较三类方法:简单像素统计;考虑几何的统计(区域:把彩色证据吸附到六边形边上再填充封闭区域;障碍:把凸起物纹理和周围地面比较);学习型小块外观分类器(ExtraTrees 随机树、线性/RBF 支持向量机,按验证集 F1 选择)。不使用预训练大模型。
第二步:高亮区域 v2——先找边,再投票判断“在不在里面”
简单颜色统计的问题是:区域内部的格子几乎没有颜色,颜色只在细细的轮廓线上;而“轮廓完全闭合才填充”的规则只要缺一条边就整块失败。v2 换成:
- 把像素转到 HSV 色彩空间,按色调分出黄、绿两类(这只是外观类别,不代表敌我)。
- 计算“对立色强度”(例如黄色 = min(R,G) − B),要求候选轮廓线比两侧都明显,从而压制大片均匀着色的地面。
- 在网格的 456 条边上各采样 24 个点,判断这条边是否是轮廓边。
- 从每个格子中心向 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 个绿色格且没有已知误报,但仍属开发数据。
- 一处标注更正:放大原图发现有一条“白色路径”其实是绿色虚线,因此删掉这一路径标签及其指标,其他标签、模型和阈值都不变,更正前的结果另存保留。
局限
- 所有标签是助手草稿,未经人工审核;同一局多张图高度相关;保留录像数很少。
- 前面检查过的图都已参与过方法设计,后来的数字很多只能算开发结果。
- 只看单张图,不推断颜色归属哪一方、悬停触发原因或走法合法性;被占用格、选中圆环被手动排除,没有被测试。
- 速度只测了特征和求解部分。
结论与下一步
“先找轮廓边、再判断格子在不在里面”的思路,加上学习型边分类器和更多数据,已经能在保留图上把黄/绿区域找得相当准;障碍检测在新场景(尤其雪地)上明显不够。下一步最有价值的不是在同一个轮廓附近多标几个格子,而是:用户审核现有草稿、收集真正不同的战场布局、雪地黄色样例、受控的悬停前后对比,以及自动遮挡判断的评估。
Comments