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 比對。

重點不在於省下的位元組。一個與模型訓練時所用分詞器不一致的分詞器,會產出細微錯誤的檢測結果,看上去像是閾值沒調好,所以值得對照參考實現來測試,而不是想當然。

這一功能的定位

建議終究只是建議。被接受的框是標註,未被接受的不是,兩者在整條鏈路上都保持區分。如果你在意標註者究竟是在複核建議還是在蓋章通過,答案在時間資料裡。參見繪製遙測

相關內容