開放詞表文本提示
輸入一個短語,影像中每一處匹配都會被框出。採用 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 比對。
重點不在於省下的位元組。一個與模型訓練時所用分詞器不一致的分詞器,會產出細微錯誤的檢測結果,看上去像是閾值沒調好,所以值得對照參考實現來測試,而不是想當然。
這一功能的定位
建議終究只是建議。被接受的框是標註,未被接受的不是,兩者在整條鏈路上都保持區分。如果你在意標註者究竟是在複核建議還是在蓋章通過,答案在時間資料裡。參見繪製遙測。
相關內容
- 互動式分割——用點選代替輸入
- 模型庫——許可與下載內容
- 指南:開放詞表目標檢測
- 源文件