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 是慣常選擇就採用它,等於用更大的檔案裝上一個更差的模型。

它在什麼情況下會失效

  • 細粒度類別。 "金毛尋回犬"與"拉布拉多"超出了它的能力;它只會把狗框出來。
  • 領域專有詞彙。 醫學、工業與科研術語通常不在訓練圖注中。
  • 計數。 它能找到實例,但在擁擠場景中並不能可靠地找出全部實例。
  • 否定與關係。 "不在桌子上的那個杯子"不是它能回答的查詢。

在這些情形下,這些建議仍然是有用的起點,但請做好動手畫的準備。

建議不是標註

請在整條鏈路上把兩者分開。標註者接受的框是基準答案;未被接受的框是關於模型的證據,把兩者混在一起,就毀掉了後者唯一的用途。

如果你想知道"接受"這個動作是不是真的複核,那是一個時間問題,不是一個準確率問題。

延伸閱讀