开放词表文本提示
输入一个短语,图像中每一处匹配都会被框出。采用 Apache-2.0 许可的 Grounding DINO,在浏览器中运行且无需 GPU;量化方案则是实测选出来的。
输入 traffic cone,图像中每一个交通锥都会被框出,作为可接受或拒绝的建议。 模型运行在标注者的浏览器中,因此无需配置 GPU,安装完成后也不再有网络往返。
安装
potato download-models grounding_dino_tiny # 每次安装一次即可
potato download-models onnxruntime # 与分割功能共用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 |
q4f16 | 0.972 | 151 MB |
int8 | 0.874 | 201 MB |
q4f16 保留了明显更多的原始几何信息,并且比 int8 还小 50 MB。如果直接取默认值,就会用更大的文件装上一个更差的模型。
已在 COCO 的双猫照片上实测:两只猫均被检出,置信度分别为 0.724 与 0.688,边界框与 Python 参考实现吻合到小数点后四位。
BERT 分词是直接实现的
Grounding DINO 需要其文字描述按 BERT 的方式分词。Potato 直接实现了 WordPiece,而不是为了一个函数引入约 2 MB 的 transformers.js,并且该实现与 HuggingFace 的 tokenizers 做了逐 token 比对。
重点不在于省下的字节。一个与模型训练时所用分词器不一致的分词器,会产出细微错误的检测结果,看上去像是阈值没调好,所以值得对照参考实现来测试,而不是想当然。
这一功能的定位
建议终究只是建议。被接受的框是标注,未被接受的不是,两者在整条链路上都保持区分。如果你在意标注者究竟是在复核建议还是在盖章通过,答案在时间数据里。参见绘制遥测。
相关内容
- 交互式分割——用点击代替输入
- 模型库——许可与下载内容
- 指南:开放词表目标检测
- 源文档