概览

滑动窗口图标检测 · 图标库训练的视觉骨干

9 月 3 日进度:下文 A–F 保留历史图标库实验,不混入新的训练结果。后续分别研究了学习式框检测、人工审核后的游戏裁剪分类和标题 OCR。输入与测试集不同,不能把它们的数字当作同一种准确率直接比较。

《英雄无敌:上古纪元》是一款回合制策略游戏。在 Arena 模式中,玩家通过三选一页面组建临时军队,例如选择英雄或主技能。本检测器只得到完整截图,不知道图标槽位的坐标。它既要找到图标的位置,也要认出图标身份。

普通代码用滑动窗口生成候选框,再提取框内的图片。视觉特征提取器,也就是 backbone(视觉骨干),把每张裁剪编码成特征,与已知图标库比较。本实验保留这套搜索方式,改用图标库训练视觉骨干,并单独学习裁剪质量。只有干净图标库和程序生成的图片更新模型权重;游戏截图和人工框不参与权重训练。

这不是常规的学习式目标检测器:最初的矩形由代码生成的网格提供。D 和 F 后续方案只评分,不移动这些框;E 则单独测试使用模型预测的偏移量调整坐标。后面的 A–F 对比会保留这个区别。

这个小型工程 评测集 给出的答案是:图标库训练能让身份识别变得很强,但全屏检测仍然取决于能否选中一个贴合的裁剪,并拒绝背景。加入独立裁剪质量后,结果从 12 个正确 / 7 个误检 / 6 个漏检 提高到 13 个正确 / 3 个误检 / 5 个漏检;同时兼顾误检与漏检的 F1 从 0.649 提高到 0.765。后来一个空间质量 输出分支 在已经看过的工程测试集上更好,但单独用于模型选择的截图选中了另一个方案,所以这个表面提升仍需全新测试。

搜索方式不变,特征经过专门训练使用公开视觉骨干的基线直接使用 ImageNet 特征,不针对游戏训练。本篇用图标库微调这些特征,再由独立的质量 输出分支 学习给位移或残缺裁剪评分。两篇都枚举候选窗口,并把窗口的视觉特征与图标库匹配。

不需要先记住 A–F。把整篇文章理解成四个问题即可:通用特征能否认出图标?用图标库训练后身份识别是否提高?独立的裁剪质量能否选出更好的框?哪个后期改动能解决剩余漏检?

需要时展开 A–F 方法速查
A · 直接使用通用特征ImageNet 预训练模型,不学习游戏图标。
B · 学习精确图标 ID用 354 个 ID 训练普通分类模型。
C · 再加入类别与聚类同时学习大类、精确 ID 和同 ID 聚拢。
D · 给候选框评质量保留原始网格坐标,只改变框的排序。
E · 评分后再移动框完全沿用 D 的分数,最后调整坐标一次。
F · 诊断并专门改进定位阈值、分数融合和 NMS 方案调整后处理;F-Type、F-Spatial 比较两种不同的质量 输出分支。

本实验的所有专用权重都来自 390 张干净图标库图片及程序生成的变化,没有使用游戏截图像素或人工框更新权重。真实截图只负责选择运行参数或报告结果,梯度不会从真实截图传回模型。

白底检测流程总览:图标库生成身份训练视图,程序生成不同质量的裁剪,固定网格产生候选框,模型计算身份与裁剪质量,普通代码再去重并应用接受阈值,最终输出矩形框和 ID
共同检测流程一图概括。干净图标库视图负责教身份;程序生成的紧密、位移、残缺和空裁剪负责教裁剪质量。运行时由固定网格提供矩形,模型计算身份和裁剪质量,普通代码再去重并应用接受阈值。后文的 A–F 只是每次改变这条流程中的一个部分。
Arena 截图 + 指定目标家族 → [矩形框, 图标库身份, 排序分数] × 0–3
展开历史结果摘要;正文会解释分母与限制
图标库标签空间354 个 ID由 390 张干净图片表示
用于更新权重的真实画面0游戏截图和人工框都是 0
A–E 选中结果F1 0.76513 个正确 / 3 个误检 / 5 个漏检
尚未确认的后续结果F1 0.895F-Spatial 在已查看工程测试集上的结果;模型选择截图没有选中它

1. 系统到底要做什么?

一个 Arena 选择页面可能显示三个英雄,或者三个主技能。主技能是这个专用选择页面上出现的大型能力图标,不是界面其他位置的所有小技能符号。检测器的输入是完整截图以及指定目标家族——英雄或主技能;输出可以是 0–3 个带身份的矩形框。

只有两个条件同时满足才算真阳性(TP):预测身份正确,而且预测框与人工标注框的 IoU 至少为 0.50。被接受的错误结果是误检(FP);没有匹配到的人工目标是漏检(FN)。

一张真实 Arena 主技能截图,包含三个绿色接受框;右侧说明输入是截图和指定类别,输出是框与 ID,坐标来自固定网格,成功要求 ID 正确且 IoU 达标
一个具体输入和它的三个接受输出。绿色框是系统输出,不是训练标注。指定类别会作为输入告诉系统;它不需要理解截图里每一个 UI 物体。图中英文标签:Input=输入,Output=输出,Box source=候选框来源,Correct only if=正确条件。

矩形框从哪里来?先理解固定网格

与常见的学习式目标检测器不同,本实验中的神经网络不会生成候选框。一个确定性的滑动窗口固定网格(sliding-window grid)先在 1920×1078 截图上枚举 21,193 个英雄方框,或 43,134 个技能方框,然后神经网络才逐一查看裁剪。英雄框每次移动 20 像素,约为 128–192 像素框宽的 10–16%;技能框每次移动 16 像素,约为 72–132 像素框宽的 12–22%。所以 x、y 和尺寸都是离散的,而且当前候选框只允许正方形。

图片尺寸说明:实际验证集和工程测试集的 JPEG 都是 1920×1078,与第一个实验的输入相同。更大的源图片集合中也有 1920×1080 文件,但不是这里报告的验证/测试帧。搜索使用每张图片的实际尺寸,只有候选裁剪才会缩放到 224×224。

两个不同的性能上限第一问是网格有没有生成与目标充分重叠的框;第二问才是学习到的分数有没有选中它。Oracle proposal recall 会忽略所有分数,为每个目标直接取重叠最大的网格框,用来衡量第一个上限。

身份识别问题

“这个裁剪是哪一个已知图标?”模型把图片变成 embedding,再用余弦相似度找最像的参考图标。

定位问题

“这个候选框是否紧密覆盖图标?”系统需要生成候选框、预测裁剪质量、去重,并用阈值决定是否接受。

注意一个发生位移的裁剪可能仍包含足够多的英雄脸,所以 ID 完全认对;但如果它与人工标注框的 IoU 只有 0.30,它仍然是错误检测。身份训练希望模型对小位移保持不变,而定位恰恰需要模型对位移敏感。

下文会反复使用的词

为避免同义词来回切换,下文统一使用“图标 ID”表示具体身份,“候选框”表示网格生成的矩形,“裁剪质量分数 S_crop”表示这个窗口是否完整、贴合。

图标 ID一个具体的英雄、技能、生物或宝物身份;本实验共有 354 个。
图标类别较粗的四类:英雄、技能、生物、宝物。真实画面评测只覆盖英雄和主技能。
图标库图片 / 标准参考图与某个 ID 关联的干净图;同一个 ID 可以有多个合法等级外观。
候选框 → 裁剪候选框是程序提出的矩形坐标;裁剪是从这个矩形里切出的截图像素。
候选位置Arena 固定布局中预计会显示一个可选对象的预定义 UI 位置。
目标实例真实截图中应该被找到并有人工框标注的一个图标。
任务这次要求搜索的家族;本文只搜索英雄或 Arena 主技能。
任务-截图对(task-screen)一个“任务 + 截图”的评测单位;同一张截图可以按不同任务评测两次。

这个检测器并不知道候选位置的坐标。候选位置只是解释游戏布局的词;程序仍扫描全屏,只知道合理的框尺寸和网格步长。后来的固定裁剪实验才有意改变这个条件:直接使用已知位置,单独测试识别,不再搜索框。

端到端推理流程:截图和指定类别先选择对应网格与允许的 ID,再裁剪编码、计算身份和质量分数、做 NMS 与阈值判断,最后输出矩形框、ID 与分数
指定类别同时决定候选网格和允许检索的图标 ID。只有 ID 与 IoU 都正确才是 TP;一个被接受的坏预测会记 1 个 FP,而没有匹配到的真实目标再记 1 个 FN,所以一次坏匹配可能同时产生 FP 和 FN。

2. “只用图标训练”具体是什么意思?

图标库包含354 个语义身份,由 390 张干净图片表示。一些 Arena 技能有多个合法等级外观,所以图片数大于 ID 数;多出来的图片不是多出来的类别。相比第一个实验的 60 张主技能参考图,审计移除了 Arcane、Daylight、Nightshade 和 Primal Magic 的四张错误卷轴形基础参考图,因此保留 56 张图片,仍对应同样的 20 个主技能身份。本实验还加入了生物和宝物,但没有把魔法(Spell)列为第五类。

类别不同 ID 数游戏里的含义
英雄77可选英雄头像
主技能20Arena 主技能;共 56 张合法外观图片
生物141生物/单位图标
宝物116宝物或装备图标
总计354 个 ID390 张干净图标库图片
重要边界“没有额外训练数据”是指没有额外的游戏截图、裁剪或人工标注框。视觉主干网络(backbone)从 ImageNet 预训练权重开始,所以这不是从随机参数训练。除此之外,本实验中的所有参数更新都只使用图标库以及由这些图标程序生成的数据。

代码里的 Skill 在本实验中只表示主技能,不包括子技能或魔法。部分原始图表沿用了这个简写。

审计结果:用于更新 ID 训练、多任务和裁剪感知模型的真实游戏截图像素 = 0;人工标注框 = 0。真实验证/测试截图只用于选择运行参数和评测,不参与反向传播。

程序背景由代码绘制,包括平滑颜色、浅色矩形和线条;它们不是从游戏截图复制的。颜色抖动、缩放、模糊、旋转和合成裁剪会生成新像素,但不会引入新的游戏截图对象。

从图标库、数据增强、身份训练和裁剪质量训练,到真实游戏画面评测的实验边界
整项实验的因果边界。图中下方红框里的真实游戏截图只用于选择运行参数和评测,不通过反向传播更新模型权重。

3. 哪些图片真的训练模型,哪些只负责评测?

全部 354 个图标 ID 都参加训练,因为产品目标就是识别所有已知图标。测试集没有藏起整个 ID,而是使用不同随机种子生成新的背景、缩放、位移、旋转、颜色和模糊组合。换句话说,图标是谁并不新,但它这次出现的样子是新的。

两种数据世界及其不同作用:目录训练视图更新权重,目录验证视图选择 checkpoint,目录合成测试只报告合成指标;真实截图验证只选检测参数,真实截图工程测试只报告冻结结果
这里没有“合并 验证集 后重训”的步骤。目录训练视图才更新权重;目录 验证集 只选 模型检查点;目录 合成测试 只报合成指标。真实截图 验证集 不更新权重,只选分数融合、阈值和框参数;真实截图 工程测试 只报告冻结后的 TP/FP/FN/F1。
数据划分唯一用途更新神经网络权重?
图标库训练集(Catalog train)反向传播、更新权重是
图标库验证集(Catalog 验证集)只选模型 模型检查点否
图标库合成测试集只报告合成指标否
真实截图验证集只选分数融合、接受阈值与框参数否
真实截图工程测试集只报告冻结后的端到端结果否
为什么叫“工程测试集”?我们在开发过程中看过这些截图,并用它们检查系统,因此它不是最后才第一次打开的全新 评测集。下文统一称它为真实截图工程测试集,F 后续实验也使用同一组截图,没有为 F 另行划分一组评测数据。这些结果不能代表整个游戏中的准确率。
英雄、技能、生物和宝物的标准目录图,以及独立生成的训练、验证和测试增强视图
普通身份数据增强:完整图标始终可见,图标 ID 与类别标签保持不变。
测试里的每个 ID,训练时都见过这种设置叫 closed set(闭集)。它检验 354 个已知 ID 能否适应新生成的外观,不检验从未见过的第 355 个 ID 能否自动形成一个新类别。

ID 分类与多任务模型都训练 12 个 epoch。每个 epoch,每个 ID 生成 4 对独立增强视图;每对包含两张图,每个 batch 覆盖 32 个 ID。目录 验证集 为每个 ID 固定生成 4 张图,只用于保留 模型检查点;目录 合成测试 生成 6 张,共 2,124 个查询,只报告合成指标。二者都不更新权重。若一个 ID 有多个合法图片,生成器可以从不同版本起步,从而教模型把它们聚在一起。

身份训练的完整复现参数

随机种子 20260824;输入 224×224;ConvNeXt 所有层都参与 fine-tune;AdamW 训练 12 个 epoch;余弦学习率调度;backbone/输出分支 学习率分别为 1.2×10−5 和 4×10−4;weight decay 0.02;梯度裁剪 1.0;label smoothing 0.05。增强时,图标占 256 像素画布的 62–88%,位置抖动 ±3.5%,可选旋转 ±6°,亮度 0.78–1.20,对比度 0.82–1.18,颜色 0.78–1.22,可选高斯模糊半径 0.2–1.1。保留 catalog 验证集 最优 模型检查点。

数据增强想让模型学到什么?

身份增强的含义是:“这些外观变化不应该改变它是谁。”因此 backbone 会学着忽略适度的背景、亮度、尺度和位置变化。这对识别很好,却带来定位上的矛盾:模型如果对位移过于不敏感,一个没有对齐的裁剪仍可能得到很高的身份分数。

4. A–F 怎样每次只改变系统的一个部分?

方法编号为 A–F,但它们不是从头到尾连续训练的一条链。A、B、C 比较三种身份特征;B 和 C 都从同一份 ImageNet 权重独立开始,C 不是接着 B 训练。D 冻结 C,学习裁剪质量评分。E 使用与 D 完全相同的分数,只在最后调整坐标。F 又回到 D 的原始网格框,开展五项针对性后续实验。

阶段本阶段改变什么要回答的问题
A · 通用图像特征不训练游戏图标通用 baseline 有多好?
B · 学会精确图标 ID354 类 ID 分类普通监督微调是否有用?
C · 学习类别、ID 和聚类类别 + ID + 同 ID 聚拢怎样塑造检索 embedding?
D · 判断裁剪是否合格给冻结 C 增加裁剪质量分数能否从固定网格框中选得更好?
E · 判断并移动框最后应用一次 D 的预测偏移坐标调整是否有帮助?
F · 诊断并专门改进五项 F 方案分别改校准、NMS 或质量预测头D/E 的 5 个漏检究竟怎样减少?
受控比较图像预处理、候选框网格、参考向量库搜索和评测划分保持一致。B、C 改身份特征;D 改裁剪排序;E 只改最终坐标;F 中每一项再只改变一个后期选择,并先在 验证集 上确定参数。
算法 A 到 F 的六层白底比较图
A–E 是主实验阶梯。F 是后续研究:阈值、分数融合和 NMS 方案调整评分后的决策,F-Type 与 F-Spatial 比较不同的裁剪质量 输出分支。

算法 A — 直接复用通用图像特征

A 使用 torchvision 0.28.0 的 convnext_tiny(weights=ConvNeXt_Tiny_Weights.IMAGENET1K_V1),并移除最后的 1,000 类线性分类层。输入使用 ImageNet 均值 (0.485, 0.456, 0.406) 和标准差 (0.229, 0.224, 0.225)。任意 224×224 裁剪依次经过 features → AdaptiveAvgPool2d(1) → classifier LayerNorm,得到线性分类层之前的 768 维向量,再做 L2 归一化。

对于查询向量 q 和参考向量 r,余弦分数是:

score(q, r) = q · r    because ||q|| = ||r|| = 1

A 是本篇各方法的共同对照,不是第一个实验的直接重跑:输入从 128×128 改为 224×224,图标库经过审计,评测也换成了带人工框的截图集,而不是先前七张示例。应当在本实验内部比较 A–E,不要把这些分数与上一篇的定性示例直接比较。

A 不做任何游戏图标 fine-tune。它回答“通用 ImageNet 特征本来就能做多好?”保留这个对照组,才能把后面的提升归因于图标领域学习或裁剪质量学习,而不是更换了整个流程。

算法 B — 训练特征识别 354 个图标 ID

B 从相同权重开始,加一个 354 类分类预测头(classification 输出分支),用带标签图标训练。标准交叉熵(cross-entropy)会提高正确 ID 的 logit、压低错误 ID。训练结束后丢掉分类头,检索仍使用归一化后的 768 维倒数第二层特征。

LB = CE(global ID)

这是回答“直接用图标和 ID 标签做普通分类是否有帮助?”最干净的实验。答案是有:合成视图 MAP@R 从 0.8995 升到 0.9954,真实画面 F1 从 0.5161 升到 0.6111。

算法 C — 同时训练类别、ID 和同 ID 聚类

C 在同一个 768 维共享特征上连接三个训练输出:

768-D shared representation r
 ├─ 4-way type 输出分支: Hero / Main Skill / Creature / Artifact
 ├─ 354-way global-ID 输出分支
 └─ 128-D projection 输出分支: 只用于 supervised contrastive loss
LC = 1.00 · CE(ID) + 0.35 · CE(type) + 0.20 · SupCon(ID, temperature 0.07)

Cross-entropy 回答“是哪一个标签?”类别头提供粗粒度语义。Supervised contrastive loss 直接改变 embedding 空间的几何结构。Temperature 0.07 控制 loss 对最近竞争样本有多敏感,它不是准确率阈值。

只有类别和 ID 同时正确才算联合正确。多任务模型在 2,124 个固定种子的合成测试视图上,类别准确率、ID 准确率和联合准确率都是 1.000。Projection 输出分支 训练后丢弃,实际使用的 embedding 仍是 backbone 的 768 维特征。

不要把 100% 读错这只是已知 ID 的生成视图分类,不是整张游戏截图 100% 准确。全屏检测器还必须先找到好裁剪、拒绝背景,并选择阈值。

C 的 MAP@R 是 0.9945,比 B 的 0.9954 略低 0.0009,说明这个合成指标已经接近饱和;但真实画面 F1 从 0.6111 升到 0.6486。代理指标几乎不动,不代表下游行为不能改善。

5. D 和 E 怎样学习一个裁剪好不好?

先记住一句话D 只改变候选框的排序,坐标不变;E 完全沿用 D 的分数,再把最终输出框移动一次。因此 D 测的是“能否从现有网格框中选得更好”,E 才额外测试“预测坐标偏移是否有用”。

前三个算法主要学习“这是哪个图标”,但一个能认出来的裁剪仍可能偏移或残缺。算法 D 另外学习:“这个候选框与生成真值框重叠得有多好?”训练代码把一张图标库图片放到 320×320 的生成背景上,再裁出一个候选方框。因为代码知道图标放在哪里,所以生成真值框和重叠比例可以自动算出来。

同一个 Arcane Magic 图标的三个裁剪:完整贴合、发生位移、被裁掉一部分;身份目标相同,但 ground-truth crop IoU 不同
身份和裁剪质量刻意使用不同监督。三个裁剪都是同一个 ID,但位移和残缺框应该排在完整框之后。图中英文:Identity target=身份目标,Ground-truth crop IoU=裁剪重叠真值。
同一个魔法技能从完整对齐裁剪到纯背景裁剪的八种样本,以及各自 IoU 目标
这里把目标分数规则明确化:发生位移、残缺和纯背景的裁剪不再作为身份正样本,而是得到更低的 overlap 质量目标。每张小图显示裁剪结果与对应 IoU;真值框和候选框的几何关系由生成代码记录,但没有直接画在这张图里。

每张图标库图片生成 16 个更新权重的训练裁剪、8 个图标库验证裁剪和 8 个图标库合成测试裁剪。八类分别是:紧贴完整、宽松完整、两个位移方向、小幅残缺、包含过多背景、几乎不重叠和纯背景。不同数据划分使用不同随机种子,精确像素不重合。

算法 D 会冻结 C,因此身份特征不再改变。新的裁剪质量 输出分支 读取 C 的 768×7×7 空间特征图,缩小为 3×3,再分别预测连续 IoU、IoU 是否至少为 0.50、IoU 是否大于 0.02,以及候选框到真值框的中心与尺寸偏移。

裁剪质量 输出分支 的完整网络结构

768×7×7 特征图先 pool 成 768×3×3,再展平成 6,912 个数。随后经过 LayerNorm → Linear(6912,256) → GELU → Dropout(0.10) → Linear(256,96) → GELU,连接四组输出。

候选裁剪经过冻结的多任务特征,输出 predicted IoU、P(IoU≥0.50)、P(IoU大于0.02) 和 box offset
裁剪质量预测头(crop-aware 输出分支)不替代图标 ID 检索。它学习三个合成重叠目标,通常会让完整贴合的裁剪排在松散、残缺或空白裁剪之前。

在固定种子的合成裁剪测试上,IoU MAE = 0.0485,IoU 排名相关性 = 0.9547,IoU≥0.50 AUROC = 0.9622,IoU>0.02 AUROC = 0.9963。这说明它确实学会了生成器定义的 overlap 任务;能否迁移到游戏画面,仍要看真实画面评测。

这个预测头输出三个相关的合成目标。IoU_hat 估计候选框与生成真值框的 IoU;hat 表示它是模型预测,不是用测试人工标注框算出的真实 IoU。p_IoU50 估计 IoU 至少达到 0.50 的概率;p_overlap 估计 IoU 大于 0.02 的概率。后两者只是“重叠是否超过某个阈值”的信号:p_IoU50 并不严格表示“每个图标像素都完整可见”,p_overlap 也不是通用的物体存在概率(objectness)。定义清楚后再组合:

Scrop = (IoU_hat × p_IoU50 × p_overlap)1/3
Sfinal = Sidentity × Scropα

S_crop 本身不是 IoU 预测值,而是三个 overlap 信号在 [0,1] 上的几何平均数。它们通常会让完整、贴合的裁剪排在松散、残缺或空白裁剪之前,但监督标签的准确含义仍是上面的 IoU 阈值。α 控制这个综合质量对身份相似度的影响强度。Real-screen 验证集 尝试 α ∈ {0.25, 0.5, 0.75, 1.0, 1.5, 2.0},最终选择 2.0。

固定网格裁剪先得到身份分数与三个重叠质量预测,再组合成 0.71 的最终排序分数
这个数值例子算到最终排序分数为止;0.71 不是“71% 可能正确”的校准概率,接受阈值会在之后应用。

质量接近 1

图标存在、完整,而且候选框贴合。身份相似度基本保留。

中等质量

正确图标仍能认出,但候选框发生位移、裁掉一部分,或包含过多背景。

质量接近 0

窗口几乎只有背景,或只包含极少图标;即使偶然匹配到某个 ID,也会被大幅降分。

裁剪质量 输出分支 的完整训练参数

冻结后的特征只训练这个小 输出分支,共 30 个 epoch;AdamW 学习率 7×10−4、weight decay 0.02、batch size 128,余弦衰减到 10−5,梯度裁剪 1.0。总损失为:2.0×Smooth-L1(sigmoid IoU) + 1.0×加权 BCE(IoU≥0.50) + 0.5×加权 BCE(IoU>0.02) + 0.75×Smooth-L1(只对 IoU≥0.10 的框偏移)。Catalog 验证集 依次按 IoU≥0.50 AUROC、IoU 排名相关性和 IoU MAE 选择 模型检查点。

为什么有两个版本?D 只用 S_crop 重新排序原始网格框,不会移动或重新生成框;E 还会应用真实截图验证集选出的 50% 预测位移。这样可以区分“从已有候选框里选得更好”和“直接回归更准的框”。
并排流程图:D 对原始网格框评分并返回同一坐标;E 在同一次 forward 后预测 box delta,只修改最终输出坐标
两个版本都只对原始候选框 crop 一次、运行网络一次。E 调整后的框不会重新从原图 crop,也不会再做第二次网络推理。图中英文:Original grid box=原始网格框,One forward pass=一次推理,Output=输出。

7. 做针对性改进前,A–E 分别做到了什么?

模型能把同一图标的新外观放到一起吗?

算法MAP@RR-PrecisionPrecision@1同 ID 与异 ID cosine 差
A · 通用图像特征0.89950.90350.99390.4794
B · 学会精确图标 ID0.99540.99551.00000.8621
C · 学习类别、ID 和聚类0.99450.99451.00000.8524

怎么读、怎么算:这是闭集增强鲁棒性测试,不是新类别泛化。2,124 张测试图逐一作为查询;查询自身从图库中移除,其余 2,123 张作为候选。每个 ID 还有 5 张相关测试图,因此 R=5。Precision@1 只看最近邻;R-Precision 看前 5 个结果里有多少是同 ID;MAP@R 还奖励把相关图排得更靠前。Cosine gap 是平均同 ID 相似度减去平均不同 ID 相似度。

算法 C 能同时预测大类和精确 ID 吗?

检查内容准确率
大类正确1.0000
精确图标 ID 正确1.0000
大类和 ID 同时正确1.0000
预测大类与预测 ID 互相一致1.0000

“同时正确”要求大类和精确 ID 都匹配。例如,模型不能一边说“这是英雄”,一边给出某个技能 ID。最后一行检查的就是这两个输出是否互相一致。

算法 D 能区分好裁剪和坏裁剪吗?

样本IoU MAE ↓IoU Spearman ↑IoU≥0.50 AUROC ↑IoU>0.02 AUROC ↑
裁剪感知合成测试0.04850.95470.96220.9963

IoU MAE 是 predicted overlap 与 true overlap 的平均绝对误差,越低越好;Spearman 看排序是否正确;AUROC 衡量不选 threshold 时,positive 是否通常排在 negative 前面。

放到真实游戏截图上会怎样?

F1 不是“76.5% 的所有截图都正确”Precision 关注误检,recall 关注漏检,F1 是两者的调和平均数。这里测试集只有 18 个正目标,所以每一个物体都会明显改变结果。
目录 train / 验证集生成的 train 视图更新权重;目录 验证集 只选 模型检查点。
→
真实截图 验证集从不更新权重;只选分数融合、阈值和框缩放。
→
真实截图 工程测试冻结全部设置;只报告 TP / FP / FN / F1。
算法 A 到 E 的 precision、recall 和 F1 白底柱状图
主要 icon-only 结果。D 和 E 在这个 工程测试 上打平。
算法PrecisionRecallF1TP / FP / FN被接受的负截图任务
A · 通用图像特征0.61540.44440.51618 / 5 / 101 / 6(0.1667)
B · 学会精确图标 ID0.61110.61110.611111 / 7 / 73 / 6(0.5000)
C · 学习类别、ID 和聚类0.63160.66670.648612 / 7 / 63 / 6(0.5000)
D · 判断裁剪是否合格0.81250.72220.764713 / 3 / 53 / 6(0.5000)
E · 判断并移动框0.81250.72220.764713 / 3 / 53 / 6(0.5000)
精确的检测计分协议TP = 图标 ID 正确 + 与尚未匹配的人工标注目标 IoU≥0.50。接受的预测按分数排序,每个任务-截图对最多 3 个;每个预测与相同 ID、IoU 最高的未匹配标注目标配对。其他接受预测(包括负任务上的预测)都是 FP;未匹配标注目标是 FN。F1 = 2TP / (2TP + FP + FN),公式里没有真负例 TN。每个模型先在真实截图验证集选择 F1 最佳阈值,并列时依次偏好 precision、recall 和更高阈值;真实截图工程测试集使用冻结值。

不要把算法阶梯理解成每个指标都单调变好。从算法 A 到 C,TP 从 8 增加到 12、FN 从 10 减少到 6,但 FP 也从 5 增加到 7。算法 C 的提升主要来自召回率,不代表它解决了误检;真正把 FP 降到 3 的是算法 D。

主结果,同时给出分母主技能:找到 9/9。英雄:找到 4/9。分数阈值只用真实截图验证集选择。算法 D 把 F1 从算法 C 的 0.6486 提高到 0.7647。在真实截图工程测试集的 18 个标注目标、12 个任务-截图对中,D 得到13 TP / 3 FP / 5 FN,object-level F1 = 0.7647。只有 ID 正确并且框达到 IoU≥0.50 才算 TP。这是小型工程测试结果,不是整个游戏的准确率。

为什么框调整(box adjustment)没有继续提升?在真实截图验证集上,50% 框位移把 F1 从 0.7222 提到 0.7778,正确 ID 的平均 IoU 从 0.5341 提到 0.5517;但在开发过程中已经查看过的真实截图工程测试集上,TP/FP/FN 仍为 13/3/5,平均 IoU 反而从 0.5270 变为 0.5261。合成框的几何规律没有在这个测试集上带来稳定提升。

测试录像英雄 TP / FN主技能 TP / FN负任务误检总计 TP / FP / FN
录像 A1 / 23 / 024 / 2 / 2
录像 B3 / 03 / 016 / 1 / 0
录像 C0 / 33 / 003 / 0 / 3

分录像计数揭示了总 F1 看不出的失败聚集:录像 C 的整张英雄画面全部漏掉,而三张技能画面都成功。

8. F 实验 — 先追踪 5 个漏检,再修改出错的环节

先找失败原因,不要一上来就换模型

D 和 E 都得到 13 个正确检测、3 个误检和 5 个漏检。F 实验没有直接假设“模型太小”或“grid 太稀”,而是让每个漏检依次通过四项检查:网格有没有生成可用候选框?检索有没有给出正确 ID?NMS 有没有保留它?最终阈值有没有接受它?

18 个标注目标 → 18 个都有可用网格框 → D 接受其中 13 个
5 个漏检 = 4 个正确 ID 框被阈值拒绝 + 1 个 ID 识别错误

因此,主要问题不是“网格根本没有框住目标”。后续改进分成两类:先调整评分之后的决策,再比较新的裁剪质量 输出分支。逐目标证据放在第 9 节。

五项 F 方案到底是什么关系?

F 是一组后续实验的总称,不是一个可以部署的单独模型。下面按改动命名:Threshold 是阈值,Fusion 是分数融合,NMS 是去重规则,Type 是分类别输出,Spatial 是空间布局。F1 只表示评测分数。F-Threshold、F-Fusion、F-NMS 构成一小段后处理改进链;F-Type、F-Spatial 再分别替换裁剪质量 输出分支。F-Spatial 不包含 F-Type。

步骤相对上一步改变什么?重新训练神经网络权重?应该怎样理解
D · 起点一个质量指数、一个阈值、不区分 ID 的 NMS已经训练完成有 5 个漏检的基线
F-Threshold · 分开阈值英雄与技能分别设接受阈值否D 的分数不变,只改最终接受/拒绝
F-Fusion · 分开融合分数英雄与技能分别设质量指数和阈值否替代 F-Threshold 共享的质量指数
F-NMS · 搜索 NMS去重规则和重叠阈值否建立在 F-Fusion 的校准之上
F-Type · 按类型复制最后四层保留 D 的共享 trunk;把 4 个共享输出层改成 4 种图标各 4 个只训练质量 输出分支最终共有 16 个 linear layer;每张图只使用对应类型的 4 个
F-Spatial · 保留 7×7 布局换成保留更细空间位置的质量 输出分支只训练质量 输出分支F-Type 的替代方案,不是叠加在 F-Type 上
训练数据边界没有变化F-Threshold、F-Fusion、F-NMS 完全不训练网络;F-Type、F-Spatial 只用与 D 相同的图标派生合成裁剪训练小型 输出分支。游戏截图像素和人工框仍然不会更新模型权重。

第一组:不重新训练,只改变决策

F-Threshold · 英雄和主技能分别设阈值

改变:验证集 为英雄和技能分别选择接受阈值。不变:D 的模型分数、α=2、网格框和 NMS。观察结果:工程测试集 F1 提高到 0.842,但负画面接受率也从 0.500 升到 0.667。它找回更多目标的代价是变得不够谨慎。

F-Fusion · 英雄和主技能分别融合分数

改变:验证集 为两类任务分别选择质量指数 α 和阈值。α 越大,裁剪质量越会惩罚“能认出 ID、但框没有对齐”的候选。不变:D 的共享裁剪质量 输出分支 和原始 NMS。观察结果:验证集 与工程测试集 F1 都是 0.824,负画面接受率降到 0.333。

F-NMS · 搜索 NMS 去重规则

改变:从 F-Fusion 的校准出发,验证集 比较不区分 ID 的 NMS、只压制相同 ID 的 NMS,以及多个重叠阈值。观察结果:验证集 仍选择原来的 class-agnostic、IoU=0.10,所以 F-NMS 与 F-Fusion 完全相同。在这次验证集比较中,改变去重规则没有带来提升。

第二组:只重新训练裁剪质量 输出分支(F-Type、F-Spatial)

F-Type · 为每种图标复制最后四个输出层

D 先让所有裁剪通过同一个大型质量 trunk,把 6,912 维裁剪描述压成一个 96 维隐藏向量。共享 trunk 后面只有四个学习出来的输出层:(1) predicted IoU,(2) P(IoU≥0.50),(3) P(overlap),以及 (4) 四个 box-regression offsets。英雄、技能、生物和宝物共用这四个层,也就是共用完全相同的四套权重。

D
共享 trunk
└─ 4 个共享输出层:IoU · P(IoU≥0.50) · P(overlap) · box offsets

F-Type
共享 trunk
├─ 英雄:4 个输出层
├─ 技能:4 个输出层
├─ 生物:4 个输出层
└─ 宝物:4 个输出层

F-Type 完全不改共享 trunk,只把 D 最后的“四件套”复制四份:每种图标一份。英雄裁剪使用英雄的四层,技能裁剪使用技能的四层,以此类推。因此最终 linear layer 的数量从 4 个变成 16 个。但 detector 后面的接口没有变化:每个裁剪仍然只得到三个标量分数和一组四维 box offset。

实现与 tensor shape 核对

代码里有四个 ModuleList,每个都包含四个按类型区分的 linear layer:IoU 使用 Linear(96,1),IoU≥0.50 使用 Linear(96,1),overlap 使用 Linear(96,1),box offset 使用 Linear(96,4)。一个含 N 张裁剪的 batch 经过共享 trunk 后是 [N,96]。按类型选择之前,三个标量输出分别堆成 [N,4,1],box 输出堆成 [N,4,4];再根据已知图标类型选出一行,恢复成和 D 相同的公开 shape:[N]、[N]、[N]、[N,4]。D 的质量 输出分支 有 1,808,903 个可训练参数;F-Type 有 1,810,940 个,只增加 2,037 个,约 0.11%。

为什么值得尝试?一个对齐良好的英雄头像和一个对齐良好的书本形主技能图标,可能在 96 维隐藏向量里留下不同模式。F-Type 测试的是:昂贵的表示仍然共享,但最后的质量判断是否应该按类型专门化。观察结果:F-Type 的 验证集 F1 最高,为 0.833,因此预先规定的选择规则选中 F-Type;它的工程测试集 F1 是 0.800。

F-Spatial · 保留完整的 7×7 空间布局

改变:不再把 C 的 768×7×7 特征图平均池化成 3×3,而是用 1×1 convolution 压缩 channel,再用 3×3 convolution 处理完整 7×7 布局。这个 222,119 参数的 输出分支 保留了更细的位置关系。观察结果:F-Spatial 在已经查看过的工程测试集上得到 17 TP / 3 FP / 1 FN、F1 0.895;英雄 8/9、技能 9/9。F-Spatial 是 F-Type 的替代方案,而且 验证集 没有选中它。

最后应该选哪一个 F 方案?

D 基线复放与 五项 F 方案 的 validation 和工程测试集 F1 对比柱状图
两组数据给出了不同答案:严格按 验证集 选择时,F-Type 胜出;F-Spatial 在已经反复看过的工程测试集上最高,因此只能当作待验证假设,不能反过来用它选模型。
方案Validation TP / FP / FNValidation F1工程测试集 TP / FP / FN工程测试集 F1工程测试集负任务接受率
D 重放 · 在 F 研究中重新运行冻结的 D14 / 4 / 40.77813 / 3 / 50.7650.500
F-Threshold · 英雄/技能分别设接受阈值15 / 5 / 30.78916 / 4 / 20.8420.667
F-Fusion · 分任务融合分数14 / 2 / 40.82414 / 2 / 40.8240.333
F-NMS · 比较 NMS 去重规则14 / 2 / 40.82414 / 2 / 40.8240.333
F-Type · 分类型裁剪质量输出15 / 3 / 30.83314 / 3 / 40.8000.500
F-Spatial · 保留 7×7 空间布局14 / 2 / 40.82417 / 3 / 10.8950.500
选择结论F-Type 是预先定义的 验证集 规则选出的方案。F-Spatial 在已查看的工程测试集上表现最好,但工程测试集表现没有资格参与模型选择。下一步应该冻结两者,再到一组从未看过的新录像上只运行一次。

9. 5 个漏检到底发生在哪里?

四张真实截图,显示真值与预测 ID、分数、IoU、阈值判断、漏检和负画面误检
应用算法 D 的冻结阈值。每个小图给出接受/拒绝、身份和几何位置的诊断信息。图中英文标签:Truth=人工标注框,Pred=预测框,Accepted=超过阈值,Rejected=低于阈值,Miss=漏检。

D/E 的结果明显不对称:9 个主技能全部找到,但 9 个英雄只找到 4 个;负任务-截图对上仍有 3 个误检。

固定网格没有覆盖到那 5 个漏检目标吗?

白底 oracle 候选框与漏检分解图:18 个目标都存在 IoU 大于 0.50 的网格候选框;5 个漏检由 4 个阈值漏检和 1 个身份漏检组成
Oracle 会忽略学习到的分数,为每个标注目标直接取重叠最大的网格框。它衡量候选框几何上有没有机会,而不是检测器实际选中了什么。

在 IoU≥0.50 的检测标准下,答案是否定的。固定网格为 18/18 个目标都生成了足够重叠的候选框;18/18 个目标甚至有 IoU≥0.70 的候选框,最佳网格框的平均 IoU 是 0.841。算法 D 的 5 个 FN 中,4 个已经有 ID 正确的候选框通过 NMS,但最终分数低于冻结的接受阈值;剩余 1 个是身份识别失败:没有任何 IoU 合格的候选框被判成正确 ID。

Oracle proposal recall 只是上限诊断它不是说检测器找到了 18/18,而是说在 IoU≥0.50 时,网格让这件事在几何上成为可能。漏检发生在候选框产生之后——身份或分数接受阶段——不是因为所有正方形候选框都错过了目标。

13 个达到 IoU≥0.50 的接受框,其图标 ID 全部正确。那 4 个阈值漏检解释了 F-Threshold/F-Fusion 为什么去做分任务校准;剩余 1 个身份错误也解释了 F-Spatial 为什么只能救回旧 5 个漏检中的 4 个。真实英雄界面的边框、文字、非正方形头像和复杂背景仍然与程序生成画布存在 domain gap。

样本很小,而且是 development-inspected这里只有 3 段录像、12 个任务-截图对和 18 个正目标。F-Spatial 的 0.895 是有价值的工程观察值,但不是无偏的泛化估计。

10. 为什么旧的 0.857 结果不能直接比较?

早期 prototype 用真实游戏录像和标注框生成的 3,970 个候选框,训练类似的质量 输出分支,测试 F1 = 0.8571(15 TP / 2 FP / 3 FN)。这个结果可作为诊断性对照:与任务匹配的少量真实候选框监督,似乎能缩小剩余领域差异。

不属于本实验数据边界旧原型使用了额外游戏像素和人工标注框来更新定位预测头,因此违反当前“只用图标库训练”的条件。它只是附录中的额外对照,不属于 A–F 主实验链。

纯图标 D 的 0.765 与真实候选框原型的 0.857 之间存在差距,这与领域不匹配的解释一致;但它不证明 0.857 能推广到更大的全新测试集。

11. 我们学到了什么,下一步该试什么?

  1. 用图标标签训练明显有帮助。MAP@R 从 0.8995 提到 0.9954,截图 F1 从 0.5161 提到 0.6111。
  2. 类别、ID 和聚类一起训练,截图 F1 继续升到 0.6486。
  3. 生成好裁剪和坏裁剪能帮助模型选框。D 不使用游戏截图或人工标注框更新权重,F1 达到 0.7647。
  4. 移动框没有改善这个工程测试集。E 在 验证集 变好,但在工程测试集与 D 打平。
  5. F 定位了 D 这五个漏检的出错环节。所有目标都有好 grid 框;4 个漏检是阈值校准,1 个是身份识别。
  6. F-Spatial 很有希望,但还没被证明稳定。工程测试集 F1=0.895,而 验证集 选中 F-Type;两者都需要新 sealed test。
当前最可靠的下一步保留 C 的身份特征和不移动的网格框,同时冻结 验证集 winner F-Type 与工程测试集候选 F-Spatial,去一组从未查看过的新录像上只比较一次。不要因为已查看工程测试集上的 0.895 更大,就直接把 F-Spatial 宣布为最终 winner。

如果下一项实验仍然只用图标训练,可以继续做更像真实 UI 的程序背景、多尺度特征,或在生成的图标摆放数据上训练完整 detector。以后如果允许少量真实游戏裁剪,一小组经过审核的数据也很可能提高稳定性。

后来的固定裁剪实验放宽了只用图标库训练的限制,加入人工确认的游戏裁剪;同时用已知 UI 位置去掉定位问题。因此,它的分类准确率不能直接与本篇检测器的 F1 分数比较。

图标库足以让模型很好地学会图标 ID,也能明显改善这个小型截图测试中的英雄和技能搜索。但只靠当前图标库和生成数据,还不能保证在所有游戏画面中都给出精确框,并把误检降到接近零。

12. 术语表

Backbone
把像素转换成特征图和 embedding 的共享视觉网络。
Embedding
用于相似度搜索的数值向量,不是最终类别概率。
Classification 输出分支
训练时把共享特征映射成各类别 logit 的最后几层。
Cosine similarity
比较归一化向量的方向;越高通常越相似。
Proposal / sliding window
模型推理前生成的候选矩形坐标;crop 是从该矩形切出的截图像素。
IoU
两个矩形框的交集面积除以并集面积。
NMS
保留高分框并压掉高度重叠重复框的规则。
Threshold
超过这个分数才接受预测的阈值。
AUROC
不固定阈值时,二分类分数的排序质量。
MAP@R
检验同 ID 视图是否整体排在检索结果前面的指标。
Precision / recall / F1
分别关注误检、漏检,以及两者的平衡。
Box regression
预测候选框应该怎样移动和缩放,才能更接近真值框。

实验内部保留了 metrics.json、algorithm-d-e-icon-only-metrics.json、algorithm-f-metrics.json、F 的训练历史、raw-grid cache、模型检查点 和源代码;当前公开页面没有提供下载链接。