--- 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](https://zenodo.org/records/14803338) データセットの正解と定量比較する実験。 > **⚠️ このデモを動かすには `ANTHROPIC_API_KEY` の設定が必要です。** > HuggingFace Spaces では **Settings → Variables and secrets → New secret** から > `ANTHROPIC_API_KEY` を登録してください(値は [Anthropic Console](https://console.anthropic.com/) で発行した 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](https://zenodo.org/records/14803338)(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` で決定論的サンプリングを強制。 ```json { "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](https://github.com/Azure-Samples/digitization-of-piping-and-instrument-diagrams)(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 でグラフ可視化。 ### 起動方法 ```bash 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 での評価実行 ```bash # 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](https://arxiv.org/abs/2411.13929) | | Ghosh et al., 2025 — VLM as a Judge | CV 検出 + VLM 品質評価 | [arXiv:2510.03376](https://arxiv.org/abs/2510.03376) | | Shteriyanov et al., 2025 | OCR + VLM + マルチモーダルプロンプト | [Wiley](https://onlinelibrary.wiley.com/doi/abs/10.1002/smr.70072) | | Deka & Devereux, 2026 — BPMN-VLM | VLM + OCR 補完 | [arXiv:2511.22448](https://arxiv.org/abs/2511.22448) | | Spies et al., 2025 — Arrow-Guided VLM | 物体検出 + VLM 推論 | [arXiv:2505.07864](https://arxiv.org/abs/2505.07864) | | Khan et al., 2024 | Florence-2 ファインチューニング | [arXiv:2411.03707](https://arxiv.org/abs/2411.03707) | | Shukla et al., 2024 — TextFlow | VLM → 構造化テキスト → LLM 推論 | [arXiv:2412.16420](https://arxiv.org/abs/2412.16420) | | Moon et al., 2021 | スケルトン化 + Hough 変換 | [MDPI](https://www.mdpi.com/2076-3417/11/21/10054) | | Goldstein et al., 2025 | P&ID → Neo4j 知識グラフ → RAG | [arXiv:2502.18928](https://arxiv.org/abs/2502.18928) | ## License MIT