Skip to content

开放词表文本提示

输入一个短语,图像中每一处匹配都会被框出。采用 Apache-2.0 许可的 Grounding DINO,在浏览器中运行且无需 GPU;量化方案则是实测选出来的。

输入 traffic cone,图像中每一个交通锥都会被框出,作为可接受或拒绝的建议。 模型运行在标注者的浏览器中,因此无需配置 GPU,安装完成后也不再有网络往返。

安装

bash
potato download-models grounding_dino_tiny   # 每次安装一次即可
potato download-models onnxruntime           # 与分割功能共用
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                   # 设为 true 则把已接受的框转为掩码

运行 examples/image/text-prompt-labeling/ 即可看到实际效果。

真正值得注意的是许可

人们普遍以为文本提示标注必须依赖 SAM 3 及其非商业条款。并非如此。这里使用的模型是 Grounding DINO,一个以 Apache-2.0 发布的开放词表检测器,这正是它能面向所有人发布、而不是只面向付费层级的原因。

Grounding DINO 接收一张图像和一段文字描述,并针对该描述中的每一个词,对 900 个候选框打分。Potato 会用你给出的短语拼装这段描述,通过 ONNX Runtime Web 运行模型,再把输出转成建议。接受一条建议后,系统会经由与其他所有工具相同的坐标契约,存入一个归一化的边界框,因此在下游看来,一条建议和一个手绘框是同一种对象。

设置 segment: true 会把每个被接受的框交给 SAM 解码器,将其转为掩码。

量化方案由实测选出

随包发布的模型是量化过的。采用哪种量化并不是"恰好选中的默认值",而是与全精度导出结果对照实测得出的:

导出方式相对全精度的框 IoU体积
全精度686 MB
q4f160.972151 MB
int80.874201 MB

q4f16 保留了明显更多的原始几何信息,并且比 int8 还小 50 MB。如果直接取默认值,就会用更大的文件装上一个更差的模型。

已在 COCO 的双猫照片上实测:两只猫均被检出,置信度分别为 0.724 与 0.688,边界框与 Python 参考实现吻合到小数点后四位。

BERT 分词是直接实现的

Grounding DINO 需要其文字描述按 BERT 的方式分词。Potato 直接实现了 WordPiece,而不是为了一个函数引入约 2 MB 的 transformers.js,并且该实现与 HuggingFace 的 tokenizers 做了逐 token 比对。

重点不在于省下的字节。一个与模型训练时所用分词器不一致的分词器,会产出细微错误的检测结果,看上去像是阈值没调好,所以值得对照参考实现来测试,而不是想当然。

这一功能的定位

建议终究只是建议。被接受的框是标注,未被接受的不是,两者在整条链路上都保持区分。如果你在意标注者究竟是在复核建议还是在盖章通过,答案在时间数据里。参见绘制遥测

相关内容