摘要

用户的要求很直接:从录像里自动选出“有用且静止”的截图——魔法书正在翻开的过程中不要取,等画面停下来再取;画面基本没变就不要重复取。之前的“五帧稳定”选帧器(B033)会漏掉只显示零点几秒的短面板,固定 0.2 秒补采又会混进半透明图。

本实验(内部编号 B133)先补上缺失的“尺子”:在训练录像窗口上逐段标注UI 事件——一种可读内容持续显示的区间(战场的一个回合视图、一个生物面板、魔法书的一页、一个提示框等),记下每个事件的清楚区间和过渡帧。然后用它来评估和训练一个学习型选帧器。

经过五轮“冻结后一次性留出”:最终版本 v5 在开发交叉验证上召回 98.2%,但在一次性留出(W25–W28,128 个事件)上只有严格 95.3%、宽松 96.9%;复核后真正不可读的关键帧只有 2/297(0.7%)。召回没达到 98% 的目标,但污染已低于 2%,经用户同意(接受约 0.7 秒的决策延迟)接入生产代码;App 未改。

要回答的问题

  1. 怎样客观地衡量一个选帧器:漏掉多少界面事件、取到多少过渡帧、重复多少、延迟多久?
  2. 学习型在线选帧器能否在不增加污染的前提下比五帧稳定法召回更多、更快?

数据与来源

  • 只用冻结划分中的训练录像。每个窗口 130–140 秒,按 10 fps 解码,保存 640×360 缩略图和实际解码时间。开发验证集和冻结验收集不在本实验内。
  • 窗口按截图包已知的 UI 帧时间挑选(只看时间,不看新像素),尽量覆盖界面操作密集的片段。
  • 总共 28 个窗口(W1–W28),按轮次分为调参、四次留出,后一轮的留出窗口都在上一版冻结后才确定和解码。
窗口组 窗口 事件 用途
调参 W1、W2 67 v1 设计
留出 1 W3、W4 66 v1 冻结后一次
留出 2 W5–W8 126 v2 冻结后一次
留出 3 W9–W12 124 v3 冻结后一次
留出 4 W13–W16 86 v4 冻结后才解码
新增开发 W17–W24 253 v5 交叉验证
留出 5 W25–W28 128 v5 冻结后才解码

所有窗口都来自已曝光的训练来源组(只是不同片段),不是独立来源。标注由助手逐帧看像素完成,不是独立人工真值;同一窗口内的事件不独立。

方法

事件参考

“清楚”用一个客观规则判定:与该段开头稳定外观相比,静止像素中显著变化(>0.08)的比例 <0.011 才算清楚。阈值在 8 个目视判定的例子上标定,余量很窄(不可读 ≥0.012、清楚 ≤0.0101),所以另报“宽松口径”:紧邻清楚区间 ±1 帧的过渡帧不算污染。战场单位原地呼吸、振翅、特效不构成新事件。

指标

  • 事件召回:至少一张关键帧落在事件清楚区间里的比例。
  • 过渡污染:落在过渡帧上的关键帧比例。
  • 重复:每个被召回事件多出的关键帧。
  • 延迟:事件清楚开始到选出关键帧的时间;在线方法只能用当时及之前的帧加少量前瞻。

选帧方法

  • 对照:固定每 0.5 秒取一张;B033 五帧稳定选择器。
  • 规则法(帧差 + 新内容):战场原地动画和界面渐变难以兼顾,调参集召回最高约 55–65/67 且污染高,放弃。
  • 学习型:每帧缩成 160×90 灰度,在多个区域(整帧、中央、行动条、底栏、HUD、日志角)、多个时间偏移(前后 2–3 帧)上计算帧差统计,加上固定 UI 区的外观统计和“距上次大变化的帧数”,用 ExtraTrees 判断“清楚 / 过渡”。再用“外观包络”去重:当前视图稳定期间每个像素出现过的最小/最大值——动画像素的包络宽,新提示框或新页面会超出包络,只有超出的变化才算新内容。

各版本的改动

  • v1:W1–W2 训练,前瞻 3 帧,阈值 0.7。
  • v2:W1–W4 训练,前瞻 2 帧,连续两帧判清楚才输出,阈值 0.6。
  • v3:设置同 v2,W1–W8 训练。
  • v4:诊断发现很多漏检是“分类器已判清楚,但被包络当成旧视图压掉”(新回合视图、重新打开同一页),改为“连续 ≥3 帧过渡之后的第一个清楚帧必出关键帧”。
  • v5:在 W1–W24 留一窗口交叉验证上比较多个候选,选“间隔 2 + 新颖度余量 0.05 + 等稳定(hold)”:候选帧若还在变,最多再等 5 帧,取最稳定的那张;分类器判过渡时立即发出已持有的帧。
v5 候选(W1–W24 留一) 召回 严格/宽松(/722) 关键帧 严格污染
v4 设置 691 / 696 1,674 98
间隔 2 702 / 707 1,729 102
间隔 2 + 余量 0.05 706 / 711 1,980 115
行动条数字区新颖度 704 / 708 1,990 107
整块静止兜底 707–708 1,917–2,179 140–329
加 9×16 格静止特征重训 无提升 — —
v5:间隔 2 + 余量 0.05 + 等稳定 709(98.2%)/ 710 2,055 74

设置

每个版本只在开发窗口上设计和选参,冻结后才在新的留出窗口上各方法只跑一次。v5 冻结配置:W1–W24 训练(31,388 帧),ExtraTrees 300 棵树。

结果

留出 2(W5–W8,126 事件)

方法 召回 严格/宽松 关键帧 污染 严格/宽松 延迟 中位/p90
学习型 v2 116/120 事件口径(92.1% / 95.2%) 230 17/8 0.1/0.2 秒(+0.2 秒前瞻)
B033 五帧稳定 120(95.2%) 239 14/10 0.5/2.2 秒
固定 0.5 秒 124/126 1,040 159/101 0.2/0.4 秒

留出 3(W9–W12,124 事件)

方法 召回 严格/宽松 关键帧 严格/宽松污染 复核后不可读
学习型 v3 89.5% / 92.7% 300 18/12 1
B033 五帧稳定 85.5% / 88.7% 334 74/60 4
固定 0.5 秒 120/124 1,040 268/208 未复核

留出 4(W13–W16,86 事件)

方法 召回 严格 / 宽松 关键帧 严格污染 复核后不可读 延迟 p90
学习型 v4 83/86(96.5%)/ 84(97.7%) 268 14 1(黑屏) 0.2 秒
学习型 v3 82 / 82 245 11 未复核 0.3 秒
B033 五帧稳定 78 / 78 314 12 未复核 4.9 秒
固定 0.5 秒 85 / 86 1,038 128 未复核 0.4 秒

留出 5(W25–W28,128 事件)

方法 召回 严格/宽松 关键帧 严格污染 复核后不可读 关键帧延迟 中位/p90 在线决策延迟 中位/p90
学习型 v5 122/128(95.3%)/ 124(96.9%) 297 13 2(0.7%) 0.2/0.6 秒 0.7/0.9 秒
学习型 v4 117/128(91.4%)/ 119(93.0%) 254 17 4(1.6%) 0.1/0.2 秒 0.3/0.4 秒
B033 五帧稳定 110/128 / 112 294 20 未复核 0.4/1.6 秒 段结束才知道
固定 0.5 秒 122/128 / 128 1,038 169 未复核 0.2/0.4 秒 —

v5 按类:战场 42/45、魔法书 40/41、生物面板 17/19、英雄面板 2/2、日志 5/5、提示框 5/5、菜单 3/3、其他界面 8/8。特征 + 推断约每帧 0.81–0.95 毫秒。

生产接入

用户同意 v5 与约 0.7 秒的决策延迟后,生产模块用与冻结实验相同的预处理、特征和规则实现。用留出 5 的 5,190 帧预览图重跑,297 个关键帧及决策帧与实验结果完全相同(这是实现一致性核对,不是新评估)。命令行可对一段录像选帧并保存原图。

失败与负结果

  • 规则法放弃。
  • v1 在新窗口的边界帧上泛化差。
  • 交叉验证的 98.2% 没有迁移到留出(95.3%),说明在 24 个窗口上的选参仍有过拟合,或窗口之间差异很大。
  • 留出 5 的 6 个漏检:2 个在窗口边界(连续确认与前瞻在边界处发不出)、1 个关键帧落在清楚区间前一帧、1 个判官面板只清楚 4 帧(0.4 秒)没有关键帧、1 个回合视图只有按钮变灰 3 帧、1 个面板的无提示框状态被随后带提示框的状态代替。去掉边界事件也只有 122/126(96.8%)。
  • 等稳定(hold)把污染从 115 降到 74,代价是约 0.4 秒额外决策延迟。
  • 标注中也有错:一个真实的两法术页面起初被误判为淡入中,放大后改正;参考里有一个静止段混着“空学派页”和“只有一个法术的页”,整段标为过渡,落在后者的关键帧被记为污染(评分后未改标签)。
  • 留出 3 发现整屏静止式参考在动态地图(熔岩背景一直在动)上不可靠:许多“污染”其实是清楚画面,而参考也漏标了一些真实事件,所以召回只相对已标事件,真实召回可能更低。

局限

  • 所有窗口来自已曝光的训练来源组;冻结验收集没有打开。
  • 13.5% 的事件清楚时间 ≤0.4 秒,“等稳定再取”的在线方法天然吃亏。
  • B033 和固定 0.5 秒的污染没有全部复核。
  • 生产模块只做了离线批量接口,逐帧推送的实时接口没有实现。

结论与下一步

先建立“事件级参考”这把尺子,才能客观比较选帧器。学习型 v5 与五帧稳定法相比召回更高、污染相当,而且是在线的(0.7 秒内决定,B033 要等稳定段结束)。但 98% 召回目标没达到,主要缺口是 ≤0.4 秒的短面板和提示框。下一步对这类短内容做局部区域判定(面板框、提示框、HUD 各自静止),而不是整屏静止,并在离线评分中单列窗口边界。