対話的セグメンテーション
物体をクリックするとマスクが返ってきます。ブラウザ内で、GPU なしで、クリックごとのネットワーク通信もなしに。Potato が ONNX Runtime Web で MobileSAM を動かす仕組みと、その設定方法。
物体をクリックすると、およそ 130 ミリ秒でマスクが返ってきます。アノテーターのブラウザ内で、GPU もネットワーク往復もなしにです。 導入はコマンド二つで済み、重みがマシンに置かれた後はエアギャップ環境でも動きます。
セットアップ
potato download-models onnxruntime # 13.5 MB, once per install
potato download-models mobile_sam # 45 MBあとはスキーマの tools に sam を追加します。
annotation_schemes:
- annotation_type: image_annotation
name: objects
description: "Outline every object you find."
source_field: image
tools: [sam, polygon, brush, eraser]
labels:
- name: object
color: "#6e56cf"ブラシ、消しゴム、色を考慮した塗りつぶしツールは手作業のために引き続き使えます。対話的セグメンテーションはマスクを描き始めるための手段であって、マスクを修正する作業の代わりではありません。
動いているところを見るには examples/image/interactive-segmentation/ を実行してください。
仕組み
モデルは MobileSAM、Segment Anything の蒸留版で、ONNX Runtime Web 経由で動作します。
エンコーダーとデコーダーは意図的に分けてあります。エンコーダーは高価で画像ごとに一度、デコーダーは安価でクリックごとに一度動きます。両者を分けて画像ごとに埋め込みをキャッシュすることが、クリックがネットワークリクエストではなく対話的に感じられる理由のすべてです。キャッシュには上限があり、最も長く使われていない埋め込みから追い出されます。
正のクリックでマスクに加え、負のクリックで削り取り、ボックスで探索範囲を制約し、既存のマスクを精緻化することもできます。
ブラウザを既定にした理由
pip install potato-annotation をすれば、GPU も新しい Python の依存も、アノテーション時の外部通信もなしにセグメンテーションが動くべきです。最後の点は気配りの問題ではありません。いくつかの研究グループはエアギャップ環境で Potato を運用しており、そこではクリック時に取得されるモデルは遅い機能ではなく欠けた機能です。
| ブラウザ(既定) | サーバーエンドポイント | |
|---|---|---|
| セットアップ | potato download-models | pip install 'potato-annotation[vision]' と重み |
| GPU | 不要 | 推奨 |
| エアギャップ | モデルをダウンロード済みなら可 | 可 |
| モデルサイズ | 蒸留済み、約 45 MB | 用意したもの次第 |
GPU があって大きなモデルを使いたい研究室のためにサーバーエンドポイントもありますが、それは既定ではなく例外です。
入力の約束事は仮定ではなく検証された
SAM のエンコーダーは前処理済みの画像を受け取りますが、その仕様には複数のもっともらしい読み方が許されています。そのうち三つの読み方は、自信に満ちてもっともらしく、しかし誤ったマスクを生みます。重心の誤差は 70 から 148 ピクセルで、パイプラインの故障ではなく少し雑なアノテーターのように見えます。正しい読み方では 0.1 px に収まります。
この差は実際の重みと実際の正解に照らして初めて見えるものであり、だからこそこの約束事はコメントではなくテストで固定されています。ここでの読み違いは、それで作られたすべてのデータセットのすべてのマスクを黙って劣化させていたはずです。
マスクの一致度
同じ物体をセグメントする二人のアノテーターが同一のピクセルを出すことはないので、マスクの一致度には重なりの数値以上のものが要ります。Potato は STAPLE(Warfield、Zou、Wells、2004)を使い、潜在的な合意境界を、評価者ごとの感度と特異度とともに推定します。
ピクセルごとの多数決との差は見た目の問題ではありません。丁寧な二人が雑な三人に三対二で数負けしている場合、多数決は正解に対して Dice 0.846、STAPLE は 1.000 になります。STAPLE は、丁寧な二人が互いに一致している一方で雑な三人はそうでないことに気づくからです。
詳細と注意点はマスク合意を参照してください。