Skip to content

開放語彙のテキストプロンプト

語句を入力すると、画像内の該当箇所がすべてボックスで返ってきます。Apache-2.0 の Grounding DINO を GPU なしでブラウザ内で動かす方法と、量子化を計測で選んだ理由。

traffic cone と入力すれば、画像内のすべてのトラフィックコーンが、受け入れるか却下するかを選べる提案としてボックスで返ってきます。 モデルはアノテーターのブラウザ内で動くので、用意すべき GPU も、導入後のネットワーク往復もありません。

セットアップ

bash
potato download-models grounding_dino_tiny   # once per install
potato download-models onnxruntime           # shared with segmentation
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]   # what the box starts with
      box_threshold: 0.3               # how sure before a box is offered
      text_threshold: 0.25             # how a box gets its label
      segment: false                   # true turns accepted boxes into masks

動いているところを見るには examples/image/text-prompt-labeling/ を実行してください。

面白いのはライセンスの部分

テキストプロンプトによるラベル付けには SAM 3 とその非商用条項が必要だと広く思われています。そうではありません。ここで使うモデルは Grounding DINOApache-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 は関数一つのために約 2 MB の transformers.js を持ち込むのではなく WordPiece を直接実装しており、その実装は HuggingFace の tokenizers とトークン単位で突き合わせて検証されています。

要点は節約したバイト数ではありません。モデルの訓練時のトークナイザーと食い違うトークナイザーは、閾値の問題のように見える微妙に誤った検出を生むので、信用するのではなく参照実装に対して検証する価値があるということです。

この機能の位置づけ

提案は提案です。受け入れられたボックスはアノテーションであり、受け入れられなかったボックスはそうではありません。両者は最後まで分けたままにされます。アノテーターが提案をレビューしているのか追認しているのかを気にするなら、それを教えてくれるのは所要時間です。描画テレメトリを参照してください。

関連