Skip to content

如何通过输入名称来标注对象

开放词表检测让标注者输入一个短语,就能把所有匹配项框出来。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 时拒绝下载非商业用途的模型。

配置

yaml
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体积
q4f160.972151 MB
int80.874201 MB

q4f16 保留了明显更多的几何信息,并且体积更小。仅仅因为 int8 是惯常选择就采用它,等于用更大的文件装上一个更差的模型。

它在什么情况下会失效

  • 细粒度类别。 "金毛寻回犬"与"拉布拉多"超出了它的能力;它只会把狗框出来。
  • 领域专有词汇。 医学、工业与科研术语通常不在训练图注中。
  • 计数。 它能找到实例,但在拥挤场景中并不能可靠地找出全部实例。
  • 否定与关系。 "不在桌子上的那个杯子"不是它能回答的查询。

在这些情形下,这些建议仍然是有用的起点,但请做好动手画的准备。

建议不是标注

请在整条链路上把两者分开。标注者接受的框是基准答案;未被接受的框是关于模型的证据,把两者混在一起,就毁掉了后者唯一的用途。

如果你想知道"接受"这个动作是不是真的复核,那是一个时间问题,不是一个准确率问题。

延伸阅读