摘要

游戏里英雄的每个主技能下面挂着若干子技能,面板上用很小的图标表示。读取器(把截图读成结构化字段的程序)原先只拿“官方规范图标”做模板匹配:在当前父技能允许的六个子技能里挑最像的。上一轮诊断发现,子技能是英雄面板中最弱的一类(两页上 12/18)。

本实验分三步:

  1. 补数据:逐像素精标真实截图中的子技能小图标和空白位置,最终 15 页、6 个训练来源组、135 个可见子技能。
  2. 真实模板补读 + 父技能核对:只对原先“未知”的位置,用真实小图标做模板再读一次;同时独立读取当前父技能图案,若与调用方给出的父技能不一致就拒判。第一版没有父技能核对,在“故意给错父技能”的压力测试里会多接受错误身份,未晋升;加上核对后这类接受降为 0。
  3. 分离来源检验:在三张与训练来源无交集的旧截图上,先保存预测再精修标签:21/27 → 25/27,0 接受错值、0 退步,但仍低于 95%。

补读以显式参数接入单图读取工具,默认读取器、公共接口和战斗记录 App 都没变。

要回答的问题

  • 用真实截图里的小图标当模板,能否找回规范模板读不出的子技能?
  • 如果父技能读错了,相似小图标会不会被解释成另一个身份?怎样挡住?
  • 在与训练无关的来源上,效果是否保持?

数据与来源

阶段 页数 / 来源组 可见子技能 空白位置 说明
首轮精修 12 页 / 6 组 108(新增 90 + 复用 18) 70 32 种身份,17 种只出现在一个来源组
跨来源补标 15 页 / 6 组 135(新增 27) 91(新增 21) 单来源身份 17 → 8
分离来源评估 3 页 / 3 个非训练组 27 21 两个校准组 + 一个留出组,以前曝光过,不是盲测

精修时同时看原生裁图、父技能图案和全部六个规范候选;沙漏/箭头、三剑/三盾等易混图案单独核对。审核选择保存在显式决定文件中。评估来源的标签只用于评分,硬性不进入训练参考库。“空白位置”指确认没有图标的格子,不推断英雄是否学过该技能。

方法

真实模板补读:真实裁图的金色通道做模板,30/32/34/36 像素四种尺度,在现有检测框周围 5 像素内匹配。只对原先未知的位置尝试,不替换已接受结果;要求真实模板首选与规范模板首选是同一身份,且至少 2 种不同身份参与竞争,最高分 ≥0.75、与第二名差 ≥0.10、规范首选分 ≥0.60。所有分数都不是校准过的概率。

为什么需要父技能核对:“大法师”和“大术法师”两个子技能的小图标都是相近的眼形,规范图金色通道相关度约 0.9794——单凭小图标几乎无法区分,只能靠它们挂在哪个父技能下。如果父技能本身读错,补读会把相似图案“合理地”解释成错误身份。

父技能核对:新的私有函数先独立读取当前父技能(主技能)裁图,与全部规范主技能及等级变体竞争(沿用原门槛 0.75 / 0.08),再检查调用方给的父技能是否一致。不一致、未知或竞争不明确时,子技能保持未知。运行时不使用人工父技能标签、来源、相邻帧或游戏状态。

压力探针:把每个可见图标分别配上错误的父技能(共 2160 次)、把空白位置和其他界面裁图配上 17 种父技能,检查是否会被错误接受。探针数不等于独立图片数,更不是整图误报率。

设置

每次评估都整组排除查询所在的来源组(来源留出),来源标签只用于离线分组。分离来源评估严格“先预测、存档,再精修标签、评分”,评估标签不反馈到参考库或阈值。没有训练新的神经网络;参考库是 135 张裁图生成的 540 个模板。

结果

首轮(无父技能核对,108 项):

真实匹配最低分 / 差值 正确 / 108 未知 错误父技能探针中新增接受
原方法 76 32 基线另列
0.85 / 0.10 77 31 1
0.80 / 0.10 82 26 4
0.75 / 0.10 85 23 6
0.65 / 0.10 88 20 14

正确父技能下各配置都没有接受错值,但错误父技能探针中新增了接受(0.75 配置的 6 项集中在大法师/大术法师互混)。这是故意替换父技能的压力测试,不是 6 个真实误识别;但据此决定不晋升这一版、也不继续降门槛。

加父技能核对后(135 项,来源留出):

数据/检查 原方法 新候选
原 108 项 76 正确 / 32 未知 87 正确 / 21 未知
新 27 项 23 / 4 24 / 3
合计 135 项 99 / 36 111 / 24(82.22%)
正确父技能下接受错值 0 0
错误父技能 2160 探针 原方法 23 次接受;无核对的补读再增 6 次 核对后 0 新增接受
91 空白 × 17 父技能 0 0
60 其他界面裁图 × 17 父技能 0 0

分离来源(3 页,27 项):

图片 原正确/未知 新正确/未知
校准组 A 7 / 2 8 / 1
校准组 B 7 / 2 8 / 1
留出组 7 / 2 9 / 0
合计 21 / 6 25 / 2(92.59%)

两种方法都是 0 接受错值、0 漏定位;新方法恢复 4 项、退步 0。21 个空白位置无误报;27 个父技能关联全部正确。主技能另计:18 个中 17 个正确接受、1 个拒判、0 误认,18 个等级全对。

失败与负结果

  • 首轮真实模板补读因错误父技能压力测试未通过,没有晋升。
  • 分离来源剩 2 项未知:一项规范首选 0.74297,刚低于 0.75,且真实参考库没有这个身份;另一项真实首选 0.84559 很高,但它所在的父技能参考库里只有这一种子技能,无法形成“两种身份之间的差值”,按规则拒判。曾在训练数据上试过“单类库”分支(113/135、无新增探针接受),因缺少泛化证据没有纳入冻结候选。
  • 主技能有一个拒判(有效度 0.46484375,被判为“无效或遮挡的裁图”),首选正确也没有回填。
  • 训练留出剩余 24 项集中在角部修饰(如夜/时间类)、低匹配的小眼形、以及没有其他来源样本的图案。
  • 首次生成审核画板时遇到空主技能报错,改为显示原空/未知状态后另存新版;中止目录保留。

局限

  • 25/27 = 92.59%,低于项目 95% 的目标;三张分离来源图以前都被看过,不是盲测,也不是三张全界面完整标注。
  • 只覆盖英雄面板子技能区域;背包、预览、目标关联、日志等缺口不变。
  • 新的整图耗时(p95)和 App 端到端时延都没有测。
  • 软件验证:54 项聚焦测试通过;三张完整图实际重读,关闭新选项时输出与修改前一致,开启后与冻结预测一致。测试通过不代表识别准确率。

结论与下一步

“真实小图标补读 + 独立父技能核对”在来源留出和分离来源上都带来了提升,且没有引入接受错值,因此以显式选项接入单图读取工具(默认关闭)。核心教训是:当小图标本身无法区分身份时,必须先可靠地确认它挂在哪个父技能下,否则补读只会把错误语境“解释通顺”。下一步只在已准入的训练来源中补齐缺样身份(包括 8 种单来源身份),用同样的留出和压力控制先冻结再评估;不根据这两项失败直接调阈值。