コンテンツへスキップ

画像アノテーションで検出・セグメンテーションのモデルを学習する

研究のボックスで検出器をファインチューニングし、予測したボックスを事前ラベルとしてアノテーターに見せ、修正で再学習し、スライドや細胞に合わせて実行を調整します。

v2.14.0の新機能

このチュートリアルでは、研究自身のバウンディングボックスで物体検出器を学習し、検出器のボックスを、次のアノテーターが修正する事前ラベルとして表示します。対象は、image_annotationスキームを持ち、最初のモデルを学習するを読んだか、管理画面のTrainingページに慣れている研究の担当者です。前半では、torchvision-detectで1つの完全なループ(画像上のボックス、学習の実行、書き戻し、修正、2回目の実行)を実行し、そこでの各ステップは、ノートパソコンのCPUで動きました。後半では、このループを、YOLO、輪郭、SAMによる精緻化、画像全体のクラス、全スライド、顕微鏡画像、地図、細胞、文書のページ、視覚言語モデルに合わせて調整します。それぞれが1つのセクションです。

ビジョン用のトレーナーをインストールする

torchvision-detectは、torchvisionのFaster R-CNN検出器をファインチューニングします。このトレーナーにはtorchとtorchvisionが必要です。torchは数ギガバイトのダウンロードになるため、Potatoは両方を既定のインストールから外しています。学習するマシンに、ビジョン用のextraをインストールします。

bash
pip install "potato-annotation[train-vision]"

同じextraが、torchvision-segment、hf-image-classification、sam-finetune、layoutlmv3、vlm-sftもカバーします。パッケージが足りないトレーナーは、Trainingページに「not installed」と表示され、パッケージをインストールするコマンドが添えられます。

以下の小さなプロジェクトでは、GPUは必須ではありません。Apple siliconのMacでは、torchvision-detectとtorchvision-segmentは、Metal(mps)ではなくCPUで学習し、実行ログには「torchvision-detect does not run on Apple's Metal (mps) with this torch; using the CPU」という警告とともに、この切り替えが記録されます。Potatoチームの測定では、既定の画像サイズでのMetalの学習1ステップは、CPUの1エポック全体よりも長くかかりました。より大きな画像や、より大きな研究では、リモート学習で説明しているように、GPUサーバーで学習してください。

画像プロジェクトを用意する

プロジェクトに必要なものは3つあり、画像、画像を列挙するデータファイル、設定です。画像は、プロジェクトのフォルダーの中のmediaという名前のフォルダーに置きます。Potatoは、既定で<task_dir>/media/をURLパスの/media/として配信するからです。別のフォルダーでも、設定のmedia_directoryでそのフォルダーを指定すれば動きます。

text
shapes/
  config.yaml
  data/images.jsonl
  media/img_001.png
  media/img_002.png
  ...

data/images.jsonlの各行は、IDと画像のURLパスを持つ1つの項目です。

json
{"id": "img_001", "image_url": "/media/img_001.png"}

設定は、bboxツールと2つのラベルを持つ1つのimage_annotationスキームを定義し、書き戻しとともにモデル学習をオンにします。この設定はpython -m potato.validate_cli --strictを通ります。

yaml
annotation_task_name: "Shape detection (model training)"
task_dir: "."
data_files:
  - "data/images.jsonl"
item_properties:
  id_key: "id"
  text_key: "image_url"
output_annotation_dir: "annotation_output"
 
require_password: false
admin_api_key: "demo-admin-key"
num_annotators_per_item: 1
 
annotation_schemes:
  - annotation_type: "image_annotation"
    name: "objects"
    description: "Draw a box around every circle and every square."
    source_field: "image_url"
    tools: ["bbox"]
    labels:
      - name: "circle"
        color: "#e6194b"
      - name: "square"
        color: "#4363d8"
 
model_training:
  enabled: true
  writeback:
    schemas: ["objects"]
    include_unlabeled: true
    min_confidence: 0.5

4つの設定がループを形作ります。

  • **source_field: "image_url"**は、画像ウィジェットとトレーナーに、どの項目フィールドが画像を持つかを伝えます。
  • **num_annotators_per_item: 1**は、各画像に1人のアノテーターを割り当てるため、シードのラベルができるだけ多くの異なる画像にわたります。
  • **writeback.include_unlabeled: true**は、各実行が、まだ誰もラベルを付けていない画像に対して予測するようにします。この設定がないと、実行はホールドアウトしたvalとtestの画像にだけ予測し、それらの画像にはすでに人のボックスがあります。
  • **writeback.min_confidence: 0.5**は、画像のボックスの平均スコアが0.5を下回るとき、その画像の予測を保留します。下限は画像全体に適用されるため、アノテーターが、1枚の画像のボックスの半分だけを見ることはありません。

プロジェクトのフォルダーの中からサーバーを起動します。

bash
potato start config.yaml -p 8000

シードセットにラベルを付ける

torchvision-detectは、train分割に注釈付きの画像が20枚に満たないと、当てはめを拒否し、既定の分割では、ラベル付きの画像の70%がtrainに入ります。少なくとも30枚の画像にラベルを付け、物体にばらつきがあるなら、さらに増やしてください。ボックスは、http://localhost:8000で手で描きます。ボックスのない画像は、学習から除外されます。物体のない画像と、誰も仕上げていない画像を、検出器は区別できないからです。提出する画像には、すべての物体を描いてください。

誰かがラベルを付ける前にループを試すには、ユーザーシミュレーターがゴールドファイルからボックスを描けます。ゴールドの各エントリーは、画像のIDと、スキームの形状を正規化した座標で与えます。

json
[
  {"id": "img_001", "objects": [
    {"type": "bbox", "label": "circle",
     "coordinates": {"x": 0.158, "y": 0.849, "width": 0.106, "height": 0.146}}
  ]}
]
bash
python -m potato.simulator --server http://localhost:8000 --users 3 \
  --strategy gold_standard --competence good=1.0 --max-annotations 20 \
  --gold-file data/gold.json --sequential --fast-mode --no-export

シミュレーターは、各ゴールドのボックスを数ピクセルのゆらぎとともに描き直し、goodのレベルでは、注意深いアノテーターがときにそうするように、いくつかの物体を見逃したり、誤ってラベルを付けたりもします。80枚の合成画像での私たちのテストでは、3人のシミュレートされたアノテーターが、約1秒で60枚の画像にラベルを付けました。

torchvision-detectを学習する

http://localhost:8000/adminを開いて、管理者キーdemo-admin-keyを入力し、http://localhost:8000/admin/trainingを開きます。スキームにobjectsを、トレーナーにtorchvision-detectを選び、Parametersは空のまま、Train nowをクリックします。同じ実行は、スクリプトから次のように開始できます。

bash
curl -X POST -H "X-API-Key: demo-admin-key" -H "Content-Type: application/json" \
  http://localhost:8000/admin/training/api/runs \
  -d '{"trainer": "torchvision-detect", "schemas": ["objects"]}'

実行は、torchvisionのCOCOの重みから始まり、スキームの2つのラベルに合わせて、検出器に新しいボックスのヘッドを付けます。torchは、最初の実行のときに、COCOの重みをtorchのキャッシュにダウンロードします。既定値は、小さなfasterrcnn_mobilenet_v3_large_fpnアーキテクチャ、15エポック、1ステップあたり4枚の画像、valのmAPが4エポック改善しないと早期終了、です。すべての形状は、その形状のバウンディングボックスとして学習されるため、アノテーターが多角形を描いた研究でも、学習されるのはボックスの検出器です。画像ごとに複数のアノテーターがいる場合、実行は、model_training.aggregationがその画像に対して選ぶ、1つの完全な答えで学習します。2人のボックスがぴったり一致することはめったにないからです。

私たちが使ったApple M4 ProのCPUでは、320×240ピクセルの37枚の学習画像が約106秒で学習され、実行は5エポックで止まりました。実行のファイルはannotation_output/training/runs/<run_id>/に置かれ、当てはめた検出器はartifacts/model/detector.ptにあります。実行の設定と、実行が使ったデバイスは、artifacts/model_card.jsonにあります。

ホールドアウトスコアを読む

どの実行も、検出器が一度も学習していない画像で、検出器を採点します。image_annotationスキームの代表指標はmap_50で、予測したボックスが、注釈付きの物体のバウンディングボックスとIoU 0.5以上で重なるときに一致と数える、COCOの平均適合率です。実行ページには、IoUのしきい値を0.5から0.95まで変えたときの平均であるmap_50_95も記録されます。1つの物体に対する2人のアノテーターのボックスが、IoU 0.9で重なることはめったにないため、より厳しいしきい値は、人がどれだけ一貫して描くかを部分的に測っています。そのためPotatoは、0.5のしきい値を先頭に置きます。バウンディングボックスの一致度を測るは、その一貫性を直接確かめる方法を示します。

検出器は、valのスコアが最も良いエポックのチェックポイントを残すので、testの分割に画像があるときは、代表指標はtestの分割から来ます。Runsテーブルは、代表指標をHeld-out score列に表示します。実行ページには、n_train、n_boxes、各分割のサイズとカバレッジ、valとtestでアノテーションされた物体と予測された物体の数が挙がります。色付きの円と四角形の80枚の合成画像での私たちのテスト実行では、検出器はtestのmap_50で0.99を記録しました。合成の形状は、実際の物体よりもはるかに見つけやすいため、スコアは、ご自身の画像で判断してください。

事前ラベルを確認する

実行が成功すると、Potatoは、検出器のボックスを、対象となる各画像のpredictionsフィールドに書き込みます。GET /admin/training/api/statusは、結果をレスポンスのwritebackフィールドで報告し、事前ラベルを受け取った画像にはn_writtenを、画像が保留された理由ごとにその数を示します。たとえば、min_confidenceを下回った場合はn_skipped_low_confidence、実行が学習に使った画像はn_skipped_train_splitです。train分割の画像には、事前ラベルが付きません。モデルが自分の学習データに対して持つ確信は、新しい画像については何も教えてくれないからです。

新しいユーザー名でhttp://localhost:8000にログインします。書き戻しのチェックを通った、ラベルのない各画像は、検出器のボックスがすでに描かれた状態で開きます。各ボックスは、source: aiと、confidenceとしての検出器のスコアとともに保存されます。アノテーターは、ボックスを移動またはサイズ変更し、ラベルを変更し、誤検出を削除し、検出器が見逃した物体を描きます。ボックスがアノテーターの答えになるのは、アノテーターがボックスを編集するか、次の画像に進んだときです。アノテーターが画像を見ているだけでは、事前ラベルは保存されません。モデルレビューキューは、事前ラベル付きの画像を、信頼度の低いものから順に出し、レビュアーのcorrectの判定は、その画像を以降のすべての実行のtrain分割に入れます。

修正されたボックスで再学習する

修正された各画像は、次の実行のための人のラベルになります。アノテーターが事前ラベル付きの画像のまとまりを処理したら、Trainingページから、別のtorchvision-detectの実行を開始します。新しい実行は、各画像について前の実行の予測を置き換え、新しい実行が学習に使う画像の事前ラベルは取り下げられます。

クリックなしで再学習するには、auto_retrainブロックを追加します。この断片は、上のmodel_trainingブロックを拡張し、新しいアノテーションが25件増えるたびに、最大でも10分に1回、実行を開始します。

yaml
model_training:
  enabled: true
  auto_retrain:
    enabled: true
    trainer: torchvision-detect
    schemas: [objects]
    update_frequency: 25
    min_interval_s: 600
  writeback:
    schemas: [objects]
    include_unlabeled: true
    min_confidence: 0.5

事前ラベルは、アノテーターをモデルのボックスに引きずります。アノテーターに書き戻しを見せるのは、ホールドアウトスコアが事前ラベルを裏付けるようになってからにしてください。アノテーターが見ずにボックスを受け入れていないかを確かめる方法は、見ずに承認された事前ラベルの検出を参照してください。

Ultralytics YOLOによる高速な検出

ultralytics-detectは、同じボックスで、COCOで事前学習されたチェックポイント(既定ではyolo11n.pt)からUltralytics YOLO検出器を学習します。YOLOは、torchvision-detectよりも速く学習して予測し、事前ラベルは同じ編集可能なボックスです。UltralyticsのライセンスはAGPL-3.0で、Ultralyticsで学習して配布したモデルには、AGPLの条件が付きます。Ultralyticsは、クローズドな用途向けに、別のエンタープライズライセンスを販売しています。PotatoのextraはUltralyticsを含まないため、パッケージは自分でインストールしてください。

bash
pip install ultralytics

Potatoは、実行のたびに、ライセンスの確認を求めます。Trainingページは確認を表示し、APIからの実行にはリクエストボディに"accept_licence": trueが必要で、自動再学習にはauto_retrain.accept_licence: trueが必要です。確認がないと、APIは、HTTP 400、needs_licence_ack: true、メッセージ「ultralytics-detect is licensed AGPL-3.0」で実行を拒否します。次のリクエストは、ライセンスを確認して実行を開始します。

bash
curl -X POST -H "X-API-Key: demo-admin-key" -H "Content-Type: application/json" \
  http://localhost:8000/admin/training/api/runs \
  -d '{"trainer": "ultralytics-detect", "schemas": ["objects"], "accept_licence": true}'

実行中、トレーナーは、Ultralyticsの利用状況の分析、Ultralytics HUB、実験トラッカーとの連携、パッケージの自動インストールをオフにします。変更は、実行のプロセスのメモリ上にだけ適用され、Ultralyticsの設定ファイルは変わりません。チェックポイントは~/.cache/potato/ultralyticsにダウンロードされます。既定値は、640ピクセルで50エポック、10エポックで早期終了、です。

ボックスの代わりに輪郭を使う

torchvision-segmentは、多角形、楕円、フリーハンド、ブラシマスクの輪郭で、torchvisionのMask R-CNNを学習します。ボックスは、どのピクセルが物体に属するかを示さないため、セグメンテーションの学習からは除外されます。アノテーターには、polygonやbrushのような輪郭のツールを与えてください。どのツールがどの場合に合うかは、画像セグメンテーションマスクのアノテーション方法にあります。

予測された各マスクは、頂点が最大64の多角形にたどられるため、アノテーターは、事前ラベルを点ごとに修正します。マスクが分かれて出たときは、最も大きい断片が残ります。既定のscore_thresholdは、検出器の0.25ではなく0.5です。Mask R-CNNが1つの物体について出す2番目の推測は、0.25から0.6の間のスコアになり、推測の1つ1つが、アノテーターが削除する形状を1つ増やすからです。ホールドアウトスコアは、予測された多角形を、注釈付きの輪郭と比べます。Macでは、torchvision-segmentはCPUで学習します。torch 2.8で、Potatoチームは、256ピクセルの画像での学習1ステップを、Metalで57秒、CPUで2.3秒と測りました。実際の研究には、GPUサーバーを使ってください。ultralytics-segmentはYOLOに対応するもの(yolo11n-seg.pt)で、同じ64頂点の多角形と、同じAGPL-3.0のライセンス確認があります。

sam-finetuneでボックスを輪郭にする

ボックスは描くのが速く、輪郭は遅いものです。sam-finetuneは、Segment Anything(SAM)のマスクデコーダーをファインチューニングして、ボックスを、アノテーターが描くであろう輪郭に変えます。画像エンコーダーは凍結されたままで、各画像の埋め込みは1回だけ計算されるため、1エポックのコストは小さくて済みます。学習では、注釈付きの各輪郭を、その輪郭のバウンディングボックスでプロンプトします。実行は、各プロンプトのボックスを最大box_jitter(既定では5%)だけ移動・サイズ変更するため、デコーダーは、検出器のボックスほどに緩いボックスからも学習します。

sam-finetuneはボックスを精緻化するもので、出発点となるボックスが必要です。1つのスキームでの通常の手順は、2回の実行です。

  1. writeback.include_unlabeled: trueでtorchvision-detectまたはultralytics-detectを実行し、ラベルのない画像にボックスの事前ラベルが付くようにします。
  2. 同じスキームでsam-finetuneを実行します。各ボックスの事前ラベルは多角形の事前ラベルになり、多角形がボックスを置き換えます。

SAMが学習するための輪郭がスキームに必要なので、bboxのほかに、輪郭のツールをアノテーターに与えてください。ホールドアウトした画像では、アノテーター自身のボックスがプロンプトになるため、val_mask_iouは、ボックスが正しいときの輪郭の平均IoUを報告します。これらのホールドアウトの予測は、採点されますが、保存も公開もされません。予測が別のアノテーターの答えから作られているからです。書き戻しのレポートは、ホールドアウトの予測をn_skipped_heldout_onlyで数えます。既定のチェックポイントはfacebook/sam-vit-base(Apache-2.0)です。ファインチューニングされたデコーダーは、事前ラベルの提供にだけ使われます。画像ツールのクリックでセグメントは、ブラウザー内で別のONNXの重みを実行しており、sam-finetuneの実行は、その重みを置き換えません。

画像全体を分類する

写真がどの動物を写しているかを尋ねるradioスキームのように、画像全体についての問いには、検出器ではなく分類器を使います。hf-image-classificationは、Hugging FaceのAutoModelForImageClassificationが読み込むあらゆるモデル(ViT、DeiT、BEiT、ConvNeXt、Swin、DINOv2など)をファインチューニングします。既定のモデルはgoogle/vit-base-patch16-224-in21kです。トレーナーは、既定で学習画像をランダムに反転します。画像内の文字や左右のように、反転がラベルを変えるときは、Parametersでflipをfalseにします。lora: trueは、すべての重みの代わりに、LoRAアダプターと分類ヘッドを学習します。

選択型のスキームは、ラベル付き項目の80%以上が、.jpg、.jpeg、.png、.bmp、.webp、.tif、.tiff、.gifのいずれかで終わる画像パスを持つとき、画像コーパスとして扱われます。そのようなコーパスでは、ベクトル化器を指定しないsklearn-textが、CLIPの画像埋め込みに線形分類器を当てはめます。CLIPのベースラインにGPUは不要で、必要なのはpip install "potato-annotation[embeddings]" pillowだけです。

画像のパスとリモートの画像

画像のトレーナーは、スキームのsource_fieldが指すフィールドを読みます。source_fieldがないときは、トレーナーは、image_url、image、image_path、file_name、url、path、およびそれらの音声版と動画版のうち、最初の空でない項目フィールドを使います。画像は、プロジェクト内のローカルファイルでなければなりません。

  • 相対パスはtask_dirを基準に解決され、task_dirの下にファイルがないときはmedia_directoryを基準に解決されます。
  • /media/img_001.jpgのようなURLパスは、media_directoryを基準に解決されます。アノテーションのページも、同じ場所から画像を読み込みます。
  • 絶対パス、../、またはシンボリックリンクによって、タスクのディレクトリとmedia_directoryの外に置かれるファイルは、警告とともに除外されます。
  • リモートのhttp(s)の画像は、決してダウンロードされません。実行は、画像がリモートまたは存在しない項目をすべて除外し、実行ログがその数を示し、それらの項目には予測が付きません。

画像で学習するには、リモートの画像をmedia_directoryにダウンロードしてください。既存の画像データセットをプロジェクトに取り込む方法は、ビジョン形式のページとpotato importにあります。

全スライドとその他の大きな画像

検出とセグメンテーションのトレーナーは、各画像を数百ピクセルにリサイズするため、10万ピクセルの病理スライドや衛星画像の物体は、そのサイズでは消えてしまいます。そのためPotatoは、image_annotation、microscopy、geo_annotationのスキームについて、実行の学習データを作るときに、大きな画像をタイルに切ります。タイル化は、スライドの形式(.svs、.ndpi、.mrxs、.scnなど)と、長辺が4,096ピクセル以上の画像に対して自動で行われます。スライドにはopenslideが必要です。

bash
pip install "potato-annotation[wsi]"

学習には、注釈付きの物体を含むタイルと、空のタイルのサンプルが使われ、各物体は、その物体のタイルでクリップされます。予測は、画像ごとに最大max_predict_tilesまで、組織の上にあるすべてのタイルを対象にします。各画像の分割は、画像を切る前に決まるため、1枚のスライドのタイルが2つの分割にまたがることはありません。タイルの予測は、画像全体に統合され、重なった2つのタイルが両方で見つけた物体は、1つだけが残ります。事前ラベルは、画像全体の座標を使い、ディープズームビューアーが保存するのと同じ座標です。ホールドアウトスコアは、画像全体で計算されます。リモートのバックエンドは、スライドではなくタイルをダウンロードします。

設定はmodel_training.tilingの下にあります。この断片は、40倍のスライドを、1,024ピクセルのタイルで20倍として学習します。

yaml
model_training:
  enabled: true
  tiling:
    tile_size: 1024
    overlap: 128
    downsample: 2

overlapは、物体と同じ大きさ以上にしてください。物体のほうが大きいと、物体はタイルごとに断片として見つかるからです。スライドの解像度が記録されているスライドでは、mppがタイルのピクセルあたりのミクロン数を設定し、downsampleを上書きします。一部のスライドでは、2つの設定に注意が必要です。空の学習用タイルは、注釈付きの画像のすべての物体が描かれていることを前提にしているため、アノテーターがスライドの一部の領域だけを描いたときは、background: 0にしてください。組織は、スライドのサムネイルに対する大津のしきい値で検出されるため、むき出しのガラスがないスライドは、色の薄いほうの半分を失い、tissue_threshold: 0は、すべてのタイルで予測します。すべてのキーと既定値は、tilingの表にあります。

顕微鏡画像と地図

microscopyスキームのROIは、torchvision-detect、ultralytics-detect、torchvision-segment、ultralytics-segment、cellposeを学習します。ROIを持つ各zスライスと時点は、スキームの既定のチャンネルとコントラストでレンダリングされ、別々の学習画像になります。レンダラーは、ビューアーが使うコンポジターです。まだ何も描かれていない画像は、ビューアーが開く位置である、中央のzスライスと最初の時点で予測されます。予測は、各ROIのzとtを持つ顕微鏡のROIとして戻ります。細胞の分類は、形状ではなくラベル画像を指すため、トレーナーは細胞の分類を飛ばします。

geo_annotationスキームのフィーチャーは、項目のラスターのベースマップで、同じ検出とセグメンテーションのトレーナーを学習します。GeoTIFFは、ファイル自身のタグにある変換とEPSGコードで配置され、投影されている場合はpyprojで再投影されます。範囲を持つ通常の画像は、経度と緯度に配置されます。多角形、長方形、線、点は、ラスター上の形状になり、多角形の穴は埋められます。予測は、source: modelを持つEPSG:4326のGeoJSONフィーチャーとして戻ります。地図はそのフィーチャーを候補として提示し、候補が答えとして数えられるのは、アノテーターが候補の1つを編集または承認したときだけです。ベースマップがタイルサーバーやGeoJSONの輪郭である地図には、学習するラスターがなく、実行は、それらの項目を警告とともに除外します。

cellposeによる細胞

cellposeは、image_annotationまたはmicroscopyスキームの、細胞や核の輪郭で、Cellposeをファインチューニングします。Cellpose 3または4は、別途インストールしてください。

bash
pip install cellpose

既定のベースモデルはcyto3です。nucleiとcyto2もCellpose 3で動作し、cpsamはCellpose 4で動作します。Cellposeの推定が外れるときは、diameterに、典型的な細胞の直径をピクセルで設定してください。Cellposeはクラスなしでセグメントするため、予測されたすべての細胞には、labelパラメーターが付き、labelが未設定のときは、スキームで最も多いラベルが付きます。クラスの見た目が異なるときは、ラベルごとに1つのモデルを学習してください。予測された各マスクは、細胞の平均確率を事前ラベルの信頼度として、多角形で戻ります。cellposeが必要とするのは、train分割の注釈付き画像5枚だけで、検出器の20枚と比べて少なくて済みます。Cellposeのコードは、BSD-3-Clauseで、重みはCellposeの作者が、作者の条件で提供しています。

スペクトログラム

spectrogram_annotationスキームのボックスは、スペクトログラム画像としてレンダリングされた各録音で、torchvision-detectとultralytics-detectを学習します。音声モデルのチュートリアルは、スペクトログラムの検出を、レンダリングの設定やトレーナーが読む録音の形式も含めて、最初から最後まで扱います。

layoutlmv3による文書のレイアウト

layoutlmv3は、LayoutLMv3をファインチューニングして、アノテーターがページ画像に描く領域を、ページの単語とその位置から見つけます。領域とは、タイトル、表、合計など、ラベルの付いたあらゆるブロックです。PotatoはOCRを実行しないため、各項目は、ページの単語を、ページ画像のピクセルまたは0から1の範囲のボックスとともに持ちます。

json
{"id": "page_001", "image": "pages/page_001.png",
 "words": [{"text": "INVOICE", "bbox": [40, 52, 180, 82]},
           {"text": "Total", "bbox": [300, 700, 380, 730]}]}

regionsモードのPAGE XMLのインポートは、ファイルのWord要素からwordsを埋めます。PDFのテキストレイヤーやほかのOCRツールからの単語も、同じように機能します。各単語には、その中心が入る領域のラベルが付き、予測された単語は領域に統合され、各領域は、領域の単語を囲むボックスの事前ラベルになります。ホールドアウトスコアはボックスのmAPです。予測されたボックスは領域の単語で終わるため、単語よりもはるかに大きく描かれた領域は、ボックスの出来よりも低いスコアになります。

LayoutLMv3の重みのライセンスはCC BY-NC-SA 4.0で、商用利用はできません。YOLOのトレーナーと同様に、Trainingページは実行の前に確認を求め、APIからの実行にはaccept_licence: trueが必要で、自動再学習にはauto_retrain.accept_licence: trueが必要です。

vlm-sftによる視覚言語モデル

vlm-sftは、画像についてのアノテーターの答えで、視覚言語モデルをファインチューニングします。既定ではLoRAアダプターを使い、既定のモデルはQwen/Qwen2.5-VL-3B-Instructです。トレーナーは、4つのスキームから学習します。

スキーム1つの学習例の単位モデルが生成することを学ぶもの
画像項目のtext項目スキームの質問に対するアノテーターの答え
region_captionキャプション付きの領域赤いボックスとして描かれた領域のキャプション
grounding_eval答えられた表現領域をJSONで、点で、または{"absent": true}で
gui_trajectoryクリックのあるcorrectと判定されたステップクリックを{"point": [x, y]}で

座標は、画像の0から1,000のグリッド上にあるため、どのチェックポイントも、例から形式を学習できます。テキストの実行は、生成された答えを、テキストの事前ラベルとして公開します。グラウンディングの実行は、すべての表現について、領域または不在を公開し、grounding_evalスキームはVLMのグラウンディングが扱います。GUI軌跡の実行は、モデルがクリックする位置から、各ステップの判定を提案し、GUIのトレースはコンピューター利用エージェントの評価が扱います。キャプションの実行は、トークンF1とBLEU-4で採点されますが、公開はされません。キャプション付きの領域は、アノテーターの答えだからです。

実際のチェックポイントにはGPUが必要です。Potatoチームは、Qwen/Qwen3-VL-2B-Instructを、LoRAで26枚の画像に対して2エポック、MacのMetal GPUで46秒で学習しました。Parametersに{"lora": {"quantize": "4bit"}}を指定すると、4ビットのベースの重みの上で、QLoRAアダプターを学習します。選ぶモデルのライセンスを確認してください。Qwen2.5-VL-3BはQwen研究ライセンスで、7BモデルはApache-2.0です。LoRA、QLoRA、Hugging Face Hubへのモデルの公開は、LLMファインチューニングのチュートリアルが扱います。

参考資料

参考文献

  • Ren, S., He, K., Girshick, R., and Sun, J. (2017). Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks. IEEE Transactions on Pattern Analysis and Machine Intelligence, 39, 1137–1149. doi:10.1109/TPAMI.2016.2577031
  • He, K., Gkioxari, G., Dollár, P., and Girshick, R. (2017). Mask R-CNN. 2017 IEEE International Conference on Computer Vision (ICCV), 2980–2988. doi:10.1109/ICCV.2017.322
  • Kirillov, A., Mintun, E., Ravi, N., Mao, H., Rolland, C., Gustafson, L., Xiao, T., Whitehead, S., Berg, A. C., Lo, W.-Y., Dollár, P., and Girshick, R. (2023). Segment Anything. 2023 IEEE/CVF International Conference on Computer Vision (ICCV), 3992–4003. doi:10.1109/ICCV51070.2023.00371
  • Stringer, C., Wang, T., Michaelos, M., and Pachitariu, M. (2021). Cellpose: a generalist algorithm for cellular segmentation. Nature Methods, 18, 100–106. doi:10.1038/s41592-020-01018-x
  • Huang, Y., Lv, T., Cui, L., Lu, Y., and Wei, F. (2022). LayoutLMv3: Pre-training for Document AI with Unified Text and Image Masking. Proceedings of the 30th ACM International Conference on Multimedia, 4083–4091. doi:10.1145/3503161.3548112