摘要

在《英雄无敌:上古纪元》(Heroes of Might and Magic: Olden Era)的竞技场模式里,开局要从三个英雄里选一个,之后又要从三个主技能里选一个。我们想让程序自动认出屏幕上是哪三个英雄、哪三个技能。

这是一个独立的教学实验,不进入正式的识别流程(项目里称为 Perception,即“视觉理解”模块)。问题刻意设得很简单:不告诉程序图标在哪里,只告诉它图标大概有多大,把每种大小的方框从截图左上角滑到右下角,每个框都转成一个 768 维的视觉向量,再和资料库里所有已知图标的向量比较相似度,能不能找出图标?

结果是混合的:当框里装着图标的大部分时,最相似的已知图标常常是对的;但得分最高的框经常偏移、只截到一部分、重复框住同一个图标,或者落在无关的界面装饰上。7 张截图共生成 236,115 个候选框、约 1,525 万次框与参考图标的比较,在 RTX 5080 上一次运行共 28.77 秒。结论是:通用视觉向量适合回答“更像哪个图标”,不适合单独回答“图标在哪”。

要回答的问题

如果不知道图标的位置,只知道图标大致的像素尺寸,那么对整张图做多尺度滑窗(sliding window),再用通用视觉向量(embedding)对参考图库做穷举的余弦相似度检索,能否自动找出英雄头像和主技能图标?

实验故意禁止使用以下信息:固定坐标、预设的格子或行列、“三个图标竖着排列”之类的布局规则、文字识别(OCR)、边缘或颜色阈值、预设感兴趣区域(ROI),以及近似最近邻索引。唯一保留的空间先验是候选框尺寸、滑动步长,以及“正好输出三个结果”。所以它并不是完全无先验的。

数据与来源

  • 输入:从用户自己的一段对局录像中按帧号抽出 7 张 1920×1078 的截图。3 张是英雄三选一界面,4 张是主技能三选一界面。其中一张英雄截图的中间头像被鼠标提示框(tooltip)大面积遮挡。
  • 参考图库:来自项目的游戏资料库(Game Knowledge)。英雄 77 个,每个一张头像;技能 20 个,每个有基础、高级、专家三个等级的图标,共 60 张视觉图。
  • 这 60 张技能图里,有 4 张旧的“基础级卷轴图”后来被确认不适合竞技场在线识别,现在只为复现本实验而单独标记保留;正式在线识别只使用其余 56 张已核验图标。
  • 子技能页面不在本实验范围内,因为当时资料库没有带标签的子技能参考图。
  • 没有人工标注的完整边框真值(ground truth),因此本实验只能做定性观察。

方法

整个流程可以分成五步:

  1. 生成候选框。 英雄头像试 5 种正方形尺寸(128、144、160、176、192 像素),步长 20 像素;技能图标试 6 种尺寸(72 到 132 像素,每 12 像素一档),步长 16 像素。如果步长没有正好落到图像边缘,就补一个贴边的框。每张英雄截图得到 21,193 个框,每张技能截图得到 43,134 个框。
  2. 把每个框变成 768 个数字。 用 RoI Align(一种按坐标从图上取出并重采样一个区域的操作)把每个框缩放到 128×128,送进在 ImageNet 上预训练、从未见过本游戏图标的 ConvNeXt-Tiny 网络。取最后一层特征图(768×4×4),全局平均池化、LayerNorm 后做长度归一化,得到 768 维向量。不使用 ImageNet 的分类结果。
  3. 准备参考向量。 资料库的图标带透明背景,而游戏里图标在深色界面上。为了减少背景偏差,每个参考图标分别贴到深蓝、深灰、亮灰三种背景上编码,三个向量取平均再归一化。
  4. 穷举比较。 所有框的向量组成矩阵 Q,所有参考向量组成矩阵 R,相似度矩阵就是 S = Q·Rᵀ。因为向量都已归一化,每个元素就是余弦相似度(衡量两个向量方向有多接近,越接近 1 越像)。技能的三个等级图先在同一技能内部取最高分,再选出三个不同技能。
  5. 去重并强制输出三个框。 按每个框的最高分排序,用非极大值抑制(NMS:如果一个低分框和已选中的高分框重叠超过 10%,就把它去掉)去重,最后强制留下三个框。程序没有“背景”类别,也没有拒识选项。

需要强调:这不是逐像素的模板匹配,而是在向量空间里找最近邻;余弦相似度也不是概率,0.57 不代表 57% 正确。

设置

任务 截图数 候选框尺寸 每图候选框 参考图 总候选框
英雄头像 3 128–192 像素 21,193 77 张头像 63,579
主技能图标 4 72–132 像素 43,134 60 张等级图 / 20 个技能 172,536
合计 7 — — — 236,115

运行在一块 RTX 5080 显卡上,半精度(FP16)推理,批量处理。

结果

工作量与耗时(一次运行,不是通用速度基准):

截图 候选框 搜索耗时
英雄截图 1 21,193 4.64 秒
英雄截图 2(中间头像被遮挡) 21,193 2.43 秒
英雄截图 3 21,193 2.50 秒
技能截图 1 43,134 5.40 秒
技能截图 2 43,134 4.65 秒
技能截图 3 43,134 4.54 秒
技能截图 4 43,134 4.61 秒
合计 236,115 28.77 秒

总比较次数约 1,525 万次。各图排第一的框的最高余弦相似度在 0.76 左右(英雄约 0.76–0.77,技能约 0.76–0.77)。

定性观察:

  • 身份常常是对的。 框里装着图标大部分时,最相似的参考图标往往就是框里那个图标。
  • 框经常选得不好。 有的框只截到图标一部分、有的偏移、有的把同一个图标框了两次、有的落在按钮或卡牌装饰上;也有名字认错的情况。
  • 被遮挡的头像找不回来。 在中间头像被提示框盖住的截图里,程序定位到了左右两个可见头像,第三个框落在中间卡牌下部的装饰图案上。

失败与负结果

为什么会选出坏框?报告给出的解释是:

  1. 一个分数同时回答两个问题。 余弦相似度既决定“图标在哪”,又决定“是哪个图标”。预训练网络只衡量视觉上像不像,从没学过“完整、居中的框应该比残缺的框得分高”。只截到一半的框也可能包含足够的可辨认细节,拿到高分。
  2. 候选太多会产生侥幸错误。 上万个坏框参与竞争,而程序必须交出三个框、不能回答“都不是”,无关界面元素就有机会拿到高分。
  3. 参考图和截图不是同一种渲染。 资料库里是干净的原画,截图里的图标经过缩放、边框、发光、压缩。三背景平均只缓解了透明背景问题。

框尺寸和 NMS 设置各自贡献了多少错误,没有人工核对过的框就无法测量。报告也明确:实验没有证明“三背景平均”或“多等级参考图”能提高准确率。

另外,早期版本曾把每个框放大到 384×384 再编码,耗时约 9 倍,但小图放大并不能增加源图细节;当前报告只使用 128×128 的配置,旧结果没有混入。

局限

  • 只有 7 张截图,来自同一段录像,且几张截图几乎一样;不是独立样本。
  • 没有边框真值,不能报告精确率(precision)、召回率(recall)或准确率,只能做定性检查。
  • 余弦分数不能跨模型或跨参考库比较。
  • 耗时只代表这一次在这块显卡上的运行。

结论与下一步

这个实验给出的答案比“视觉向量很聪明”更具体:通用视觉向量在不训练的情况下有一定的定位能力,但穷举不能消除参考图与截图的渲染差异、遮挡和界面干扰。更合理的结构是由专门的检测器负责“哪里像图标”,再由向量负责“更像哪一个”。

报告提出的下一步是:用本游戏带标签的图标训练或微调一个共享图像模型,把位置、缩放、边框、高光、背景的小变化当作同一图标的正常变化,把截坏的框当作“坏框”的例子;然后在人工核对过的对局截图上,分别测量“认对身份”和“把最好的框排第一”这两件事。本实验本身作为可复现的教学材料保留,不接入正式流程。