摘要
游戏里右键一个生物(兵种),屏幕上会弹出一块生物面板,列出它的攻击、防御、数量等数值。我们的程序(路由器 router,把截图分给各个读取器的程序)会定位这块面板并读数。为了避免从正在淡入淡出、半透明的面板里读出错误数字,读取前有一道外观门槛:面板左侧内部的“深蓝像素比例”必须 ≥ 0.85。
之前一轮训练数据检查发现,有 9 个面板标题和布局都找到了,却被这道门槛拒绝——原因是面板半透明的底色会随背后战场偏绿或偏紫。本实验在训练数据上找一个与背景颜色无关的替代特征:面板内文字本身有多亮。
结果:规则“底色不对、但文字亮度 ≥ 175 也通过”能多读回 8 个被拒正样本中的 5 个,同时 17 个淡出负样本全部拒绝。但安全余量只有 12 个灰度级,负样本只有 17 个,且没有亮背景(如雪地)的例子。收益约为训练面板的 2.4%,而当时面板读数的精确率是 100%,因此没有采用,生产代码未改。
要回答的问题
有没有一个不受战场底色影响的特征,能把“清晰但底色偏色”的面板和“正在淡出”的面板分开,从而安全地多读几块面板?
数据与来源
只用训练数据,测试截图包和测试池录像都没有打开。
- 正样本:训练截图包里所有生物面板帧。
- 负样本:之前逐帧精审(内部批次 B144)中,因“淡入 / 淡出 / 半透明过渡”被拒收的生物面板帧,只取训练池录像。
- 标签来自助手精审,不是人工真值。
方法
对每一帧:
- 用路由器做整帧 OCR(文字识别),再用现有的面板定位函数找出生物面板,同时记录现行外观门槛是否通过。
- 对面板内每一行 OCR 文字框,取框内像素亮度的 95 分位数(即“这一行文字最亮那部分有多亮”)。
- 取面板内所有行的中位数,作为这块面板的“文字亮度”。
思路:淡出的面板整体发暗、文字也暗;而底色偏绿偏紫只影响背景,不影响白色文字本身的亮度。
结果
| 组 | 帧 | 文字亮度中位数(95 分位) |
|---|---|---|
| 正样本,现行门槛通过 | 194 | 150–216 |
| 正样本,现行门槛拒绝 | 8 | 136, 153, 166, 175, 178, 185, 191, 208 |
| 负样本(已定位的淡出面板) | 17 | 104–163 |
| 其中现行门槛放过的淡出面板 | 1 | 160 |
另有 10 个正样本、19 个负样本没有定位到面板(布局锚点不全),不在上表中。
候选规则“底色不对但文字亮度 ≥ 175 也通过”:
- 多读回 5/8 个被拒正样本(175、178、185、191、208);
- 17 个负样本全部仍被拒绝;
- 最亮的负样本为 163,离门限只有 12 个灰度级。
顺带发现:现行门槛本身也放过了 1 个淡出面板(文字亮度 160)。
失败与负结果
候选规则没有采用。原因:
- 负样本只有 17 个,安全余量只有 12 个灰度级;
- 负样本没有覆盖雪地等亮背景——亮背景会把半透明文字框的 95 分位抬高,淡出面板可能因此越过门限;
- 收益只有约训练面板的 2.4%,而当时面板读数的精确率是 100%,冒险不划算。
局限
- 只在训练数据上分析,没有在测试集上评估,也没有逐字段核对“如果放行,读出的数是否正确”。
- 正负样本均来自助手精审标签。
结论与下一步
“文字亮度”是一个看起来与背景无关的有用特征,但现有证据不足以放宽门槛。要采用,需要先收集更多淡出负样本(尤其是亮背景),并逐字段核对放行后的读数是否正确。本实验未改生产代码。
Comments