Potato 2.8:何にでもアノテーションし、そして測る
Potato 2.8 はコンピュータビジョン、ギガピクセルのディープズーム、3D 点群、深度マップ、ロボットのエピソード、生成動画の評価、VLM グラウンディングに対応し、そのすべてについて偶然一致補正された一致度を報告します。
Potato は画像モードを備えたテキストアノテーションのプラットフォームでした。2.8 からは画像、動画、ギガピクセルのスキャン、3D 点群、深度マップ、ロボットのエピソード、生成動画のロールアウト、視覚言語のグラウンディングを扱い、そのいずれについてもアノテーターが一致したかどうかを報告します。
後半こそ二度読む価値のある部分です。描画ツールは希少ではありません。CVAT、Label Studio、Roboflow、V7、Supervisely はいずれもボックスとポリゴンを描け、そのいくつかは Potato より上手です。希少なのは空間ラベルに対する偶然一致補正された信頼性統計です。それを報告している他のアノテーションプラットフォームを我々は見つけられていません。標準は生の IoU か一致率です。
Potato 2.8
PyPI からインストールした人は更新してください
まず何よりこれです。2.7.1 までのホイールはパッケージデータを一階層のグロブで宣言していたため、サブディレクトリに置かれた 27 個のテンプレートが公開パッケージに入っていませんでした。pip install した人にとっては、ソロモードのセットアップ経路、管理ダッシュボード、ジャッジの較正、コーパスマップがいずれも壊れていました。git チェックアウトから実行していた人は一度も遭遇せず、それがテストスイートで捕まらなかった理由でもあります。
pip install --upgrade potato-annotation報告と修正は @0x6362 による PR #164 です。
生の IoU が一致度でない理由
どの画像にも大きな対象が一つ中央に写っているコーパスを考えてください。二人のアノテーターがどちらも中央にボックスを描けば大きく重なるので、平均 IoU は 0.95 前後になります。
画像を見ずに中央へボックスを描いたアノテーターでも同じです。
この数値が測っているのは、アノテーターがどれだけ一致しているかではなく課題がどれだけ簡単かであり、それはまさに、カテゴリラベルについて偶然一致補正が発明されたときに解こうとした問題です。Potato は σ を報告します。これは α 自身の 1 − D_o/D_e の形を任意の距離へ一般化したもので、偶然のベースラインは異なる項目のアノテーションを比較して経験的に推定します。σ = 0 は、無関係な画像の場合と変わらない程度にしかアノテーターが一致していないという意味です。
素直な代案である 1 − IoU 上の Krippendorff's α は機能しないと分かっており、それが当初の計画だったからこそ理由を述べておく価値があります。IoU 距離は飽和します。無作為に組み合わせた二つのボックスはほぼ必ず IoU が 0 になるため、期待される不一致は 1 前後に潰れ、α は偶然一致補正が残らない 1 − 平均距離 に退化します。Braylan、Alonso、Lease(WWW 2022)も経験的に同じ結論に至り、バウンディングボックスでは α が単純な L2 を IoU や GIoU より上に置き、実務者が与える順序を逆転させると報告しています。
空間の一致度はまた、一つではなく三つの数値として報告されます。アノテーターは同じ対象を見つけたのか、それを同じものと呼んだのか、同じ場所に置いたのか。すべてを見つけたうえでラベルを取り違えるアノテーターは、ラベルは正しいがボックスが緩いアノテーターとは別の問題を抱えており、対処法も異なります。
これを必要にしたバグ
裁定はアノテーションのキーを比較していました。画像スキーマはすべてを _data という一つのキーの下に格納します。
したがってどの画像ペアも一致度 1.0 になっていました。何一つ一致していない二人のアノテーターが全員一致に見え、レビューに回された画像は一枚もありませんでした。
これは修正済みであり、一致度の層が後付けではなく各アノテーション型に組み込まれている理由でもあります。
ブラウザでのセグメンテーションとテキストプロンプト
対象をクリックすればマスクが得られます。約 130 ミリ秒、GPU 不要、クリックごとのネットワーク呼び出しもありません。ONNX Runtime Web 上の MobileSAM です。
語句を入力すれば、該当するものすべてがボックスで返ってきます。こちらは Grounding DINO で、面白いのはライセンスです。テキストプロンプトによるラベル付けには SAM 3 の非商用条項が必要だと広く思われていますが、そうではありません。Grounding DINO は Apache-2.0 であり、だからこそこれを有料枠ではなく全員に届けられました。
これを作る過程で得られた、Potato の外にも一般化する細部が二つあります。
エンコーダの契約は実際の重みに対して検証しました。 SAM の入力仕様にはもっともらしい読み方が複数あり、そのうち三つは自信ありげでもっともらしい誤ったマスクを生みます。重心誤差にして 70 から 148 ピクセル。壊れたパイプラインというより、少し雑なアノテーターに見える程度です。正しい読み方は 0.1 px に着地します。両者を切り分けられるのは、実際の重みと実際の正解に対する検証だけです。
量子化は測定で選びました。 686 MB の完全精度 Grounding DINO のエクスポートに対して、q4f16 はボックス IoU 0.972 を保ち、int8 は 0.874 でした。しかも q4f16 のほうが 50 MB 小さいのです。慣習的な選択をしていれば、より大きなファイルでより悪いモデルを出荷することになっていました。
動画と、答えないことの価値
一つのフレームにマスクを描いて Track forward を押すと、SAM 2 がそれ以降のフレームで対象を追跡します。既知の正解に対して測ったところ、フレームごとの IoU は 0.974 から 0.979 で、最初のフレームから最後まで劣化はなく、CPU でおよそ 1.32 秒/フレームでした。
これは意図してサーバー側で動きます。コストがプロンプトごとではなくフレームごとにかかるためで、ブラウザのタブで動画モデルを百フレーム走らせれば、ページが数分固まることになります。Potato にはより軽いブラウザ内のキャリーフォワード経路もあり、この二つを混同すべきではありません。
アノテーションの作業ループでもっとも効いてくる性質は、モデルが対象が遮蔽されていると自ら判断し、推測せずに空のフレームを返すことです。隠れたフレームにもっともらしい誤ったマスクがあれば、それを取り消す手間が生まれます。空のフレームは一目で読み取れ、しかもそれが正しい答えです。
3D、深度、ロボット
spatial_annotation は PCD、PLY、LAS、KITTI の .bin、.xyz を読み込み、八分木による詳細度、正射投影のスラブパネル、そしてすべての 3D ボックスをすべてのカメラ画像に投影する較正を備えます。アノテーターは 3D で編集しながら 2D で確認できます。
回転はヨー角ではなくクォータニオンとして格納されます。これが KITTI の取り込みを可逆にしており、ヨーだけのフィールドが黙って捨てるおよそ 0.85° のカメラとライダーの取り付け傾斜も保たれます。KITTI への書き戻しでも、ボックスを黙って平坦化するのではなく、どれだけの姿勢情報を落とさざるを得なかったかを報告します。
深度マップは 16 ビット PNG と TIFF、NPY、PFM、EXR を読み、カーソル下にメートル値を表示します。ゼロは「非常に近い」として描画せずマゼンタで塗ります。ゼロはほぼ普遍的に「戻り値なし」のコードであり、模様のない壁に向けたステレオ装置は実際に 80% が穴になるからです。
episode_annotation は N 本の同期した動画ストリームと M 本のロボット時系列レーンを一本のタイムラインに載せます。結果は二つではなく三つです。実際のロボットデータでは部分的が最頻の結果であり、二値に押し込めば、そのデータセットにアノテーションする価値を作っている信号が壊れます。レーンの間引きは極小と極大を保つので、一フレームの力の尖りが幅 300 ピクセルのレーンまで生き残ります。これは重要です。把持の失敗は、カメラで明白になる数フレーム前に力の波形に現れるからです。
世界が破綻する場所を記す
rollout_evaluation は 2 本から N 本の生成動画を一つの時計に載せて表示し、世界が意味をなさなくなるフレームを記し、どの物理的・因果的な性質が破綻したかをタグ付けするようアノテーターに求めます。
「物理的妥当性」に 5 段階の 3 という評定は、検証もできず、位置も特定できず、何かを直すのにも使えません。フレーム番号とカテゴリならそのいずれも可能であり、二人のアノテーターの答えは一本の線上の二点なので、本当の一致度統計が適用できます。
破綻点の一致度は検出、位置決め、カテゴリとして報告され、対応づけの許容幅は単一の値ではなくスイープとして示されます。0.25 秒での一致度と 2 秒での一致度は、同じデータについての別の主張だからです。
過小評価されそうな機能
事前ラベル付けはアノテーターを速くします。同時に、追認を摩擦ゼロにもします。提案が現れ、アノテーターが受け入れを押し、データセットはモデルが自分自身に同意した記録になります。
アノテーションの中に、それと丁寧なレビューを見分けるものはありません。ジオメトリは同一であり、アノテーター間一致度を含むあらゆる品質指標が良く見えます。同じ事前ラベルを受け入れたアノテーターは、構造上、全員一致だからです。
違いが現れる唯一の場所が所要時間です。描画テレメトリは図形ごとの所要時間、ストロークの動態、修正回数、AI 提案の受け入れ遅延を記録し、座標は一切、決して記録しません。これは方針ではなくイベント記録の構造上の性質です。
ワンクリックの自動ラベル付けが当たり前になるにつれ、レビューと追認を分ける信号はこれだけになります。
2.8 のその他の変更
- スレッド化された会話。
dialogue表示は各ターンのreply_toから返信構造を描画し、potato convokitはあらゆる ConvoKit コーパスを取り込んで書き戻します。convokitへの依存はありません。 - 15 の取り込み形式と 29 の書き出し形式、うち 11 は往復可能です。Darwin は双方向に動きます。プラットフォームに参加するのではなく離れるときに効いてきます。
- 稼働中のデータベース取り込み。 起動後に作られた行が、再起動なしで
poll_interval_seconds以内にアノテーション対象になります。 - 機械可読な仕様。 159 の設定キー、61 のアノテーション型、24 の表示型を網羅する JSON Schema と、419 パスの OpenAPI 文書。いずれもコードから生成され、いずれも CI で検査されます。
- 外向きのリクエストなし。 14 のテンプレートすべてで、あらゆるアセットがインストール先から配信されます。
styles.cssは冒頭で Google Fonts を@importしており、ページ読み込みのたびにすべてのアノテーターの IP アドレスを第三者へ送っていました。データを自分たちのインフラの外に出さないために自前でホストしているツールで、です。これは過去三回のエアギャップ監査を生き延びていました。どの検査も<script src>と<link href>を見ており、スタイルシート内の@importはそのどちらでもなかったからです。 - 管理画面の Instances タブが二次から線形になりました。2,000 項目で 15.1 秒から 23 ミリ秒へ。
画像アノテーションのキーボードショートカットは、既定で V7 の慣習に従うようになりました(b ブラシ、r 矩形、f 塗りつぶし、k キーポイント、v 選択)。すでに実施中の研究で従来の割り当てに戻すには keybinding_profile: legacy を設定してください。
どこから始めるか
以上のすべては無償で自前ホスト可能な製品に含まれます。有料枠はありません。