如何通过输入名称来标注对象
开放词表检测让标注者输入一个短语,就能把所有匹配项框出来。Grounding DINO 如何工作、其许可允许什么,以及这套方法在什么情况下会失效。
开放词表检测意味着标注者输入一个短语,图像中所有匹配项都会被框出来,而该类别无需出现在任何训练集中。 对于现成检测器覆盖不到的类别,这是快速起步构建检测数据集的最快途径。
工作原理
Grounding DINO 接收一张图像和一段文字描述,并针对该描述中的每一个词,对 900 个候选框打分。给它 "cat . bus . stop sign",它就会返回带有逐短语置信度的框。
这与固定类别的检测器机制不同,也因此改变了你该如何写提示:
- 短语优于标签。 "traffic cone" 是模型在图注中见过的短语;
cone_orange_road不是。 - 上下文有帮助。 在繁忙街道上,"person riding a bicycle" 的定位可能比 "person" 更准。
- 越简略越差。 模型是在自然语言上训练的,所以就用自然语言来写。
许可很重要
人们普遍以为文本提示标注必须依赖 SAM 3 及其非商业条款。并非如此:Grounding DINO 是 Apache-2.0。
这件事值得在构建数据集之前查清楚,而不是之后。如果你用于标注的模型许可是非商业的,而你的数据集不是,那你就遇到了一个越晚发现代价越高的问题。Potato 的模型库会列出每个模型的许可,并在缺少 --accept-licence 时拒绝下载非商业用途的模型。
配置
annotation_schemes:
- annotation_type: image_annotation
name: objects
description: "Find and label the objects."
source_field: image
tools: [bbox, polygon, sam]
labels: [cat, bus, stop sign]
text_prompt:
phrases: [cat, bus, stop sign]
box_threshold: 0.3
text_threshold: 0.25
segment: false这两个阈值职责不同,应当分别调节:
box_threshold决定是否给出某个框。如果标注者被误报淹没,就调高它。text_threshold决定由哪个短语来给已给出的框贴标签。如果框出现在了错误的标签下,就调高它。
设置 segment: true 会把每个被接受的框交给 SAM 解码器,将其转为掩码。
量化是一个真实的选择
如果你要自行部署这类模型,不要直接采用默认导出。对照 686 MB 的全精度 Grounding DINO 导出实测:
| 导出方式 | 相对全精度的框 IoU | 体积 |
|---|---|---|
q4f16 | 0.972 | 151 MB |
int8 | 0.874 | 201 MB |
q4f16 保留了明显更多的几何信息,并且体积更小。仅仅因为 int8 是惯常选择就采用它,等于用更大的文件装上一个更差的模型。
它在什么情况下会失效
- 细粒度类别。 "金毛寻回犬"与"拉布拉多"超出了它的能力;它只会把狗框出来。
- 领域专有词汇。 医学、工业与科研术语通常不在训练图注中。
- 计数。 它能找到实例,但在拥挤场景中并不能可靠地找出全部实例。
- 否定与关系。 "不在桌子上的那个杯子"不是它能回答的查询。
在这些情形下,这些建议仍然是有用的起点,但请做好动手画的准备。
建议不是标注
请在整条链路上把两者分开。标注者接受的框是基准答案;未被接受的框是关于模型的证据,把两者混在一起,就毁掉了后者唯一的用途。
如果你想知道"接受"这个动作是不是真的复核,那是一个时间问题,不是一个准确率问题。