BridgeCLIP(日本語版)— 橋梁点検画像の分類と検索のための CLIP ファインチューニング

OpenCLIP ViT-B/32 を全国道路施設点検データベース(xROAD)の橋梁点検画像と日本語所見テキストのペアでファインチューニングしたモデル。分類(4 カテゴリ)と画像⇔テキスト検索を 1 つの埋め込み空間で同時に実現します。

  • コードリポジトリ: t-seino-ml/BridgeCLIP-japanese
  • 英語キャプション版: 別 repo として準備中(t-seino-ml/BridgeCLIP-english、Coming soon)

モデル概要

項目
ベースモデル OpenCLIP ViT-B/32 (laion2b_s34b_b79k)
画像エンコーダ Vision Transformer (ViT-B/32)
テキストエンコーダ Transformer (GPT-2 ベース)
射影次元 512
学習データ 130,930 件(橋梁点検画像-日本語所見テキストペア)
バッチサイズ 128
学習率 1e-4(warmup 1000、weight decay 0.1、AMP)
エポック 100(best = epoch 5、val_loss = 2.5242)
損失関数 コントラスティブ損失(CLIP loss)

使い方

インストール

pip install open_clip_torch torch huggingface_hub

モデルの読み込み

from huggingface_hub import hf_hub_download
import open_clip
import torch
from PIL import Image

# ベースモデル構造
model, _, preprocess = open_clip.create_model_and_transforms(
    "ViT-B-32", pretrained="laion2b_s34b_b79k"
)
tokenizer = open_clip.get_tokenizer("ViT-B-32")

# Hugging Face Hub から ckpt をダウンロード
ckpt_path = hf_hub_download(
    repo_id="t-seino-ml/BridgeCLIP-japanese",
    filename="epoch_5.pt",
)
ckpt = torch.load(ckpt_path, map_location="cpu", weights_only=False)
state_dict = ckpt.get("state_dict", ckpt)
state_dict = {k.replace("module.", ""): v for k, v in state_dict.items()}
model.load_state_dict(state_dict, strict=False)
model = model.eval()

# 画像特徴の抽出
image = preprocess(Image.open("bridge_image.jpg")).unsqueeze(0)
with torch.no_grad():
    image_features = model.encode_image(image)
    image_features /= image_features.norm(dim=-1, keepdim=True)

# テキスト特徴の抽出
texts = tokenizer(["主桁にひびわれが見られる", "鋼部材の腐食が進行している"])
with torch.no_grad():
    text_features = model.encode_text(texts)
    text_features /= text_features.norm(dim=-1, keepdim=True)

# コサイン類似度
similarity = image_features @ text_features.T
print(similarity)

k近傍分類

完全な分類パイプライン(学習DB の特徴抽出、k近傍多数決)は GitHub リポを参照:

t-seino-ml/BridgeCLIP-japanese

代表的なコマンド:

CUDA_VISIBLE_DEVICES=0 python -m classification.models.clip_finetuned_knn \
  --train_csv classification/results/unified_train_user.csv \
  --val_csv   classification/results/unified_val_user.csv \
  --ckpt_dir  logs_classification/bridgeclip_vitb32_unified/checkpoints \
  --out       classification/results/clip_finetuned_knn_preds.csv \
  --k 10

性能(検証データ 2,679 件)

分類 — Macro-F1

カテゴリ CLIP-FT + k-NN(提案) CLIP-FT + 線形分類器 教師あり最強ベースライン (ResNet50 weighted finetune)
健全度判定 0.4170 0.3879 0.6106
対策区分 0.2415 0.2273 0.3293
損傷種類 0.5115 0.4939 0.5379
損傷部位 0.4904 0.5021 0.4640
平均 0.4151 0.4028 0.4855

本モデル(CLIP-FT k-NN)は 損傷部位の macro-F1 / macro-Precision で首位を維持しつつ、単一の埋め込み空間で分類と検索を同時にこなせる点が利点。

特徴量の比較(同じ supervised 線形プローブヘッド、backbone のみ違う)

Backbone 平均 macro-F1
ResNet50 (ImageNet) 0.3278
ViT-B/16 (ImageNet) 0.3496
CLIP-base (LAION-2B) 0.3304
CLIP-FT(本モデル) 0.4028 (+21.9% 相対改善)

橋梁ドメインでのコントラスティブ学習は ImageNet / LAION-2B 事前学習を +21.9% 相対 で上回ることを実証。

検索(Recall@k)

方向 Base CLIP CLIP-FT(本モデル)
Image→Text R@1 0.0004 0.0370
Image→Text R@10 0.0037 0.2251
Text→Image R@1 0.0011 0.0493
Text→Image R@10 0.0045 0.2437

属性ベース検索 (Text → Image, AttrMatch@1)

クエリテキストの属性ラベルと検索画像の属性ラベルが 1 つでも一致すれば hit。

カテゴリ Base CLIP CLIP-FT 倍率
健全度判定 0.3502 0.7043 ×2.01
対策区分 0.3101 0.6281 ×2.03
損傷種類 0.1248 0.6667 ×5.34
損傷部位 0.1252 0.6397 ×5.11

損傷種類・部位の T2I 検索で 5 倍超の改善を確認。これは ResNet50/ViT のような教師あり分類器には原理的に不可能な能力。

学習データ

全国道路施設点検データベース(xROAD)から抽出した橋梁点検画像と日本語所見テキストのペア。

Split サンプル数
Train 130,930
Validation 2,679
k-NN データベース(4 カテゴリすべて有効な行のみ) 90,987

分類カテゴリ

カテゴリ クラス数 タイプ
健全度判定 4 (Ⅰ / Ⅱ / Ⅲ / Ⅳ) 単一ラベル
対策区分 9 (A / B / C1 / C2 / E1 / E2 / M / S1 / S2) 単一ラベル
損傷種類 15 マルチラベル
損傷部位 20 マルチラベル

ファイル構成

.
├── README.md          # このファイル
├── epoch_5.pt         # ファインチューニング済みチェックポイント(約 1.7 GB)
└── config.json        # モデル設定

引用

論文準備中。

ライセンス

MIT License。データセット本体は配布しません(GitHub リポの「データ」セクション参照)。

Downloads last month
-
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support