在《英雄无敌:上古纪元》的战斗中,知道六边形格子的位置,还不足以决定往哪里走。石头可能挡路,鼠标悬停会显示区域,选择目的地会出现路径;战斗过程中,原本空着的地方还可能长出新的障碍物。这一篇要读懂这些画面变化,把它们放回格子坐标中。

上一轮已经得到一个人工确认过的 137 格战场模板,左下角是 (0,0),向右增加 x,向上增加 y。这次保持网格不动,比较如何识别格子里的内容。原始试验的障碍物模型找到了测试标注中的 99/102 格;但保持模型不变,换到新增 20 张图,只找到了 171/322 格,漏掉近一半。现在两批共 40 张标注图说明:有些外观能学到,但还不能据此可靠理解整张战场。

完整截图和网格位置进入像素分析,分别得到障碍物、范围和路径候选,再用不同录像的标注检验。

图 1。网格负责给位置命名,像素分析负责提供当前画面的证据。两者都不能单独证明某个兵种能走到那里。

1. 障碍物、显示范围和路径是三种不同的信号

程序的输入是一张完整截图,以及每个格子的中心、六个角和 (x,y) 坐标。输出分成三层,避免用一种信号替代另一种。

画面中的信号 这轮要输出什么 容易混淆的东西
石头、树桩、岩壁等环境物体 哪些格子有可见的障碍物外观 兵种、尸体、地面装饰、上方物体的遮挡
黄色、绿色的区域轮廓 哪些空格在显示区域内 草地本身的绿色、选中兵种的小光圈、目标格
白色虚线或线段 画面中可见的路径片段 白色石头、武器、文字和鼠标附近的标记

移动范围尤其需要上下文:当前行动的是谁,鼠标停在哪个兵种上,显示的是自己的范围还是对方的范围?本轮先识别黄绿区域的并集,尚未把两者分别归属到具体兵种。 蓝色、红色或橙色目标格、选中兵种的亮圈也不当作普通范围标注。这样可以先检验区域是否读对,再接上行动者和悬停对象的识别。

“范围外”不能直接翻译成“障碍物”。距离不够、其他单位占位、当前动作不同,都可能让一个空格不在显示范围中。反过来,看到一块石头,也还需要确认它实际占了几个格子。这里的障碍物标签是画面中可见的环境物体占位判断,不是从游戏内部读取的碰撞地图。

2. 从原始 20 张到新增 20 张:数据分别用来做什么

资料调研找到了官方 Wiki 的 范围示例一范围示例二,以及战斗系统说明。这些帮助明确了要观察的信号。实际比较采用本地原始录像中的截图,保留来源和时间位置,便于回到视频检查前后变化。

原始 20 张图覆盖草地、雪地、红土地、熔岩和暗色地形,来自 12 段录像。包括没有大范围高亮的画面、淡色边界、两层区域重叠、密集兵种遮挡,以及一组新增岩石前后的画面。

原始标注包含 1,886 条障碍物判断、1,378 条区域内外判断;同一个格子可以参与两个任务。逐张查看原图、写下格子标签后,才运行分类器。只标记能看清的情况,没标的格子保持未知。新旧两批都是助手标注,尚未经过作者复核;没有对每张图的 137 格都完成确认。

随后盘点了 21 段、约 17.2 小时的实战录像,从原始试验没用过的另外 9 段录像中选出 60 张候选。目前其中 20 张已完成稀疏标注,来自 3 段新录像。它们用于一次保持模型不变的跨录像复测:沿用原来的特征、模型和阈值,只检查换画面后的表现,不参与重新训练或选择。原始测试分数与新增分数的差别,反映的是两批画面的不同。

新增标注包含 1,563 条障碍物判断和 907 条范围判断,跨越五类地形;其中两张的范围太难判断,只评价障碍物。另外 40 张只有场景说明,不参与计分。

数据 已完成的工作 在本文中的用途
原始 20 张 稀疏格子标注 9 张训练、3 张验证、8 张测试
新增 20 张 稀疏格子标注 保持旧模型和阈值不变,检查换录像后的表现
其余 40 张 时间点和场景说明 后续标注候选,不计入任何准确率

下面可以分别选择“原始试验”或“新增复测”,查看 40 张原图、标注和预测。每次只显示一种任务;预测层直接标出误报和漏检。截图保留完整画面,点击“放大检查”后可以继续放大、滚动。

图 2。橙色标注框表示该任务的正例,青色小点表示反例;没有标记的位置不参与评分。预测视图中的粉色是误报,橙色是漏检。标注和预测是两个独立图层。

原始试验按整段录像分组:训练图来自 7 段录像,验证图来自 2 段,测试图来自另外 3 段。原始测试图只有熔岩和草地。训练图用于学习外观,验证图用于选模型和阈值,选择写入文件后才计算测试成绩。

新增复测的 3 段录像与原始 12 段完全不重叠。这些图由助手挑选和标注,多张共享同一场地形,仍然属于小规模开发评估。它能暴露具体失败,还不足以估计整个游戏中的平均表现。

3. 三种独立办法,如何读取同一张图

对障碍物和范围,各比较三种互相独立的办法:读简单像素统计、利用网格几何、学习局部外观。它们不是串联的三步;学习模型没有接收几何填充的输出。三者共用原图、网格和评价格子,路径则在第 6 节单独比较。

同一张完整截图 + 已知的 137 格位置

↓ 分别交给三种独立办法

像素规则数黄绿像素
或明显边缘
网格几何沿格边读范围
比较物体上方与地面纹理
学习局部外观局部图像 → 188 个特征
→ 训练好的分类器

↓ 各自输出格子判断

在同一批有标注的格子上,比较检出、误报和漏检
图 3。每种办法独立读取原图。网格几何的判断不会再送进学习模型;路径线段的比较另见第 6 节。

简单像素规则:先问颜色和纹理够不够

识别范围时,先把颜色转成便于区分色相、饱和度、亮度的 HSV 表示,再数每个格子内部有多少黄绿色像素。超过验证集选出的比例,就判为区域内。识别障碍物时,统计局部裁剪中有多少明显的亮度边缘:岩石通常比平地复杂。

它们都很容易实现,但缺少关键区别:草地也是绿色的,兵种也有复杂的边缘。更麻烦的是,范围经常只在外围发光,内部格子几乎没有颜色变化。局部的一小块颜色未必包含答案。

利用网格几何:先找边界,再恢复内部

范围检测不再逐格只看内部颜色,而是沿已知的六边形边检查,比较格边与邻近地面的黄绿信号。如果一段边有足够支持,就把它补成完整的格边。黄色、绿色分别处理,再填充各自闭合的轮廓,最后取并集。

想象一张草地截图:一个内部格子完全没有亮线,但周围的范围边界围成了一圈,程序仍能把它判到里面。这个办法利用了已有网格;代价是边界被兵种挡住或太淡时,轮廓不闭合,整片内部可能漏掉。反过来,环境中的颜色也可能凑出错误闭环。

障碍物的对应几何尝试更简单:利用投影后格子的大小,比较格子上方与落脚附近的边缘密度。石头的图像会向上伸出地面,可能形成区别于平地的纹理。这仍然只是外观规则,不能区分同样向上伸展的兵种。

学习局部外观:让标注决定哪些组合有用

第三种方法从每个格子附近裁出一小块原图,连同上方可能出现物体的区域一起分析。程序提取 188 个数值,描述颜色分布、粗略的 4×4 空间分布、边缘纹理,以及格子内部与周围的颜色差异。特征不含格子编号、绝对位置或标注图上的字。

然后训练小型分类器,让它学习这些特征如何组合。候选只有三种:ExtraTrees 用许多随机化的决策树投票;线性 SVM 学习一个较简单的分类边界;RBF SVM 允许更弯曲的边界。它们共用原图、特征和分组,验证集选择后,主比较中只保留一个学习模型。没有使用预训练图像大模型。

验证集最终为障碍物选了 ExtraTrees,为范围选了 RBF SVM。接下来要看的不是它们在训练图上是否像样,而是这次选择换到其他录像后是否仍然有效。

4. 三段新录像暴露了哪些失败

这里的精确率问“报出来的目标里有多少是对的”,召回率问“标注的目标找到了多少”;F1 合并考虑这两种错误。

以下分数相对于尚待作者复核的稀疏助手标注计算,未知格子不计分。 它们适合比较当前方法、定位失败,不是最终基准成绩,也不是整幅图的分割准确率。

障碍物:新图的 322 个正例,只找到了 171 个

下表评价的是新增 20 张图上的 1,563 条障碍物判断:322 个正例,1,241 个反例。所有参数沿用原始验证集的选择。

方法 精确率 召回率 F1 检出 / 误报 / 漏检
简单边缘密度 60.5% 55.3% 57.8% 178 / 116 / 144
上方与地面纹理 45.6% 48.8% 47.1% 157 / 187 / 165
学习外观:ExtraTrees 85.5% 53.1% 65.5% 171 / 29 / 151

学习模型仍有较少误报,但这次的主要问题变成了漏检 151 格。简单边缘规则多找到了 7 个正例,却也多报错 87 格;两者各有代价,不能只看检出数量。学习模型的 29 个误报中,26 个来自 241 个明确标记为兵种占位的反例,兵种与环境物体的混淆仍然存在。

原始测试的 F1 是 85.7%(99 个检出、30 个误报、3 个漏检),新增复测为 65.5%。这是不同画面组成上的两次测量,不是同一批图上的算法退步,也不是加训练数据后的改善幅度。它说明旧成绩没有覆盖的画面,确实可能让旧办法失效。

分录像看,学习模型的障碍物 F1 是 72.2%、74.6%、0%。最后一段有 4 张图,其中 3 张是同一场雪地战斗:57 个已标注的冰岩障碍全部漏掉。它在这一组仍有 82.0% 的总体判断正确率,因为反例很多;这正是不能只报“准确率”的原因。

新增复测 more-026 的完整雪地截图,中央与右侧有冰岩障碍组。

图 4。这里标注了 19 个障碍物格子,旧学习模型一个也没检出。图 2 选择“新增复测 → more-026 → 障碍物 → 学习局部外观”可查看全部漏检。more-029、more-030 也来自同一场地,三张图不能算三个独立战场。

这组冰岩的系统性漏检,已经说明原始高分不足以证明方法稳健;三段新录像仍不足以给出整个游戏上的总体 F1。

范围:F1 为 60.9%,全部判为“里面”也有 60.5%

新增图中有 18 张具备范围标签,共 907 条判断:393 条在显示区域内,514 条在外。一个完全不看图片、把所有评价格子都判为“范围内”的对照,就能得到 60.5% F1;学习模型的 60.9% 只略高于它。两张没有范围标签的图完全不参与这一项评分。

方法 精确率 召回率 F1 检出 / 误报 / 漏检
格子内部的黄绿像素 65.3% 57.5% 61.2% 226 / 120 / 167
网格边界闭合与填充 67.6% 31.8% 43.3% 125 / 60 / 268
学习外观:RBF SVM 47.0% 86.3% 60.9% 339 / 382 / 54
对照:所有格子都判为范围内 43.3% 100% 60.5% 393 / 514 / 0

原始测试中,学习模型把所有被评价格子都判成了范围内,F1 为 81.8%,与全正例对照完全相同。新增图上,它不再全部判正,但仍把 514 个范围外反例中的 382 个判断错误;60.9% 的 F1 只略高于全正例对照的 60.5%。这不是一个可靠的区域边界。

几何方法减少了误报,却漏掉 268 个范围内格子。在 more-001 中,大范围绿色轮廓肉眼可见,几何方法仍漏掉全部 47 个标注内格。这说明可见轮廓尚未被恢复;具体原因还需检查颜色证据和边界连接结果。它在原始验证集的 F1 也只有 60.5%,没有被选作范围赢家。

新数据没有证明哪种范围办法已经可用,也没有给出己方和敌方范围的分别归属。它提供了更明确的失败例子,便于下一轮检查边界断裂、背景颜色和悬停语义。

验证集如何选出学习模型?
学习模型 障碍物验证 F1 范围验证 F1
ExtraTrees,300 棵树 79.6% 74.1%
线性 SVM 64.3% 71.8%
RBF SVM 70.6% 77.7%

障碍物使用 776 条训练判断,范围使用 586 条。连续分数的阈值在验证分数的 41 个分位候选中选择;几何范围测试 6 个边缘强度阈值。选择后才计算测试成绩;没有根据测试错误改动格子标签或挑选阈值。这些阈值只属于这次试验。

5. 新增障碍物:比较“像石头的程度”比直接减图更有用

本节的岩石变化案例和下一节的路径成绩沿用原始试验。新增 20 张图尚未标注完整变化事件或路径线,因此没有为这两项增加新的分数。

静态地图模板无法覆盖战斗中新增的障碍。项目收录的游戏资料中,水晶王冠会放置水晶障碍物,崩塌会在目标周围生成岩石,石心能力会在死亡后留下石质障碍。这些机制说明为什么必须观察变化;它们不被用来替截图中的像素作答。资料来源是蕈林兵种原初魔法条目,下面这个录像事件的具体成因尚未确认。

样本 example-18 → example-19 → example-20 来自同一场草地战斗,时间是 09:06 → 10:36 → 16:06,不是相邻帧或完整施法过程。在中间画面,右侧兵种周围出现白色岩石;后面的画面中已经看不到它们。下面保留完整中间截图,右侧靠近兵种的白石就是要检测的新物体。

同场战斗的中间画面:右侧兵种周围出现了一圈白色岩石,左侧与中心的原有地形仍可辨认。

图 5。图 2 中选择“原实验”,依次查看 example-18、19、20,可以检查较早、中间和后续画面。能明确看到的新增岩石标了 5 格,另一个可能的格子被兵种遮挡,保留未知。

第一种比较直接计算同一格子两张裁剪的平均像素差。第二种先分别计算障碍物分类分数,再看分数增加了多少。评价只包括 5 个新增岩石格,以及 77 个前后都标为非障碍的格子,不是整张地图。把这 82 格的变化从大到小排序:

用什么给变化排序? 前 5 名里有多少新增岩石? 其他变化会怎样干扰?
原始像素差 2/5 动画、选中圈和单位外观变化也很显眼
障碍物分数增加 5/5 在这一个例子中,把新增石头排在了前面

这说明“有什么变化”之后,再问“变化后是否更像障碍物”,可能比直接减图更有价值。它只是一个事件的前五名排序结果,不是通用新增障碍物准确率,也没有测定自动报警阈值或持续确认时间。

还缺两类关键证据:独立确认的施法生成障碍物过程,以及具有“石心”能力的兵种从存活到死亡留石的连续画面。本轮没有找到足以给死亡触发过程标注的样本,不能用这一圈岩石代替它。

6. 路径:网格能减少乱线,还不能恢复完整路线

路径比范围更细,而且常常是虚线。先找比附近更亮、颜色较接近白色的细线,再比较两个处理方式:

  • Hough 直线检测:让亮点投票,寻找较长的直线段,不限制它们的位置。
  • 相邻格中心连线:只检查共享一条格边的相邻格子,沿中心连线收集白线证据。这样可以排除许多方向或位置不对的线。

只标注了 3 张图中能看到的白色路径部分;绿色延续段和被遮住的部分没有补画。1 张用于验证阈值,另外 2 张来自同一段测试录像。在 1920×1078 的统一坐标中,预测线距离标注中心线不超过 10 像素算匹配。预测到标注片段以外的线会降低精确率,因此这是可见白线片段的检验,不是整条路径的正确率。

测试截图 Hough 片段 F1 网格连线片段 F1
example-42,草地斜向路径 13.8% 31.9%
example-43,草地折线路径 4.7% 23.7%

限制到网格连线后,草地画面的乱线少了,但短线、暗线仍会漏掉。验证图恰好是一条明显的水平长线,网格方法在那里达到 83.1% F1;换到另外两张就明显下降。这再次说明一张顺眼的示例不足以证明泛化。

另一个实际限制是颜色:example-00 的熔岩路径是绿色虚线,当前白线检测器不支持。初次整理误把它当作白线,放大原图复核后修正了这一标签,把它保留为未支持的例子,不计入白线分数;没有因此重调模型或阈值。完整路径检测必须覆盖它,不能因为它不是白色就忽略这类需求。

当前输出还是没有先后顺序的候选线段。限制到相邻格中心连线,只是在规定去哪里寻找线条,并没有验证单位一定能沿它移动。要变成可用路径,还需要确定起点、鼠标目的格,连接被虚线间隔打断的部分,并判断该单位的移动方式。图 2 选择“原实验 → 白色路径”可以直接查看这些失败。

7. 下一步:保留分层输出,补齐能验证语义的录像

新增数据把下一步变得更具体:障碍物检测要同时解决冰岩漏检和兵种误报。只把“有东西站在那里”当作障碍物不够;只根据旧测试的高召回率固定规则也不够。下一轮训练可以纳入这些失败样本,但必须另外保留没有用于调整算法的录像来检验效果。

范围和路径则需要更有针对性的证据。最有用的采集方式,是固定同一场战斗、同一个行动者,依次记录鼠标在空处、己方兵种、敌方兵种,以及几个目的格上的画面。这样能把相同背景抵消,检查“哪个 UI 信号随哪次悬停改变”,而不是让模型从草地颜色猜范围归属。再分别补上施法造障碍和死亡留石的前后序列。

现在每段录像有一份可搜索的场景索引,把时间点、截图、可见现象、采样用途和标签文件放在一起。例如 more-001 对应录像的 06:50.031:深色战场、大块绿色范围、先水平再斜向右下的绿色路径。索引能帮助快速回看,但没有把颜色猜成归属;范围属于谁、由哪次悬停触发仍记为未知。前后各 5 秒只是建议回看窗口,不代表这段交互已经确认。

两批共 40 张稀疏标注图,让我们看到了原来高分掩盖的漏检。当前做法能提供障碍候选、范围判断和路径片段,还不能生成可直接执行移动的战场地图。剩余 40 张候选的格子标注、作者复核和有明确交互过程的录像,是继续改进的基础。

数据与复现

原始试验可下载数值报告助手标注来源清单137 格投影

新增数据可下载冻结模型复测报告新增助手标注新增 20 张来源清单场景说明索引。来源路径用于定位本地原始录像帧,不是网上下载地址。新增图没有路径线标注,因此本文的路径成绩仍来自原始试验。

实验代码位于 Olden Era 项目的 perception/experiments/b07_battlefield-cell-state/,复用像素分析代码位于 Perception 包中。实验保留选择阈值、各录像组结果、预测和标注来源。实现使用 NumPy、OpenCV 与 scikit-learn;参考 OpenCV Hough 直线说明ExtraTrees 文档