摘要
游戏里英雄的每个主技能下面挂着若干子技能,面板上用很小的图标表示。读取器(把截图读成结构化字段的程序)原先只拿“官方规范图标”做模板匹配:在当前父技能允许的六个子技能里挑最像的。上一轮诊断发现,子技能是英雄面板中最弱的一类(两页上 12/18)。
本实验分三步:
- 补数据:逐像素精标真实截图中的子技能小图标和空白位置,最终 15 页、6 个训练来源组、135 个可见子技能。
- 真实模板补读 + 父技能核对:只对原先“未知”的位置,用真实小图标做模板再读一次;同时独立读取当前父技能图案,若与调用方给出的父技能不一致就拒判。第一版没有父技能核对,在“故意给错父技能”的压力测试里会多接受错误身份,未晋升;加上核对后这类接受降为 0。
- 分离来源检验:在三张与训练来源无交集的旧截图上,先保存预测再精修标签: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 种单来源身份),用同样的留出和压力控制先冻结再评估;不根据这两项失败直接调阈值。
Comments