← 返回报告索引
2026-09-04 · OWLv2 实测 + 级联过滤第一次量化

换成 OWLv2 之后:假阳性归零,剩下的确实只有「挑哪只杯子」

承接执行全记录。 两件事:① 实测 OWLv2;② 按操作者定的「每层记两个数」纪律, 第一次把级联过滤量化,并用它纠正我自己一处误判。全程离线,没碰硬件。

结论先行

配置框数目标杯另一只杯非杯子是杯子的比例
OWL-ViT @0.05(原来的)1655662.5%
OWLv2 @0.0524183387.5%
OWLv2 @0.30191630100%
OWLv2 @0.30 + 背景差 @50%151500100% 全对
这是整轮调查里第一个「零错误」的配置。 36 帧里出 15 个框,15 个全是目标杯。 代价:每帧 1623 ms(OWL-ViT 是 225 ms),以及逐帧召回只有 41.7%。
三条必须一起说的限制: ① 36 帧、一个房间、一种光照,没有验证换场景是否成立; ② 41.7% 是逐帧召回,不是「一次试跑能不能找到杯子」——两者不是一回事,见下面; ③ 背景差用的是跨集中位数代用品,不是真的空桌参考图。

一 · OWLv2 实测

同一批 36 帧(3 个数据集各 12 帧)、同一套 query、同一个选框规则,只换模型。

OWLv2 的 24 个 cup 框逐个放大
OWLv2 判成 cup 的 24 个框,全在这里,逐个裁开放大。 18 个是米色目标杯,3 个是那只蓝绿塑料杯(第 2、3、4 格), 只有 3 个不是杯子(第 7、12、19 格,分数 0.25 / 0.09 / 0.15,全是模糊的白色臂/夹爪)。 对比 OWL-ViT 同样口径下的 5 个目标杯 + 5 个 VR 手柄 —— VR 手柄和桌面圆孔在 OWLv2 下一个都没出框。

★ 阈值这条路,从死的变成活的 ★

OWL-ViT 时我量过:假阳性分数压过目标杯,调阈值会先删掉目标杯。OWLv2 完全反过来:

模型目标杯分数非杯子分数能不能靠阈值分开
OWL-ViT0.051 – 0.1250.058 – 0.213不能 —— 假阳性最高分更高
OWLv20.18 – 0.710.09 – 0.25能 —— 0.30 一刀切干净
OWLv2 阈值扫描(两个数一起报)
  阈值   留下框数   非杯子   目标杯   是杯子比例
  0.05      24        3       18       88%
  0.20      21        1       17       95%
  0.30      19        0       16      100%   <- 假阳性清零,只赔 2 个目标杯
  0.50      16        0       13      100%

二 · 「每层两个数」—— 这条纪律当场抓到我一个错

操作者定的规矩:
「每加一层都要记两个数:去掉了多少假阳性、赔进去多少真阳性。 只报前者就是重演这次的错误。」

按这个口径把之前几次「改 query」重算,我原来的判断错了一处:

干预假阳性真阳性(目标杯)净值我原来怎么说的
OWL-ViT 摘掉 a drinking glass6 → 7(不降反升)5 → 1(赔 4) 纯亏说对了
GDINO 摘掉 a drinking glass26 → 1(杀 25)1 → 1(赔 0) 净赚我写「2/36,过滤过头」—— 错了
OWL-ViT → OWLv26 → 35 → 18(+13)双赢—
OWLv2 阈值 0.05 → 0.303 → 018 → 16(赔 2)划算—
我第二次犯同一个错。「GDINO 摘 query 跑出 2/36」我只报了框数, 就下了「过滤过头」的结论。按两个数重算:它杀掉 25 个假阳性、一个真阳性都没赔, 精度从 3.7% 提到 50%。那次是净赚。 框数掉了 93% 看着像灾难,其实掉的全是垃圾。

三 · 级联的三层,在 OWLv2 之后要重排

操作者提的级联:

语义(开放词表 + 修正的干扰词)   杀掉 手臂 / 鼠标 / 线
        ↓
深度平面残差                      杀掉 平的东西(穿线孔)
        ↓
空桌背景差                        杀掉 场景固有物
        ↓
剩下什么 —— 逐框裁开人工看

思路成立,但换 OWLv2 之后每层的负载变了 —— 因为第 1 层比预期强得多,把第 2 层的活也干了:

层原本要杀什么OWLv2 之后还剩多少给它杀现在的价值
① 语义手臂 / 鼠标 / 线—36 帧里非杯子假阳性归零,超额完成
② 深度平面残差平的东西(穿线孔)0 个 —— 穿线孔在 OWLv2 下根本不出框 杀假阳性的价值≈0;但它仍是消歧和抓取需要的高度/距离来源
③ 空桌背景差场景固有物3 个(那只一直在的塑料杯) 现在是唯一还能杀掉剩余错误的一层
所以顺序建议改成 ① → ③ → ②。 不是否定第 2 层,是它现在的用途从「过滤」变成「提供 3D 位置」, 而那需要相机内参和深度-RGB 对齐(现场的事),不该挡住 ③ 的验证。

四 · 第 3 层实测(背景差)

离线怎么拿到「空桌」:同一数据集跨集抽 60 帧取逐像素中位数。 目标杯每集摆放位置不同,会被中位数平均掉;不动的东西(那只塑料杯、桌面圆孔、桌子)会留下。

原帧 / 跨集中位数 / 背景差 三联图
黄框是 OWLv2 在这一帧检到的那只蓝绿塑料杯。 ② 中位数背景里它还在(左边黄框内那团淡蓝绿),而桌面中央的目标杯被平均没了。 ③ 背景差热图:越亮 = 越「新」。目标杯和机械臂很亮,黄框那只杯子明显暗。
按【框内变化像素占比】过滤 OWLv2@0.30 的 19 个框,两个数一起报
  阈值   留下   目标杯留/共   另一只杯留/共   杀假阳性   赔真阳性
   0%     19       16/16          3/3           0         0
  40%     17       16/16          1/3           2         0     <- 白赚两个
  50%     15       15/16          0/3           3         1     <- 全清,赔一个
  60%     14       14/16          0/3           3         2
@40% 是白赚的:杀掉 2 个「另一只杯」,一个目标杯都不赔。 @50% 全清:3 个全杀掉,赔 1 个目标杯。
这是下界,不是上界。中位数背景被机械臂的运动残影污染了 (看图 ② 中间那团糊影就是臂)。真做的时候拍一张无臂无杯的空桌参考图, 分离度只会更好。所以这一层的真实性能至少是上表这个水平。
它的前置条件必须写下来:背景差要求参考图和运行时的相机位姿一致。 头在试跑期间是锁死的(head_lock),所以一场之内没问题; 但换头部预置位就要重拍参考图。这条要写进操作流程,否则会静默失效。

五 · 41.7% 这个召回该怎么读

最好配置在 36 帧里只出 15 个框,逐帧召回 41.7%。这个数看着低,但要注意两件事:

  1. 分母里有多少帧根本没有可见的杯子,我没数过。 从联系表看,相当一部分帧是机械臂挡住了、杯子出画了、或者运动模糊。 所以 41.7% 是「逐帧出框率」,不是「有杯子时找得到的比例」 —— 后者才是真召回,我没量。
  2. 用途是「伸手之前看一眼」,不是每帧都要中。 30 fps 下,逐帧 41.7% 意味着一秒内几乎必然有若干帧命中。 真正该量的指标是「一次试跑里能不能至少稳定命中一次、且位置一致」,不是逐帧率。
所以我暂时不能说「过了 GOAL 的 90% 验收」。 GOAL 那条写的是「≥30 帧人工看图、命中 ≥90%」。 按精度算是 100%(15/15),按逐帧出框算是 41.7%。 这两个数验收的不是同一件事,而 GOAL 当时没区分。 要不要按新口径重写验收标准,是下面的问题 2。

需要你决定的

1 · 1623 ms/帧 能不能接受?

OWLv2 比 OWL-ViT 慢 7 倍,比 SmolVLA 一次推理(1329 ms)还慢。 在线每帧跑是不可能的。但如果用途是「伸手之前看一眼」,一次试跑只跑一两次,1.6 秒完全可以。

我的建议:接受,但把它定死成「阶段性调用」而不是「每帧调用」。 配套要求是流程上要有一个「机器人静止、看一眼、锁定目标」的阶段 —— 这和递交那篇综述说的 pre-handover 阶段正好对得上,不是额外负担。
2 · 验收标准要不要按新口径重写?

GOAL 原文:「≥30 帧人工看图、命中 ≥90%」。现在发现「命中」至少有三种读法: 逐帧出框率 41.7% / cup 精度 100% / 「有杯子时找得到」——第三个我没量。

我的建议:改成两条,而且都要事先写死。
(a) 精度 ≥90%:出框里是目标杯的比例(现在 100%,已过);
(b) 单次试跑命中 ≥90%:一次试跑内至少有一帧命中目标杯、且多帧位置一致。 这一条我没量,需要按「集」而不是按「帧」重新跑一遍 —— 纯离线,我能做。
3 · 下一步做哪个(我能远程做的)
做什么能回答成本
A按「集」重算命中率,而不是按帧问题 2 的 (b),也就是真正的验收数低,纯离线
B扩到更多数据集 / 更多帧(现在只有 36 帧 3 个批次)OWLv2 这个结果是不是运气中,36→150 帧约 4 分钟
C把级联做成一个脚本,两个数自动出以后每加一层都有一致口径中
我的建议:B → A → C。 先 B 是因为36 帧太少,OWLv2 从 5 个目标杯跳到 18 个,这种幅度要先排除运气; 扩到 150 帧才谈得上把它当结论。然后 A 给出真验收数。C 是把纪律固化,可以最后做。
还没解决、也不该被这份简报盖过去的:
① 换场景是否成立完全没验 —— 这是你提的硬需求,而我手上所有数据都是同一个房间。 唯一能远程做的是拿不同批次去测(光照和摆位有差异),但那不等于换桌子。
② 第 2 层(深度)仍然量不了 —— 深度-RGB 对齐没做,那是现场的事。
③ 另一只塑料杯在 demo day 可能不存在,也可能变成合法目标 —— 背景差的语义是「不在开场画面里的东西」,这个定义在 demo 上是否还成立,要你确认。
2026-09-04 · 数据 05-training/detect/owlv2/records.json、 逐框人工分类 05-training/detect/manual_review.json、 裁图 05-training/detect/runlog/crops_owlv2_24boxes.jpg、 背景差脚本 03-software/scripts/layer3_background_diff.py。 上一份:执行全记录。