运动模糊检测 · 标注复核

2026-08-11 · egocentric 数据质量评估 · 第一人称视频运动模糊帧占比

需求条款:运动模糊帧占比不高于 10%。

本次目的:用新的复合检测规则对 4 个样本片段(2 个合格 / 2 个不合格)跑一遍, 生成带标注的视频供肉眼复核——判断检测器标的运动模糊段是否真的是模糊,以及标尺松紧是否合适。

数据来源:慧宇样本库(metrics 仓库 egocentric 校准用的同一批数据)。 视频仅内部参考,未发布到任何 Catalog。

检测规则

# 逐帧判定(原生 fps,不降采样)
motion_blur(t) ⟺ sharp_rel(t) < 0.40 AND flow(t) ≥ 4 px/帧
# 带迟滞退出,避免抖动
退出条件:sharp_rel > 0.55 flow < 2.5

sharp_rel = 该帧 32×32 块 p90 清晰度 ÷ 该片段 p90 参考清晰度
flow = 稀疏光流中位数(px/帧)
dark = 亮度 < 25 的帧,单独报告,不计入模糊率
soft_static = 清晰度低但光流也低(散焦/空场景),不计为运动模糊

为什么不用仓库现有的 blur_rate(var-Lap < 100 绝对阈值)?

三个已测量的问题:

  1. var-Lap 系统性低估运动模糊——PhaseB 注入实验中,运动模糊 ×3 后 var-Lap 仅读到 24.4,但 WiLoR 手部检出率已从 99.4% 跌到 66.1%。同一帧的空间模糊 box2 var-Lap 读 11.1(更低)却几乎不影响检测。
  2. 10% 这条线恰好落在标注重叠区——16 个标注片段中,6_OK(厂方合格)blur_rate = 10.5% 会被判 FAIL,1_BAD(厂方不合格)blur_rate = 7.8% 反而 PASS。15/16 一致但边界两个都判反。
  3. 绝对阈值不跨相机——原生清晰度跨 15×(慧宇 160 vs genrobot 2254),高清晰度相机上 10% 规则直接无法触发。

新规则用 相对清晰度(除以片段自身 p90)解决跨相机问题,用 光流 区分运动模糊与散焦/空场景。

结果总表

片段厂方判定时长fps 仓库 blur_rate
var-Lap<100
新规则
运动模糊帧率
暗帧率模糊段数模糊总时长 @10% 规则
1_BAD 厨房制作食物(2) 不合格 9:3321 8.3% PASS 24.8% 0%2042:30 FAIL
5_BAD 厨房制作食物(1) 不合格 0:4830 51.6% FAIL 34.4% 1.4%220:17 FAIL
6_OK 咖啡店调配配料 合格 1:5930 9.2% PASS 14.8% 0%180:19 FAIL
14_OK 合格 0:3060 0.0% PASS 4.7% 0%50:01 PASS

新规则修复了什么:

未解决:6_OK 在 14.8% 仍超 10%,但厂方判了合格。看标注视频后我认为检测器是对的、标签可疑——wiki 之前也在 15/16 一致性处卡在这条上。需提交厂方裁定。

逐片段复核

建议先看 reel(仅 flagged 段,快速判断精确率),再看 annotated(完整片段,判断召回率)。 HUD 读数:sharp_rel / flow / aniso / luma,底部色带红=模糊 / 琥珀=软但静止 / 蓝=过暗 / 白线=播放头。

1_BAD · 厨房制作食物(2)

厂方不合格 检测 FAIL 24.8%
24.8%
运动模糊帧率
204
模糊段
2:30
模糊总时长 / 9:33
928.9
参考清晰度 p90
▶ Reel(30 个最长模糊段,~1.5 分钟)
▶ 完整标注视频(9:33)

⚠️ 1_BAD 的 24.8% 偏高——在不锈钢操作台上平移时,全局清晰度塌缩但帧其实是对焦的。已用 32×32 块 p90 替代全局均值,修好了一半假阳性,另一半仍在。这个数字方向对,但不是校准值。

模糊段表(前 20 / 204 段)

5_BAD · 厨房制作食物(1)

厂方不合格 检测 FAIL 34.4%
34.4%
运动模糊帧率
22
模糊段
0:17
模糊总时长 / 0:48
522.5
参考清晰度 p90
▶ Reel(全部模糊段)
▶ 完整标注视频(0:48)

这段是全库最差的片段。5–8 秒处 flow 高达 60 px/帧(手快速挥动),sharp_rel 跌到 0.007——几乎完全拖影。

模糊段表(全部 22 段)

6_OK · 咖啡店调配配料

厂方合格 检测 FAIL 14.8%
14.8%
运动模糊帧率
18
模糊段
0:19
模糊总时长 / 1:59
885.5
参考清晰度 p90
▶ Reel(全部模糊段)
▶ 完整标注视频(1:59)

厂方合格但检测判 FAIL。9.3–11.6 秒有 2.3 秒连续模糊段(sharp_rel 0.065,flow 30 px/帧)——手在快速调配时大幅拖影。这是边界争议片段,需要你判断:这个程度的模糊是否可接受?

模糊段表(全部 18 段)

14_OK

厂方合格 检测 PASS 4.7%
4.7%
运动模糊帧率
5
模糊段
0:01
模糊总时长 / 0:30
3202.6
参考清晰度 p90
▶ Reel(全部 5 段,共 1.3 秒)
▶ 完整标注视频(0:30, 60fps)

60fps 干净控制组。只有 5 段共 1.3 秒被标——都是手快速运动时的轻度拖影。var-Lap 在这台相机上永远报 0.0%(绝对阈值打不穿 p90=3202 的高清晰度),相对阈值才能看到这些帧。

模糊段表(全部 5 段)

开发过程中发现的两个缺陷

① 暗帧被误判为最大模糊 已修复

5_BAD 的操作员头伸进冰箱时,画面接近全黑。近黑帧的 Laplacian 方差趋近零 → sharp_rel 读到 0.01 → 被判为「最大运动模糊」。 和仓库已记录的 occlusion_rate 同一个 bug(「在任何暗场景上都会触发」)。

修复:亮度 < 25 的帧单独标为 DARK,不计入模糊率,标注视频中用蓝色显示。

② 平坦场景仍会误触发 未修复

1_BAD 在大面积拉丝不锈钢操作台上平移时,全局清晰度塌缩——但帧是对焦的,只是场景本身没有纹理。 已将清晰度从全局均值改为 32×32 块的 p90(「这个帧里最清晰的部分是否仍然清晰」),修好了一半假阳性,另一半仍在。 1_BAD 的 24.8% 因此偏高,方向正确但不是校准值。

根本原因:和仓库测过的 blur_rate_rel 同一个 framing confound(仅相机距离就能造成 8× 清晰度摆动)。 aniso(各向异性)列本来想解决这个——运动模糊是方向性的,空场景是各向同性的——但旋转模糊也没有单一方向,所以只记不判。

需要你确认的问题

  1. Reel 里有多少段不是模糊?
    特别是 1_BAD,预期有平坦操作台的假阳性。如果只是少数几段,调阈值就行;如果占了三分之一,清晰度度量方式需要换掉才能上 gate。
  2. 6_OK 和 14_OK 里标出的模糊,严重到你会判帧不可用吗?
    这两段是厂方合格的。检测器标到的都是手在大幅运动中的拖影,但「轻度运动模糊」和「手不可恢复」是不同的门槛——10% 的预算只有在门槛确定后才有意义。

技术细节

分析脚本:mblur.py(检测)、annotate.py(标注渲染)、reel.py(模糊段剪辑)——均在 session 目录。

关键设计:

未校准项:以上结果均未对手部可检测性校准。PhaseB 运动模糊剂量序列(×3 → WiLoR 66%)是把「标出」变成「手不可恢复」的锚点,跑它需要 4090。