pid2graph-vlm-eval / README.md
deepkick's picture
Resolve HF Spaces gradio version conflict
7b3a08d

A newer version of the Gradio SDK is available: 6.12.0

Upgrade
metadata
title: PID2Graph VLM Eval
emoji: 🔧
colorFrom: blue
colorTo: purple
sdk: gradio
sdk_version: 4.31.5
python_version: '3.10'
app_file: app.py
pinned: false
license: mit
short_description: Zero-shot P&ID graph extraction with Claude Opus 4.6

PID2Graph × VLM Eval

P&ID(配管計装図)画像から VLM(Claude Opus 4.6)でグラフ構造(シンボル+接続関係)を抽出し、PID2Graph データセットの正解と定量比較する実験。

⚠️ このデモを動かすには ANTHROPIC_API_KEY の設定が必要です。 HuggingFace Spaces では Settings → Variables and secrets → New secret から ANTHROPIC_API_KEY を登録してください(値は Anthropic Console で発行した API キー)。 ローカル実行時は pid2graph 直下の .envANTHROPIC_API_KEY=sk-ant-... と書くか、 シェルで export ANTHROPIC_API_KEY=... を設定してから python app.py を実行します。

1 サンプルあたりの Claude API コスト目安: single-shot 約 $0.08 / tiled 2×2 約 $0.34。

製造業の技術図面に対する VLM のゼロショット構造抽出性能を評価し、CV とのハイブリッド戦略の必要性を実データで検証した。

背景と目的

P&ID のデジタル化(画像 → 構造化データ)は、設備管理 DB への自動登録やシミュレーションモデルの自動生成に不可欠な技術である。従来は CNN ベースのシンボル検出+線検出+ルールベース接続推定というモジュラーパイプラインが主流だったが、顧客ごとに異なる図面規格への対応コストが課題だった。

本実験では、VLM のゼロショット能力を活用して 訓練データなし でどこまで構造抽出が可能かを定量的に検証する。

データセット

PID2Graph(Stürmer et al., 2025)の OPEN100 サブセットを使用。

  • 12 枚の実 P&ID 画像(原子力プロジェクト OPEN100)
  • 正解は .graphml 形式(ノード: シンボル種別 + bounding box、エッジ: 接続種別)
  • 画像サイズ: 約 600×500 〜 2604×1744 ピクセル

手法

Semantic Equipment フィルタリング

正解データには connector(配管接続点)225 個、crossing(交差)71 個など、線レベルのプリミティブが大量に含まれる。VLM のゼロショットでこれらを網羅的に検出するのは非現実的なため、意味のある機器シンボルのみ を抽出・評価対象とした。

対象(semantic) 除外(primitive)
valve, instrumentation, tank, pump, inlet/outlet connector, crossing, arrow, background, general

GT 側も同じフィルタを適用し、primitive を経由するエッジは直接エッジに縮約(collapse)してフェアな比較を行った。

構造化出力

Claude API の messages.parse() に Pydantic スキーマ(GraphOut)を渡し、JSON スキーマ違反を SDK 側で検出。temperature=0 で決定論的サンプリングを強制。

{
  "nodes": [
    {"id": "n1", "type": "valve", "label": "TCV 1401", "bbox": [578, 930, 586, 944]}
  ],
  "edges": [
    {"source": "n1", "target": "n2", "label": "solid"}
  ]
}

タイル分割(2×2)

大きな図面を 4 タイルに分割(10-20% オーバーラップ)し、各タイルごとに VLM で抽出した後、bbox 距離ベースで重複排除+マージ。

Seam Filter: タイル境界付近で配管の切れ端を inlet/outlet と誤検出する問題に対し、タイル内側境界 ±50px 以内かつ図面外縁でない inlet/outlet を FP として除去する後処理を追加。

実験結果

12 枚全件ベースライン

指標 Precision Recall F1 TP FP FN
Nodes(single-shot) 0.941 0.699 0.802 527 33 227
Nodes(tiled + seam filter) 0.828 0.948 0.884 715 149 39
Edges(single-shot) 0.086 0.018 0.030 38 402 2033

Single-shot vs Tiled(サイズ別比較)

図面 GT nodes Single F1 Tiled F1 ΔF1 Tiled Precision Tiled Recall
Small (#1, GT=27) 27 0.739 0.783 +0.044 0.643 1.000
Medium (#3, GT=53) 53 0.796 0.955 +0.159 0.914 1.000
Large (#0, GT=82) 82 0.706 0.964 +0.258 0.952 0.976

カテゴリ別 Recall(12 枚集計、single-shot)

type GT pred Recall
instrumentation 350 267 0.76
valve 257 128 0.50 ← 最大の失点
inlet/outlet 96 100 1.04
tank 35 43 1.23
pump 16 22 1.38

考察

1. VLM は「意味理解に強く、空間的な網羅性に弱い」

  • Precision 0.94: VLM が検出したシンボルの種別判定はほぼ正確。「見えているものを正しく分類する」能力は非常に高い
  • Recall 0.70(single-shot): 正解の 30% を見落とす。特に valve(Recall 0.50)は小さなシンボルが画像リサイズで潰れるため

これは理解力の問題ではなく 解像度の限界 である。

2. タイル分割で解像度問題を解決

図面が大きいほどタイル分割の効果が顕著:

  • Small(GT=27): ΔF1 = +0.044(効果薄、FP 増加コスト)
  • Medium(GT=53): ΔF1 = +0.159(Precision 維持しつつ Recall 1.000)
  • Large(GT=82): ΔF1 = +0.258(Precision も 0.889→0.952 に向上)

Large では 1-shot 時に曖昧な小要素を「とりあえず出す」誤検出が、タイル分割で高解像度になることで消える。実用的には図面サイズに応じた適応的モード切替が最適。

3. エッジ抽出は VLM 単体では実用にならない

Edge F1 ≈ 0.03 は全条件で共通。VLM は配管の線形状を追跡しておらず、テキストタグの類似性から接続を推測している。これは CV 的な線追跡ロジックとの組み合わせ でしか解決できない。

4. BPMN 構造抽出論文(Deka & Devereux, 2026)との比較

同種のタスク(図面画像→構造化 JSON)で VLM を評価した SAC 2026 採択論文との対比:

観点 BPMN 論文 本実験(P&ID)
ノード数/図面 数十個 数百個(1 桁多い)
Relation 抽出 GPT-4.1 で F1 0.475 Edge F1 ≈ 0.03
OCR 補完効果 中位モデルで有効、上位モデルには逆効果 未検証(今後の課題)
最有効プロンプト DFS+BFS Hybrid 今後検証予定

P&ID は BPMN より要素数が 1 桁多く、シンボル種類も工業規格(ISO 10628)に依存するため、難度が大幅に高い。

今後の課題:エッジ(接続関係)抽出の改善

今回の実験ではノード検出で F1 0.964 を達成したが、エッジ抽出は F1 ≈ 0.03 で実用にならなかった。接続関係の抽出は P&ID デジタル化の核心であり、最優先の研究課題である。

アプローチ 1: モジュラーパイプライン(CV 主導)

従来の P&ID デジタル化で主流のアプローチ。

  • 線検出: 画像の二値化 → スケルトン化 → Hough 変換で配管ラインを検出(Moon et al., 2021)
  • 接続推定: 検出済みシンボルの bbox と線分端点の近接性からグラフ探索で接続を復元
  • 課題: モジュール間のエラー伝播。線の交差・分岐での追跡失敗が接続推定精度を大きく下げる

参考実装: Azure P&ID Digitization(Microsoft ISE, 2024)

アプローチ 2: End-to-End Transformer(Relationformer)

PID2Graph 論文(Stürmer et al., 2025)が提案。シンボルと接続関係を同時に抽出する。

  • Node AP 83.63%, Edge mAP 75.46%(モジュラー方式に対してエッジ検出で 25%以上の改善)
  • 接続関係を直接推論するため、線検出のエラー伝播がない
  • 課題: 専用モデルの訓練が必要。新しい図面規格への汎化にはドメイン特化のファインチューニングが不可欠

アプローチ 3: ハイブリッド(CV + VLM)← 提案する方向性

今回の実験結果と先行研究を踏まえた、最も有望なアプローチ。

[P&ID 画像]
    │
    ├─ Stage 1: ノード検出(CV or VLM タイル分割)
    │   → 今回の手法で Precision 0.95, Recall 0.95 を達成済み
    │
    ├─ Stage 2: 線検出・追跡(CV)
    │   → スケルトン化 + Hough 変換で配管ラインを抽出
    │   → 検出済みノードの bbox を除去した画像に対して実行
    │
    ├─ Stage 3: 接続関係の推論(VLM)
    │   → 確定済みノード一覧 + 線検出結果 + 元画像を VLM に渡す
    │   → "これらのノード間の接続関係を列挙せよ" と推論
    │   → VLM を「審判(Judge)」として活用(Ghosh et al., 2025)
    │
    └─ Stage 4: 後処理・検証
        → グラフ整合性チェック(孤立ノード除去、双方向性確認)
        → ドメイン知識による制約(バルブは必ず 2 本の配管に接続、等)

根拠となる先行研究:

  • VLM as a Judge(Ghosh et al., 2025): VLM を直接検出に使わず、CV の結果を VLM が評価・補完するフレームワーク。Gemini 2.5 で F1 0.876
  • Arrow-Guided VLM(Spies et al., 2025): CV 検出器で矢印方向を特定してから VLM に座標付きプロンプトで渡す。QA 精度 +9pp
  • TextFlow(Shukla et al., 2024): VLM の出力を構造化テキスト(Graphviz/Mermaid)に変換し、LLM で推論する 2 段階分離
  • Florence-2 ファインチューニング(Khan et al., 2024): 0.23B パラメータの軽量 VLM で、GPT-4o の zero-shot 比 F1 +52.4%。ドメイン特化ファインチューニングの有効性を実証

その他の改善課題

課題 期待効果 優先度
IoU ベース dedup(タイルマージ時) tank/pump の過検出を解消、Precision 向上
適応的タイル切替(GT サイズ推定→閾値判定) 小図面での FP 削減
DFS+BFS Hybrid プロンプト BPMN 論文で最有効。P&ID での検証が必要
Sonnet 4.6 との比較 コスト 1/3 で精度差を測定

デモ

Gradio ベースのインタラクティブデモ。P&ID 画像をアップロード → VLM でグラフ構造を抽出 → 正解 graphml と比較 → スコア表示 + NetworkX でグラフ可視化。

起動方法

git clone https://github.com/deepkick/pid2graph-vlm-eval.git
cd pid2graph-vlm-eval
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt

# .env に API キーを設定
echo "ANTHROPIC_API_KEY=sk-ant-..." > .env

# Gradio デモ起動
python app.py
# → http://127.0.0.1:7860

CLI での評価実行

# 12 枚全件(single-shot)
python -m pid2graph_eval.cli \
    --image-dir "PID2Graph/Complete/PID2Graph OPEN100" \
    --gt-dir "PID2Graph/Complete/PID2Graph OPEN100" \
    --semantic-only --output results.json

# タイル分割モード
python -m pid2graph_eval.cli \
    --image-dir "PID2Graph/Complete/PID2Graph OPEN100" \
    --gt-dir "PID2Graph/Complete/PID2Graph OPEN100" \
    --semantic-only --tiled --output results_tiled.json

プロジェクト構成

pid2graph-vlm-eval/
├── app.py                      # Gradio デモ UI
├── requirements.txt
├── .env                        # API キー(.gitignore 対象)
├── pid2graph_eval/
│   ├── schema.py               # Pydantic モデル(GraphOut)
│   ├── gt_loader.py            # graphml → 正規化ノード/エッジ
│   ├── extractor.py            # Claude API 呼び出し(single / tiled)
│   ├── metrics.py              # P/R/F1 算出(ノード / エッジ)
│   ├── tile.py                 # タイル分割・マージ・seam filter
│   └── cli.py                  # CLI エントリポイント
├── samples/                    # OPEN100 から 3 枚(small/medium/large)
│   ├── open100_01_small.png
│   ├── open100_01_small.graphml
│   ├── open100_03_medium.png
│   ├── open100_03_medium.graphml
│   ├── open100_00_large.png
│   └── open100_00_large.graphml
└── results/                    # 評価結果 JSON

使用技術

  • VLM: Claude Opus 4.6(Anthropic API、構造化出力)
  • 評価データ: PID2Graph OPEN100(CC BY-SA 4.0)
  • ライブラリ: NetworkX, Pydantic, Pillow, tqdm, Gradio, matplotlib
  • 開発環境: Claude Code + VS Code(Dev Container)

参考文献

論文 手法 URL
Stürmer et al., 2025 — PID2Graph Relationformer(End-to-End) arXiv:2411.13929
Ghosh et al., 2025 — VLM as a Judge CV 検出 + VLM 品質評価 arXiv:2510.03376
Shteriyanov et al., 2025 OCR + VLM + マルチモーダルプロンプト Wiley
Deka & Devereux, 2026 — BPMN-VLM VLM + OCR 補完 arXiv:2511.22448
Spies et al., 2025 — Arrow-Guided VLM 物体検出 + VLM 推論 arXiv:2505.07864
Khan et al., 2024 Florence-2 ファインチューニング arXiv:2411.03707
Shukla et al., 2024 — TextFlow VLM → 構造化テキスト → LLM 推論 arXiv:2412.16420
Moon et al., 2021 スケルトン化 + Hough 変換 MDPI
Goldstein et al., 2025 P&ID → Neo4j 知識グラフ → RAG arXiv:2502.18928

License

MIT