跳到主要内容

让它指出东西在哪:开放词表检测(OV-DETR)

这一章讲三件事: 「认出是什么」和「指出在哪儿」为什么是两件事; 为什么把 CLIP 接到检测器上会卡在一个谁都没想到的地方; 以及把「这是第几类」换成「配不配得上」这一个改动,怎么把整条路打通。 它在全书链条里的位置: 第 01 章结尾留了一句话—— 这个模型只见过「整张图配一句话」,所以它不知道东西在哪儿。 那句话在这里第一次被正面处理,后面第 13、14 两章各用另一种办法处理同一件事。

⚠️ 这一章开始,全书从「分类」转到「别的视觉任务」。 第 08–11 章比的是分类准确率,这一章换了一套评分标准 (一个任务用来打分的那个量,业内叫指标——本章第 2 节末尾把它讲清楚), 所以两边的数不能互相比。

1. 顶层全景:一条卡住又被绕开的链

这一章的形状是「两次卡住、一次绕开」:

想要的东西
「照片里有猫吗?在哪儿?」——而「猫」这个类训练时一次都没出现过

第一条路:现有的开放词表检测器
│ 先用一个网络框出「这块可能是个物体」,再拿 CLIP 去认它是什么
✗ 卡住:那个框框网络是在旧类上训的,**对猫几乎不给框**
│ 后面认得再准也没用——它根本没把猫圈出来

第二条路:换一种不需要框框网络的检测器(DETR)
│ 它一口气吐出 N 个框,再和真值一对一配起来
✗ 卡住:配对时要算「这个框属于第几类的代价」
│ **猫没有标签,这一项算不出来**

绕开:把问题换个问法
✓ 不问「这是第几类」,只问「这个框和我给的条件配不配得上」
│ 条件 = 一个类名,或者 = 一张示例图

结果:新类 mask mAP 17.4(对照 16.1),**而且不以牺牲旧类为代价**

图说:两次卡住的位置不一样,但病根是同一个——
**训练流程里但凡有一步需要「新类的标签」,这一步就走不通。**
绕开的办法也只有一个方向:**把需要标签的那一步,改写成不需要标签的问法。**

这一章的主走查:一张从网上找来的照片,里面有两只猫和一个玩具; 模型是在一个 866 类的数据集上训的,而「猫」属于那 337 个训练时一次没出现过的类。

这两个数原书自己打架,照实说明: 方法那一节写的是「把 337 个罕见类定为新类, 只在其余的类上训」,那么旧类就是 1203 − 337 = 866; 而结果表的表注写的是「886 个旧类、317 个新类」。 两组数各自都凑得成 1203,必有一处是笔误我们按方法那一节取数,全章统一用 866 / 337——理由是方法那一节把划分规则写全了 (按图片多少分成 frequent / common / rare 三档,rare 这一档整个当新类), 表注只给了两个孤零零的数1

发生了什么具体的数或状态
老路:框框网络扫一遍这张照片猫那两块的响应很低,几乎一个框都没给出来
换 DETR:100 个「物体查询」一口气吐 100 个框框有了,但每个框还要被判成某一类
一对一配对要算「分类代价」猫没有标签 → 这一项是空的 → 配不了
改问法:每个查询附一个条件,只判「配 / 不配」输出从「1203 个类的概率」变成 2 个数
条件从哪来:把标注框里的东西裁出来过 CLIP得到一串数(图像那一侧)
或者:把类名过 CLIP 的文本编码器也是一串数;训练时两种随机挑一种
条件过一层投影,加到物体查询上得到「带条件的查询」
一张图里多个物体:查询复制 R 份、条件复制 N 份一次前向出 N×R 个查询,用掩码彼此隔开
再要求模型把条件那串数重建回来多一项损失,逼它把不同概念分得更开
推理:把全部 866+337 个类名的那串数都喂进去取分数最高的 300 个预测
结果新类 17.4(老方法 16.1),旧类 61.0(老方法 59.5)
代价一次推理 1.49 秒 → 23.84 秒;并行化后 9.57 秒

这张表里的数全是书里的真数,除了第 ①、② 步那张照片是我们为了串起来编的场景 (书里的失败图例用的是同类照片,里面也是两只猫)2

2. 先说清楚:检测比分类多要一样东西

这一节回答:为什么前十一章那套东西挪不过来?

分类只答一个问题,检测要答两个

输入输出
分类一张图一个答案:「这是猫」
检测一张图一串答案:「这里有只猫,坐标是(120, 80, 240, 300);那里有个玩具,坐标是……」

那个「坐标」的正式名字叫边界框——四个数,左上角和右下角,把物体圈出来。

书里给检测下的定义就是这两件事:找出图里的物体,并且定位它们3

老毛病:只认训练时定死的那几类

这是这一章的起点,书里说得很直白3:

一个在常用检测数据集上训出来的检测器,只认得那个数据集里的 80 类 (人、猫、狗……)。这 80 类之外的东西,对它来说不存在。

想加一类怎么办? 老办法是:去收集这一类的照片、逐张把框画上、再重训一遍。 书里说这条路又贵又不实际——收数据和重训的成本都在那儿摆着4

这就是「开放词表」这个说法的由来: 词表指的是「这个模型认得的类名清单」; 开放的意思是这份清单不封口——你临时说一个新词,它也得能干活。 这个词你在任何一篇讲检测、分割的新论文里都会撞见。

顺带把评分标准讲了,不然后面的数字没法读

检测的答案是框,所以「对不对」不是是非题,而是「框得准不准」:

① 拿模型给的框和真正的框比,算重叠程度:
两个框的交集面积 ÷ 并集面积 —— 这个比值叫**交并比**
② 定一条线(比如 0.5):重叠超过这条线,才算这个框「找对了」
③ 每个类各自算一个分,再对所有类取平均

图说:这个平均分就是检测这一行通用的成绩,**名字叫 mAP,越高越好**。
本章还会出现「mask mAP」——那是把「框重叠多少」换成「逐个像素重叠多少」,
因为其中一个数据集要求连物体的轮廓也描出来。
(**这个指标和第 08–11 章的分类准确率是两回事,数值不可互比。**)

3. 第一次卡住:框都没框出来,后面全白搭

这一节讲的是这一章的动机,也是主走查第 ① 步。

现有做法长什么样

书里说,现有开放词表检测器的核心思路是同一个: 把检测器抽出来的视觉特征,和 CLIP 那一侧的文本嵌入对齐5。 对齐之后,分类那一步就可以只靠类名做,不需要这一类的训练图。

听上去很通顺。问题出在这套流程的第一步。

那一步叫候选框网络

绝大多数检测器是两段式的:

第一段:候选框网络(常写成 RPN)
扫一遍整张图,吐出几百上千个「这块可能是个物体」的框
—— 它只回答「是不是物体」,不回答「是什么物体」

第二段:分类
把每个框里的东西认出来是哪一类

图说:第二段接上 CLIP 就能认新类了——**但那要建立在第一段把它框出来的前提上。**

卡点

候选框网络本身也是训出来的,而它只在旧类上训过6

书里给的判断是:它那个「是物体 / 不是物体」的二元性质, 会让它过度贴合见过的类,从而对新类给不出响应。 书里的图例里,两只猫的区域「几乎没有得到什么响应」,基本一个框都没有。

这一步失败之后,后面全部白搭: 你的 CLIP 再强,它也只能在拿到的那些框里挑; 猫压根没被圈出来,它就永远没机会认出猫。

判断(我们的,不是书里的): 这个卡点值得单独记住,因为它有一个通用的形状—— 一条流水线里只要有任何一段是「在旧数据上训出来的、且不可绕过」, 那一段就是整条线的天花板,后面接多强的模型都抬不上去。 如果错,会错在: 如果候选框网络能被训得足够「不挑类」(比如用海量无标注数据训一个 纯粹判断「这是不是一个东西」的网络),这个天花板就不存在了。 书里没有试这条路,只是绕开了它。

4. 第二次卡住:换一种检测器,卡在配对上

这一节是全章最需要慢讲的地方,因为它涉及一个必须先讲清的机制。

先讲这种检测器怎么工作

有一族检测器根本不要候选框网络,书里用的就是它7它的做法有点反直觉:

① 图片过一遍主干和编码器,变成一串特征

② 准备 N 个**物体查询**——N 是固定的(比如 100)
这 N 个查询是训练出来的,**每一个都相当于一个「找东西的名额」**

③ 解码器拿这 N 个查询去看那串特征,**一口气吐出 N 个预测**
每个预测 = 一个框 + 一个类别

图说:它不挑候选、不做后处理,**一次就把 N 个答案全摆出来**。
代价是这 N 个答案是无序的:**第 3 号查询吐出来的框,对应真值里的第几个物体?没人知道。**

于是需要「配对」

训练时必须先把这 N 个预测和真值一对一配起来,才知道每个预测该往哪儿改8

真值: [猫A] [猫B] [玩具] ← 只有 3 个
预测: #1 #2 #3 …… #100 ← 有 100 个

要找一种配法,使「配对总代价」最小:
#17 ↔ 猫A #43 ↔ 猫B #6 ↔ 玩具
其余 97 个 ↔ 「没有物体」

每一对的代价 = **分类代价**(这个预测认成这一类有多离谱)
+ **框的代价**(这个框和真值框差多远)

图说:「在两组东西之间找一种一对一的配法,使总代价最小」是一个老问题,
有现成的解法,**名字叫匈牙利算法**——书里直接用它。
你只要记住它干的事:**给每个预测指派一个真值,或者指派「什么都不是」。**

卡点:分类代价算不出来

书里把这件事称作「主要的挑战」9:

配对代价里有「分类代价」这一项,而算它需要标签。 新类根本没有标签,这一项就是空的——配对做不下去。

结果是:这套流程只能在有标签的旧类上跑。 换句话说, 这种检测器天然是闭集的——它的训练方式里写死了「类别数是固定的」。

两次卡住的对比,一句话: 第一次卡在「新类框不出来」,第二次卡在「新类配不上对」。 同一个病根:训练流程里有一步需要新类的标签。

5. 绕开:把「这是第几类」换成「配不配得上」

这一节是全章的关键一招,只有一句话,但要讲清它为什么够。

改法

原来的问法: 这个框里的东西是第几类?
→ 输出是 1203 个数(每一类一个概率)
→ 算代价需要知道正确答案是第几类 → 需要标签

新的问法: 我给你一个条件(比如「猫」这个词),
这个框和这个条件**配得上吗**?
→ 输出是 2 个数(配上 / 没配上)
→ 算代价只需要知道「这个框是不是那个条件说的东西」

图说:书里管这叫**条件匹配**。
配对代价里的分类损失被换成了一个二元判断,**这个判断和「一共有几类」无关**——
所以它对没见过的类同样成立。

书里对这一改的说法是:这样训出来的对应关系是稳健的, 能推广到测试时那些没见过的条件10

为什么这一改就够了

因为「配不配」这件事是可以从旧类上学会的一般能力。

训练时它见到的例子:
条件「鸟」 + 这张图 → 图里所有的鸟都该判「配」,其余判「不配」
条件「碗」 + 那张图 → 图里所有的碗都该判「配」,其余判「不配」
…… 866 个旧类各来一遍

它学到的不是「鸟长什么样」,而是:
**「拿一串描述某个概念的数,去图里找和它对得上的区域」这件事怎么做**

图说:这就是这一改能推广到新类的全部理由——
**学的是一种对齐动作,不是一份类别清单。**

6. 条件从哪儿来:一个类名,或者一张示例图

这一节是主走查第 ⑤、⑥ 步,也是这一章最实用的一个设计。

两种条件,都来自 CLIP

对训练集里每一个标注好的物体,书里同时准备两串数11:

条件怎么得到长什么样
图像条件把这个框里的东西从图上裁下来,过 CLIP 的图像编码器一串数
文本条件把它的类名过 CLIP 的文本编码器一串数

两串数能互换的理由,正是第 01 章那件事: CLIP 把图和字钉进了同一个空间, 所以描述同一个概念的两串数本来就挨得很近——喂哪一种,解码器都认。

训练时按一个概率随机挑一种,书里的理由是让两种条件都得到充分训练11

为什么这件事很要紧

因为它让「新类连名字都不用有」成为可能。

书里的做法是:对新类的那些候选物体,只用图像条件—— 因为它们的类名根本拿不到,生成不了文本条件11

用起来是这样的: 你手上有一张想找的东西的照片(一件行李、一个商标、一个动漫角色), 你说不出它的学名,但你可以把这张照片当条件喂进去。 书里在动漫角色上试过,那是训练时完全没有的领域,它照样能框出来12

文本条件那一侧还有一个细节

不是简单地把类名塞进「a photo of a ___」就完事: 书里对每个类生成 63 种不同的说法,把它们各自得到的那串数平均起来13这是第 08 章讲过的那个「多模板投票」的做法,在这里被当成标准配置沿用。

7. 怎么把条件塞进去,以及一张图里有好几个物体怎么办

这一节是主走查第 ⑦、⑧ 步。

塞法:投影一下,加上去

条件那串数(来自 CLIP)

├─ 过一层全连接,投到和物体查询同一个空间

带条件的查询 = 原来的物体查询 ⊕ 投影后的条件

图说:⊕ 就是逐位相加,没有别的花样。
**加之前查询是「不分类别的找东西名额」,加之后它变成了「找这一类东西的名额」。**

一个麻烦:一张图里常常有好几个同类物体

如果只把一个条件加到一个查询上,那一张图里的两只猫就只能找到一只14

书里的解法很直接:

查询复制 R 份,条件复制 N 份 → 一次前向产生 N×R 个带条件的查询

为了让这些副本互不干扰,加一个**注意力掩码**
(第 02 章讲过注意力是「每块去看别的块」;
掩码就是一张「谁不许看谁」的表,把不该互相看的块挡住)

图说:所以一次前向就能把「这张图里所有和这个条件配得上的物体」全找出来,
不必对同一张图跑很多遍。

还有一项额外要求:把条件重建回来

除了「配不配」和「框准不准」,书里还加了第三项要求15:

模型要能从自己的输出里,把当初给它的那串条件数还原出来**。**

为什么加这一项: 书里的说法是,这会逼模型给不同的概念学出彼此区分得开的表示, 从而给条件匹配提供更有分辨力的指导。

四项损失的配重书里也给了: 配不配 3.0、框的位置 5.0、框的重叠 2.0、重建 1.015注意重建那一项配重最轻——它是辅助,不是主线。

8. 结果:新类涨了,而且旧类没掉

这一节是主走查第 ⑩、⑪ 步。

推理时怎么用

把全部类名(866 个旧类 + 337 个新类)的那串数一次全喂进去, 最后按分数取前 300 个预测16

有一个效率上的关键设计: 图片过主干和编码器那一步只算一次, 所有条件共用它——真正要重复的只是解码器那一段。这一句是下一节那笔账的伏笔。

主表

方法新类分全部类的分(另一个数据集)新类(另一个数据集)旧类
只做对齐的老方法10.124.95.961.8
加了蒸馏的老方法16.122.527.659.5
两个模型合起来用16.625.5
本章的方法17.426.629.461.0

三条读法17:

  1. 新类涨了 1.3(17.4 对 16.1),全部类的分涨了 4.1;
  2. 最要紧的一条在最后一列:老方法把新类从 5.9 抬到 27.6, 代价是旧类从 61.8 掉到 59.5;而本章的方法旧类是 61.0——基本没掉书里明说了这一点:它不影响旧类的表现;
  3. 注意第一行:只做对齐、不做蒸馏的老方法,新类只有 5.9—— 这是「什么都不额外做」的地板,给上面那些数提供了参照。

第 2 条是这一章真正的成绩,比 +1.3 值钱得多。 在这条线上,「提升新类」几乎总是拿旧类换的—— 因为大部分做法是在同一个分类头上重新分配概率,新类多拿一点,旧类就少拿一点。 而条件匹配没有分类头可分,它对每个条件单独判一次「配不配」,天生不存在这种拉扯。 (这条因果书里没有明写,是我们从做法本身推的。)

换个数据集,只换一套类名就能测

在一个数据集上训完,搬到另外两个数据集上时,只需要把条件换成新数据集的类名嵌入, 不用重训。五项指标全面胜过对照方法,幅度在 1.3 到 3.9 之间18

9. 代价:慢,而且慢得很难看

书里把这一节单独列出来,标题就叫推理时间分析。这是这一章最诚实的地方。

慢在哪儿

病根就是那个条件设计:每一个条件都要过一遍解码器。 类别越多,要跑的遍数越多19

数据集有多少类对照的原始检测器本章的方法并行化之后
80 类那个800.31 秒0.72 秒(慢 2 倍)0.63 秒
1203 类那个12031.49 秒23.84 秒(慢 16 倍)9.57 秒

并行化的收益是不均匀的: 80 类那个只降了 12.5%,1203 类那个降了近 60%—— 但降完之后仍然慢 6 倍以上(9.57 对 1.49)19

作者的辩解,以及它成立到什么程度

书里给了两条19:

  1. 「这不是我们独有的问题」——这类「按实例给条件」的模型普遍有这个取舍;
  2. 「实际人机交互场景里,用户心里只有少数几个目标物」—— 比如找一件丢失的行李、一个特定的商标,条件数很少,时间可以忽略

判断(我们的,不是书里的): 第 2 条辩解成立,但它悄悄换掉了任务。 「用户说一个词,你去找」和「把整张图里所有东西都标出来」是两种产品, 而这一章的主表(866+337 个类全喂进去)量的恰恰是后者。 换句话说:它的成绩是在慢的那种用法下拿到的,它的辩解是关于快的那种用法的。 如果错,会错在: 如果开放词表检测的真实需求本来就以「按需查询」为主, 那这条辩解就不是换题,而是指出了基准设计得不合理。 书里没有给出任何一个真实场景的用量分布,我们无从判断。

10. 失败案例:作者自己写出来的三条

书里专门有一小节叫失败案例,配了图。这在论文改写的章节里不多见。

失败具体是什么有没有缓解办法
小目标和被遮挡的目标图像条件去找「自行车」,小的、被挡住的那些检不到:换成文本条件能缓解一部分20
不相干的词给它一个跟画面毫无关系的词(书里的例子是「philosophy」),它会硬吐出框来书里没给办法20
见上一节部分:并行化

第二条值得多想一层。 模型的输出是「配 / 不配」两个数, 而它从没被训练过「这个条件在这张图里根本不存在」这种情况—— 训练时每一个条件都对应着图里真实存在的物体。 所以它没有学过说「都不配」。(这层解释是我们补的,书里只写了现象。)

这条和第 04 章那堵「模态鸿沟」的墙是同一件事的两个面, 也和第 19 章那个「给它『树和极光』它只理会『树』」的例子同源。

11. 作者的判断与证据

书里给了证据的:

说法证据
候选框网络对新类几乎不给框图例中两只猫的区域响应极低;另有对照图显示本章方法在新类上的响应明显更高
配对需要标签,所以新类走不通公式层面的推导 + 图 10.4 的对照
换成二元匹配之后能推广到新条件两个数据集上的完整结果
新类提升不以旧类为代价61.0 对 59.5;而对照方法的起点是 61.8
图像条件能处理没有名字的概念动漫角色、与目标图长得很不一样的示例图
换数据集只换类名即可五项指标全面领先
完整的时间表,含并行化前后
三条失败配图的失败案例

属于作者的推断:

  • 「候选框网络的二元性质使它过拟合到见过的类」—— 书里说这是「近期研究指出的」,本章没有独立验证;
  • 「重建条件嵌入会让不同概念的表示更可分」—— 这是动机的陈述,书里没有做「去掉这一项会怎样」的对照实验;
  • 「实际场景里条件数很少,所以慢不要紧」——纯粹的场景推测,没有数据支持。

12. 边界与局限

① 它仍然需要新类的候选物体来训练。 书里说,对新类会另外生成一批候选物体来丰富训练数据,并且只用图像条件11也就是说「完全没有接触过新类的任何视觉信息」这句话是不成立的—— 它没有新类的类别标签,但见过新类的图像区域。 这个区别很容易被读漏。

② 主干不是最新的,分数不能跨章比。 这一章用的是一个卷积网络主干加上一个改进版的 DETR,CLIP 用的是 ViT-B/32 版21和第 08–11 章那些分类分数不可比,和第 13 章的分割分数也不可比。

③ 没有消融实验(第 05 章第 11 节立过这个词:把方法里的某个部件拆掉、别的都不动, 看分数掉多少,用来证明这个部件真的在起作用)。全章没有这样一张表—— 两种条件各占多少、复制几份、重建那一项值不值,书里都没有量过。

④ 慢这件事没有解决,只是被解释了。 见第 9 节。

⑤ 它回答的是「东西在哪儿」,不是「这块像素属于谁」。 框是矩形的,而世界不是。要每个像素都有答案,那是下一章的事。

13. 可带走的

  1. 检测比分类多要一样东西:位置——输出是一串「框 + 类别」,不是一个答案;
  2. 老毛病是类别定死:在 80 类上训出来的,第 81 类对它不存在;
  3. 接上 CLIP 不够,因为会卡在第一步——先框东西的那个网络是在旧类上训的,对新类不给框;
  4. 这个卡点有通用形状:流水线里任何一段「在旧数据上训、且不可绕过」,那一段就是天花板;
  5. 换成「一口气吐 N 个框」的检测器也会卡:一对一配对要算分类代价,新类没标签就算不出;
  6. 破法只有一句:把「这是第几类」换成「和这个条件配不配得上」, 代价就从「和类别数有关」变成一个二元判断;
  7. 这一改能推广的理由是:它学的是一种对齐动作,不是一份类别清单;
  8. 条件有两种:类名过文本编码器,或者把物体裁出来过图像编码器—— 后者让「说不出名字的东西」也能被检索;
  9. 一图多物靠复制:查询复制 R 份、条件复制 N 份,一次前向出 N×R 个,用掩码隔开;
  10. 成绩的真正亮点不是 +1.3,是旧类没掉(61.0 对老方法的 59.5)—— 因为它没有一个「各类抢概率」的分类头;
  11. 换数据集只需要换一套类名嵌入,不用重训;
  12. 代价照实写了:1203 类时一次 1.49 秒变 23.84 秒,并行化后 9.57,仍慢 6 倍以上;
  13. 它没学过说「都不配」——给一个不相干的词,它会硬吐出框来。

14. 原文地图

主题原书章原文位置
检测是什么、只认定死的 80 类10. Open-Vocabulary Object Detection Based on DETRtext/40-ch10-10-open-vocabulary-object-detection-based-on-det.txt:47(搜「identify and locate objects」)
加新类要重收数据重训,不实际同上text/40-ch10-10-open-vocabulary-object-detection-based-on-det.txt:49(搜「impractical and inefficient」)
现有做法靠「视觉特征对齐文本嵌入」同上text/40-ch10-10-open-vocabulary-object-detection-based-on-det.txt:51(搜「align the visual features」)
候选框网络对新类几乎不给框同上text/40-ch10-10-open-vocabulary-object-detection-based-on-det.txt:55(搜「fail to accurately cover all instances」) · text/40-ch10-10-open-vocabulary-object-detection-based-on-det.txt:53(搜「receives little response」)
DETR 的两步:一口气吐 N 个 + 一对一配对同上text/40-ch10-10-open-vocabulary-object-detection-based-on-det.txt:89(搜「learnable object queries」) · text/40-ch10-10-open-vocabulary-object-detection-based-on-det.txt:109(搜「Hungarian algorithm」)
卡点:新类没标签,分类代价算不出同上text/40-ch10-10-open-vocabulary-object-detection-based-on-det.txt:113(搜「Since novel classes lack training labels」)
改成二元条件匹配同上text/40-ch10-10-open-vocabulary-object-detection-based-on-det.txt:83(搜「conditional binary matching」) · text/40-ch10-10-open-vocabulary-object-detection-based-on-det.txt:145(搜「matched’ vs. ‘not matched」)
两种条件、随机挑一种、新类只用图像条件同上text/40-ch10-10-open-vocabulary-object-detection-based-on-det.txt:127(搜「randomly select」)
投影后加到查询上;复制成 N×R 并加掩码同上text/40-ch10-10-open-vocabulary-object-detection-based-on-det.txt:135(搜「simple addition operation」) · text/40-ch10-10-open-vocabulary-object-detection-based-on-det.txt:137(搜「replicate the object queries」)
重建条件嵌入这一项及四项配重同上text/40-ch10-10-open-vocabulary-object-detection-based-on-det.txt:153(搜「learn distinct representations」) · text/40-ch10-10-open-vocabulary-object-detection-based-on-det.txt:185(搜「weighting parameters」)
推理:全部类名一次喂进去、取前 k、特征只算一次同上text/40-ch10-10-open-vocabulary-object-detection-based-on-det.txt:163(搜「computed only once and shared」)
主表与「不牺牲旧类」同上text/40-ch10-10-open-vocabulary-object-detection-based-on-det.txt:189(搜「at the cost of hurting」) · text/40-ch10-10-open-vocabulary-object-detection-based-on-det.txt:61(搜「17.4」) · text/40-ch10-10-open-vocabulary-object-detection-based-on-det.txt:373(搜「will not affect the performance of base」)
换数据集只换类名同上text/40-ch10-10-open-vocabulary-object-detection-based-on-det.txt:377(搜「switched the conditional te」)
动漫角色、与目标图差别很大的示例图同上text/40-ch10-10-open-vocabulary-object-detection-based-on-det.txt:467(搜「anime characters」) · text/40-ch10-10-open-vocabulary-object-detection-based-on-det.txt:455(搜「visually distinct」)
三条失败案例同上text/40-ch10-10-open-vocabulary-object-detection-based-on-det.txt:475(搜「philosophy」)
推理时间表与两条辩解同上text/40-ch10-10-open-vocabulary-object-detection-based-on-det.txt:483(搜「16× slower on LVIS」) · text/40-ch10-10-open-vocabulary-object-detection-based-on-det.txt:525(搜「the number of conditional inputs remains relatively small」)
数据集划分与评分标准同上text/40-ch10-10-open-vocabulary-object-detection-based-on-det.txt:169(搜「337 rare classes as novel」) · text/40-ch10-10-open-vocabulary-object-detection-based-on-det.txt:173(搜「box mAP at IoU threshold 0.5」)

Footnotes

  1. 出处(两处互相矛盾,都在同一篇里):方法与实验设定一节写「我们把 337 个罕见类定为新类,只在 frequent 与 common 两档上训」,第 169 段(text/40-ch10-10-open-vocabulary-object-detection-based-on-det.txt:169,搜「337 rare classes as novel」);同一段还写明这个数据集一共 1203 类,所以旧类是 866。而结果表的表注写的是「886 个旧类、317 个新类」,第 189 段(text/40-ch10-10-open-vocabulary-object-detection-based-on-det.txt:189,搜「886 base classes and 317 novel classes」)。补充(不在书里,来自通用知识):LVIS v1 的罕见类正是 337 类,所以笔误在表注那一侧。

  2. 出处:「10. Open-Vocabulary Object Detection Based on DETR」第 53 段(text/40-ch10-10-open-vocabulary-object-detection-based-on-det.txt:53,搜「receives little response」)。图 10.1 的说明写着:在闭集类上训练的候选框网络容易忽略新类,「猫」那块区域几乎没有响应,所以图中的猫基本上没有或只有很少的候选框。主走查里那张「两只猫加一个玩具」的照片是我们为了把全章串成一条链而设的场景,书里的图例同样是猫,但玩具是我们加的。

  3. 出处:同上第 47 段(text/40-ch10-10-open-vocabulary-object-detection-based-on-det.txt:47,搜「identify and locate objects」)。原文:目标检测旨在识别并定位图像、视频或点云中的物体;传统算法在类别数上可扩展性有限,常被限制在数据集预定义的那一组类里——在一个 80 类数据集上训出来的检测器只能可靠识别那 80 类,无法检测训练时没遇到过的类别。 2

  4. 出处:同上第 49 段(text/40-ch10-10-open-vocabulary-object-detection-based-on-det.txt:49,搜「impractical and inefficient」)。原文:常见做法是把新类的图像加进训练集再重训,但由于数据收集与重训的高昂成本,这往往不实际、也低效

  5. 出处:同上第 51 段(text/40-ch10-10-open-vocabulary-object-detection-based-on-det.txt:51,搜「align the visual features」)。原文:现有开放词表检测方法的核心原则,是把检测器抽取的视觉特征与在海量图文数据上训练的模型(如 CLIP)产生的文本嵌入对齐,从而只凭文本描述就能识别新类,不需要对应的训练图像

  6. 出处:同上第 55 段(text/40-ch10-10-open-vocabulary-object-detection-based-on-det.txt:55,搜「fail to accurately cover all instances」)。原文:现有开放词表检测器的一个显著限制是依赖候选区域,而由于缺少新类的训练数据,这些候选常常覆盖不到图中新类的全部实例;近期研究指出,候选框网络的二元性质会让模型过拟合到见过的类,妨碍它推广到新类。 注意「二元性质导致过拟合」这一条书里标着引用,是引述别人的结论。

  7. 出处:同上第 89 段(text/40-ch10-10-open-vocabulary-object-detection-based-on-det.txt:89,搜「learnable object queries」)。原文:给一张输入图,DETR 预测一组固定数量 N 的物体预测,N 由可学的物体查询决定,这些查询充当可学的位置编码;整个过程分两步——集合预测与最优二分匹配。第 81 段(text/40-ch10-10-open-vocabulary-object-detection-based-on-det.txt:81,搜「anchor generation and non-maximum suppression」)补充了它的好处:免掉了锚框生成与非极大值抑制这些手工设计的部件

  8. 出处:同上第 109 段(text/40-ch10-10-open-vocabulary-object-detection-based-on-det.txt:109,搜「Hungarian algorithm」)。原文:最优二分匹配要在 N 个预测与 M 个真值(可含「无物体」)之间找一种使总匹配代价最小的一一对应;代价由分类损失与框定位损失两部分组成;这个指派可以用匈牙利算法高效求出。

  9. 出处:同上第 113 段(text/40-ch10-10-open-vocabulary-object-detection-based-on-det.txt:113,搜「Since novel classes lack training labels」)。原文:二分匹配无法直接用于开放词表场景,因为算匹配代价需要标签信息;新类缺乏训练标签,所以物体查询的预测无法推广到它们,二分匹配只能施加在有标签的旧类上。摘要里(第 39 段,text/40-ch10-10-open-vocabulary-object-detection-based-on-det.txt:39,搜「inability to compute the classification cost matrix」)把这件事称作「主要挑战」。

  10. 出处:同上第 83 段(text/40-ch10-10-open-vocabulary-object-detection-based-on-det.txt:83,搜「conditional binary matching」)与第 145 段(text/40-ch10-10-open-vocabulary-object-detection-based-on-det.txt:145,搜「matched’ vs. ‘not matched」)。原文:把固定的集合匹配目标重新表述成条件二元匹配框架;实现上,概率向量是二维的(匹配 / 不匹配),损失用二元交叉熵;当查询是「鸟」时,匹配损失应当让模型找出图中所有的鸟,并把其他类的实例正确判为「不匹配」。第 59 段(text/40-ch10-10-open-vocabulary-object-detection-based-on-det.txt:59,搜「generalize effectively to unseen queries」)给了推广性的说法。

  11. 出处:同上第 127 段(text/40-ch10-10-open-vocabulary-object-detection-based-on-det.txt:127,搜「randomly select」)。原文:对每个真值标注,用 CLIP 分别生成图像嵌入(把框内区域送进图像编码器)与文本嵌入(把类名送进文本编码器);由于 CLIP 里两者对齐良好,任一种都能当条件;训练时按概率随机选文本或图像以保证两种模态都训得到;并且沿用已有做法为新类额外生成候选物体来丰富训练数据,对这些新类候选只用图像嵌入当条件——因为它们的类名拿不到 2 3 4

  12. 出处:同上第 467 段(text/40-ch10-10-open-vocabulary-object-detection-based-on-det.txt:467,搜「anime characters」)与第 455 段(text/40-ch10-10-open-vocabulary-object-detection-based-on-det.txt:455,搜「visually distinct」)。原文:在网上找的动漫角色图像上,尽管这个领域训练时完全没有,模型仍能检出与给定图像条件对应的区域;另外即便示例图与目标图在外观上差别很大(书里举的两个例子是「crape」与「fork」),也仍能检出。

  13. 出处:同上第 181 段(text/40-ch10-10-open-vocabulary-object-detection-based-on-det.txt:181,搜「63 different textual prompts」)。原文:沿用对照方法的提示构造策略,每个类生成 63 种不同的文本说法(例如「there is a class name in the photo」),送进 CLIP 文本编码器后取平均。原文这里有一处自相矛盾:先说 63 种,紧接着说「把得到的 85 个文本嵌入平均」。我们照实记下,不替它选一个。

  14. 出处:同上第 137 段(text/40-ch10-10-open-vocabulary-object-detection-based-on-det.txt:137,搜「replicate the object queries」)。原文:把条件嵌入只加到单个物体查询上,会严重限制模型检测同一张图里多个同类或异类实例的能力,因为检测数据集里一张图通常含多个实例;所以先把物体查询复制 R 份、条件复制 N 份,一次前向共产生 N×R 个查询,并用注意力掩码保持各副本相互独立。

  15. 出处:同上第 153 段(text/40-ch10-10-open-vocabulary-object-detection-based-on-det.txt:153,搜「learn distinct representations」)与第 185 段(text/40-ch10-10-open-vocabulary-object-detection-based-on-det.txt:185,搜「weighting parameters」)。原文:嵌入重建的直觉是,通过重建各种条件输入嵌入,鼓励模型在特征空间里为不同概念学出彼此不同的表示,从而为条件训练提供更有区分度的指导;实现细节里四项权重分别是二元交叉熵 3.0、L1 5.0、GIoU 2.0、嵌入重建 1.0。 2

  16. 出处:同上第 163 段(text/40-ch10-10-open-vocabulary-object-detection-based-on-det.txt:163,搜「computed only once and shared」)。原文:推理时把所有旧类与新类的文本嵌入都喂进模型,再按分数取前 k 个预测(一个数据集取 100、另一个取 300);图像过主干与编码器得到的上下文表示只算一次,在所有条件之间共享,不同类的条件查询由解码器并行处理。

  17. 出处:同上第 189 段(text/40-ch10-10-open-vocabulary-object-detection-based-on-det.txt:189,搜「at the cost of hurting」)与表 10.1 各行(text/40-ch10-10-open-vocabulary-object-detection-based-on-det.txt:61,搜「17.4」;text/40-ch10-10-open-vocabulary-object-detection-based-on-det.txt:301,搜「61.8」;text/40-ch10-10-open-vocabulary-object-detection-based-on-det.txt:319,搜「59.5」),以及第 373 段(text/40-ch10-10-open-vocabulary-object-detection-based-on-det.txt:373,搜「will not affect the performance of base」)。原文明说:对照方法用蒸馏提高了新类,代价是伤害了旧类;而本章方法在提升的同时不影响旧类表现。表里数值:老方法(只对齐)新类 10.1 / 全类 24.9 / 另一数据集新类 5.9 / 旧类 61.8;加蒸馏 16.1 / 22.5 / 27.6 / 59.5;两模型集成 16.6 / 25.5;本章方法 17.4 / 26.6 / 29.4 / 61.0。

  18. 出处:同上第 377 段(text/40-ch10-10-open-vocabulary-object-detection-based-on-det.txt:377,搜「switched the conditional te」)与表 10.2(text/40-ch10-10-open-vocabulary-object-detection-based-on-det.txt:429,搜「76.1」)。原文:沿用对照方法的协议,在一个数据集上训练后到另外两个数据集上评测,迁移时只需换掉条件文本嵌入;五项指标分别领先 3.9 / 2.6 / 1.5 / 2.8 / 1.3。

  19. 出处:同上第 483 段(text/40-ch10-10-open-vocabulary-object-detection-based-on-det.txt:483,搜「16× slower on LVIS」)与第 525 段(text/40-ch10-10-open-vocabulary-object-detection-based-on-det.txt:525,搜「the number of conditional inputs remains relatively small」)。原文:未经优化时,每类一次前向的版本在 80 类数据集上约慢 2 倍、在 1203 类数据集上慢 16 倍;并行送多个条件查询后,分别减少约 12.5% 与近 60%;表 10.3 的四行数是 0.31/1.49、0.72/23.84、0.63/9.57。两条辩解:这种「按实例给条件」的模型普遍存在性能与速度的取舍;以及实际人机交互场景里用户心里只有少数目标物,条件数少而固定,时间可忽略。 2 3

  20. 出处:同上第 475 段(text/40-ch10-10-open-vocabulary-object-detection-based-on-det.txt:475,搜「philosophy」)。图 10.9 的说明:用图像条件(「bicycle」)检不到那些又小又被遮挡的物体,但换成文本条件能在一定程度上解决;而给出不相干的文本条件(例如「philosophy」)时,模型会预测出错误的假阳性框。第 473 与 477 段把这两条列为失败类型。 2

  21. 出处:同上第 185 段(text/40-ch10-10-open-vocabulary-object-detection-based-on-det.txt:185,搜「ResNet50-C4」)。原文:模型建立在一个改进版 DETR 之上,在 8 块 V100 上训练,默认主干是 ResNet50-C4,CLIP 用的是开源的 ViT-B/32 版本。