摘要
我们的程序要从对局录像或截图里自动读出信息。第一步是知道“这一帧是什么画面”:是选秀界面、出战确认页、布阵、战斗中、生物面板、战斗日志,还是攻击伤害预览。这一步叫场景分类。原有做法不是训练出来的模型,而是拿每类最多 60 张参考图做最近邻比较。本实验用更多逐帧审过的截图,正式按“训练集 / 测试集”训练和评估分类器。
结论分两半:
- 在与生产相同的“全局缩略图”特征上,训练出来的逻辑回归、SVM、新标签最近邻都没有超过原参考库(测试准确率 0.923 对 0.926)。差距几乎全在“攻击/法术预览”这两类上。
- 改用一个专门的小检测器——在战场区域找预览弹窗里的白色骷髅图标——预览召回在测试集上达到 0.941、精度 0.914。把它叠加在原参考库之上,15 类测试准确率从 0.926 升到 0.970,宏召回从 0.851 升到 0.916。
仍未全部达到项目“每类 ≥95%”的标准:开战瞬间(还没出现顶部状态栏)常被认成布阵;攻击预览与法术预览没有区分。
要回答的问题
- 用大量逐帧标签训练的分类器,能否比现有参考库更准地判断画面类型?
- 现有方法最弱的类别是什么?能否针对性补上?
- 每类能否达到 95% 的项目标准?
数据与来源
- 标签来源:之前一轮“截图包精审”(内部批次 B144/B131)对 111 个截图包、1785 张接收帧逐帧标注了场景,另有被拒收的过渡/动画帧。10 月的截图包另有逐帧场景标注。标签是助手精审得到的,不是人工真值。
- 按整段录像划分,同一段录像的帧不会同时出现在训练和测试中:
- 训练:1215 张(旧录屏训练 1024 张 + 10 月训练包 191 张)。
- 测试:570 张(旧录屏测试 26 局 444 张 + 10 月测试包 10 局 126 张;后者的场景标签在二次审核中 124/126 一致)。
- 另有一批冻结留出数据(永远只在最后验收时打开的录像),本实验没有打开。
- 场景共 15 类:五种选秀界面、出战确认页、布阵、战斗中、英雄面板、生物面板、法术书、战斗日志、攻击预览、法术预览、其它。也把它们合并成几个大类(选秀 / 确认 / 布阵 / 战斗 / 面板 / 日志)来看,因为自动分析的“阶段门”(决定何时开始送图分析的程序)主要依赖大类。
方法
基线:参考库最近邻
把截图缩到 320×180,再提取彩色 64×36 和灰度 160×90 的布局向量,与参考库里的图逐一比距离,取最近的标签。参考库的标签名与 15 类不完全一致,映射关系只在训练集上用多数投票决定。推理约 1 毫秒。
v1:同样的特征,训练分类器
特征完全不变,比较三种做法:用训练集标签替换参考库做最近邻、RBF SVM、逻辑回归。超参数只在训练集上做“按录像分组的 5 折交叉验证”(同一录像的帧只出现在同一折里),用宏平均召回选择,之后才看一次测试集。最终预选的是逻辑回归 C=1。
v2:战场颜色统计的预览检测器
v1 失败的原因是预览:攻击预览就是在战斗画面上弹出一个小数字框、高亮目标格,在 24×14 那样粗的布局里几乎看不见。于是只在战斗类画面上(训练 307 / 测试 145)把战场区域分成 16×9 网格,统计橙、黄、白、绿像素比例,训练逻辑回归和 ExtraTrees。
v3:骷髅图标模板匹配
每个攻击/法术预览弹窗都有一个白色骷髅图标(表示预计击杀数)。做法:把战场区域转成白色像素的二值图(半分辨率),用一张训练帧里裁出的骷髅图标做归一化相关模板匹配(TM_CCOEFF_NORMED),取最大分。门限 0.756 只在训练集上按录像分组交叉验证选出。
组合规则(在评分前固定)
先用原参考库判场景;被判为“战斗中”的帧再跑骷髅检测,分数超过门限就改判为“攻击预览”(攻击和法术预览不分)。
v4:布阵开始按钮模板
为了区分“开战瞬间”和“布阵”,尝试匹配布阵界面底部正中的交叉双剑开始按钮,门限 0.30 同样只用训练集选。
设置
- 测试集按协议只评一次;不达标就回训练集诊断,不在测试集上调参。v4 是例外:它是第二次看测试集,报告中已注明。
- 运行时用户正在玩游戏,所有计算单线程、空闲优先级,游戏保持正常响应。
结果
v1:训练分类器没有超过参考库
| 方法 | 训练 CV 准确率 / 宏召回 | 测试准确率 | 测试宏召回 | 测试大类准确率 |
|---|---|---|---|---|
| 现有参考库最近邻 | — | 0.926 | 0.851 | 0.986 |
| 新参考库最近邻(训练集标签) | 0.943 / 0.782 | 0.923 | 0.780 | 0.983 |
| RBF SVM | 0.941 / 0.815 | 0.923 | 0.788 | 0.986 |
| 逻辑回归 C=1(预选) | 0.950 / 0.817 | 0.923 | 0.793 | 0.986 |
原参考库在测试集上的逐场景表现:选秀四类、确认页 34/34、法术书 75/75、日志 45/45 全对;英雄面板、生物面板各 0.979;布阵召回 1.0 但精度 0.83(5 张开战瞬间被认成布阵);战斗中召回 0.955、精度 0.75;攻击预览 0/30、法术预览 0/4——参考库里没有预览类,全被归为战斗中。训练出来的模型能分出一部分预览(召回 0.3),但又把 9 张战斗中误判成预览。
对自动分析最关键的大类判断已经可靠:测试集 97 张选秀画面全部判为选秀(精度 1.0),确认页 34/34,大类准确率 98.6%。
v3:骷髅图标检测器
| 预览召回 | 预览精度 | 战斗中召回 | |
|---|---|---|---|
| 训练 CV(分组 5 折) | 0.929 | 0.750 | 0.951 |
| 测试(一次) | 0.941(32/34) | 0.914 | 0.973(108/111) |
单帧约 22 毫秒(单线程、空闲优先级、机器有负载)。
组合分类器(测试 570 张)
| 准确率 | 宏召回 | 大类准确率 | |
|---|---|---|---|
| 15 类 | 0.970(参考库 0.926) | 0.916(参考库 0.851) | 0.986 |
| 预览合并为一类 | 0.977 | 0.987 | 0.986 |
逐场景:选秀四类、确认页、法术书、日志 100%;英雄面板、生物面板 0.979;预览召回 0.941、精度 0.914。
失败与负结果
- v1 负结果:在全局缩略图特征上,用新标签训练的三种模型都没有超过原参考库,未采用。
- v2 负结果:颜色统计的预览检测器测试召回 0.32、精度 0.41。战斗画面本身到处都是这些颜色,无法区分。
- v4 负结果:开始按钮模板在训练集上就不可靠(布阵召回 0.83、精度 0.76;交叉验证合计 43/54 命中、12 次误报);测试(第二次看测试集)布阵召回 0.70、精度 0.57。很多布阵画面里按钮被遮挡或状态不同。未采用。
- 未达 95% 的类:战斗中召回 0.928(5 张开战瞬间无顶部状态栏被认成布阵,3 张被误判为预览);布阵精度 0.833;攻击预览和法术预览没有区分。
局限
- 标签是助手精审结果,不是人工审核的真值;冻结留出数据没有打开,所以这些数字都不是最终验收。
- v4 第二次使用了测试集,它的测试数字不再是“只看一次”的干净估计。
- 骷髅检测只用一张训练帧裁出的模板。
- 开战瞬间被认成布阵,对当时的自动分析没有实际影响(两种画面都会被送去分析),但它仍是分类错误。
结论与下一步
- 训练且在测试集上验证过的部件是骷髅图标预览检测器(测试召回 0.941、精度 0.914)。组合分类器测试 15 类准确率 0.970,预览合并后 0.977;除“开战瞬间 vs 布阵”(5 帧)和“法术预览 vs 攻击预览”外,各场景 ≥0.979。
- 全局缩略图上的训练分类器没有超过参考库,未采用;阶段门里的选秀/菜单判断已经 100%,不需要改。
- 下一步:把骷髅检测接入关键帧流的场景标签,让自动分析按场景限量、优先识别预览帧(当时需等用户允许运行测试后再做);开战瞬间与布阵的区分需要别的局部证据。
Comments