Spaces:
Running
A newer version of the Gradio SDK is available: 6.12.0
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直下の.envにANTHROPIC_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