ViT-GPT2による画像キャプション生成:アーキテクチャ解説と実践的最適化手法

画像から自然なテキスト説明を自動生成するタスクにおいて、Vision Transformer(ViT)とGPT2を組み合わせたエンコーダ・デコーダモデルは高い性能を発揮します。本稿では、nlpconnect/vit-gpt2-image-captioningの構造を深掘りし、推論速度・精度向上のための実装テクニックと、プロダクション環境への展開方法を具体的に紹介します。

アーキテクチャの核心:視覚特徴と言語生成の融合

このモデルは、入力画像を16×16のパッチに分割し、線形埋め込み+位置エンコーディングを経て768次元ベクトル列に変換。その後、12層のTransformerエンコーダで高次視覚特徴を抽出します。デコーダ側のGPT2は、これらの特徴をクロスアテンションで参照しながら、逐次的に単語を生成。ビームサーチや温度調整などの生成戦略により、多様性と一貫性のバランスを制御します。

最小限のセットアップと推論コード

from transformers import pipeline
import torch

# GPU利用可なら高速化
device_id = 0 if torch.cuda.is_available() else -1

captioner = pipeline(
    "image-to-text",
    model="nlpconnect/vit-gpt2-image-captioning",
    device=device_id
)

result = captioner("sample.jpg")
print(result[0]['generated_text'])  # 例: "a black cat sitting on a windowsill"

生成品質を向上させるパラメータ調整

  • max_length=25:短すぎず冗長にならない長さ
  • num_beams=5:探索幅を広げてより良い候補を選択
  • repetition_penalty=1.4:同じ単語の繰り返しを抑制
  • temperature=0.75:出力の多様性と安定性のバランス

推論高速化の3つの戦略

1. バッチ処理によるGPU効率化

def batch_caption(images, batch_size=8):
    captions = []
    for i in range(0, len(images), batch_size):
        batch = images[i:i+batch_size]
        outputs = captioner(batch)
        captions.extend([out['generated_text'] for out in outputs])
    return captions

2. ONNXランタイムによる軽量化

pip install onnxruntime
python -m transformers.onnx --model=nlpconnect/vit-gpt2-image-captioning ./onnx_model/

3. 特徴量キャッシュによる重複計算削減

from functools import lru_cache
import hashlib

@lru_cache(maxsize=500)
def cached_caption(image_path):
    with open(image_path, 'rb') as f:
        key = hashlib.sha256(f.read()).hexdigest()
    return captioner(image_path)[0]['generated_text']

APIサービスとしての展開例(FastAPI)

from fastapi import FastAPI, UploadFile
from PIL import Image
import io

app = FastAPI()

@app.post("/describe")
async def describe_image(file: UploadFile):
    image = Image.open(io.BytesIO(await file.read())).convert("RGB")
    desc = captioner(image)[0]['generated_text']
    return {"description": desc}

実用ユースケース

  • ECサイト:商品画像からSEO向け説明文を自動生成
  • アクセシビリティ:視覚障害者向け音声読み上げシステムとの連携
  • 検索インデックス:画像コンテンツのテキストベース検索を可能に

トラブルシューティング

  • 単語の繰り返しno_repeat_ngram_size=2 を追加
  • 反応が遅い → 入力解像度をsize={"height": 160, "width": 160}に縮小
  • 内容が曖昧 → ビーム数を増やし、length_penalty=1.2で長文を奨励

タグ: ViT gpt2 ImageCaptioning transformers fastapi

7月14日 20:06 投稿