CLAUDE LABEN
FORK — Claude Code 2.1.212で/forkの挙動が変わりました。会話を新しいバックグラウンドセッションへ複製し、作業を続けたまま並走できます。従来のセッション内サブエージェントは/subtaskに移りましたLIMITS — WebSearchの呼び出しがセッション単位で既定200回に制限されました。サブエージェントの起動も既定200回が上限で、暴走した検索・委譲のループを止められますMCPBG — 2分を超えるMCPツール呼び出しは自動的にバックグラウンドへ移り、セッションが固まらなくなりました。しきい値はCLAUDE_CODE_MCP_AUTO_BACKGROUND_MSで調整できますPLANFIX — プランモードがtouchやrmといったファイルを変更するBashコマンドを、許可プロンプトもcanUseToolコールバックも通さずに実行してしまう不具合が修正されましたSONNET5 — Claude Sonnet 5は導入価格として入力100万トークンあたり2ドル、出力10ドルで提供中です。8月31日を過ぎると3ドルと15ドルに戻りますIPO — Anthropicが早ければ10月の株式公開を視野に、引受銀行が投資家との面談を組み始めたと報じられていますFORK — Claude Code 2.1.212で/forkの挙動が変わりました。会話を新しいバックグラウンドセッションへ複製し、作業を続けたまま並走できます。従来のセッション内サブエージェントは/subtaskに移りましたLIMITS — WebSearchの呼び出しがセッション単位で既定200回に制限されました。サブエージェントの起動も既定200回が上限で、暴走した検索・委譲のループを止められますMCPBG — 2分を超えるMCPツール呼び出しは自動的にバックグラウンドへ移り、セッションが固まらなくなりました。しきい値はCLAUDE_CODE_MCP_AUTO_BACKGROUND_MSで調整できますPLANFIX — プランモードがtouchやrmといったファイルを変更するBashコマンドを、許可プロンプトもcanUseToolコールバックも通さずに実行してしまう不具合が修正されましたSONNET5 — Claude Sonnet 5は導入価格として入力100万トークンあたり2ドル、出力10ドルで提供中です。8月31日を過ぎると3ドルと15ドルに戻りますIPO — Anthropicが早ければ10月の株式公開を視野に、引受銀行が投資家との面談を組み始めたと報じられています
記事一覧/API & SDK
API & SDK/2026-04-25中級

Claude Vision の認識精度が落ちる本当の原因 — 解像度・トリミング・モデル選択で決まる前処理の設計

Claude Vision で画像認識精度が思うように出ないとき、原因の多くはプロンプトではなく前処理にあります。アプリ開発の現場で見えてきた、解像度・トリミング・モデル選択の実用的なチューニング手順をまとめました。

claude-visionimage-processinganthropic-api3preprocessingocr

「同じ画像なのに、Claude が読み取れる日と読み取れない日がある」——アプリ開発で Vision API を使い始めた頃、この不安定さに頭を悩ませた時期がありました。プロンプトを工夫しても結果が良くならず、最終的に効いたのは 画像そのものの渡し方 だったのです。

公式ドキュメントには「画像は1568px以下に収まる長辺で送ると効率が良い」といった推奨が書かれていますが、現場で詰まる本当の原因はもっと細かいところにあります。ここでは私が壁紙アプリのアートワーク自動タグ付けや、レシートスキャン系のサイドプロジェクトで実際に試行錯誤した結果として見えてきた、Claude Vision の前処理チューニングをお伝えします。

なぜプロンプトより前処理が効くのか

Claude Vision は内部的に画像を一定の解像度に正規化してから処理します。この「正規化」は、私たちが想像するような単純なリサイズではなく、画像のアスペクト比・ノイズ・周囲の余白などを考慮した変換です。つまり 元画像が抱える課題は、プロンプトでは取り戻せない情報損失として処理段階に持ち込まれてしまう のです。

私が壁紙アプリで試したケースで言うと、3,000px × 4,000px の高解像度アートワークを直接送ったときの認識精度より、長辺を1,500pxに事前リサイズしてから送ったほうが、色彩傾向の説明・モチーフの抽出ともに安定していました。理由はシンプルで、Claude 側の正規化アルゴリズムが「圧縮しすぎ」になるか「ちょうど良い」かの境界線が、たまたま1,500〜1,600px付近にあるからです。

公式の推奨値はあくまでガイドラインであり、画像の中身(細部の重要性・テキストの含有量・構図の複雑さ)によって最適値は変わります。

チューニングの起点となる5つのチェックポイント

精度が出ないとき、私はいつも以下の順で原因を切り分けています。

  1. 解像度が高すぎる/低すぎる: 長辺1,200〜1,600pxに収めると安定しやすい。スクリーンショットなど元から低解像度のものは無理に拡大しない
  2. アスペクト比が極端: 縦長すぎる/横長すぎる画像は、認識対象が小さく見えやすい。重要部分だけをクロップする方が精度が出る
  3. ファイル形式の選択ミス: テキストや図表が含まれる画像はPNG、写真や複雑なグラデーションはJPEG(quality 85〜90)
  4. コントラスト不足: 背景と被写体の輝度差が低い画像は、コントラスト調整だけで認識率が大きく変わる
  5. モデル選択のミスマッチ: シンプルなOCRに claude-opus-4-6 を使っていないか。claude-haiku-4-5 で十分なケースも多い

これらは独立した要因に見えますが、実際の現場では複数が絡み合います。次のセクションから、それぞれの実用的な対処法をコード付きで見ていきます。

実用的な前処理コード — Pythonで完結させる

PIL(Pillow)を使った前処理スクリプトです。Claude API に画像を送る前にこれを通すだけで、私の実測では平均20〜30%程度、認識結果の安定性が向上しました。

from PIL import Image, ImageEnhance, ImageOps
import base64
import io
 
def prepare_image_for_claude(
    image_path: str,
    max_long_side: int = 1500,
    enhance_contrast: bool = False,
    output_format: str = "auto",
) -> tuple[str, str]:
    """
    Claude Vision に最適化された画像を返す。
    戻り値: (base64エンコードされた画像データ, MIMEタイプ)
    """
    img = Image.open(image_path)
 
    # EXIF回転を反映(スマホ撮影画像で特に重要)
    img = ImageOps.exif_transpose(img)
 
    # 透明度を持つPNGをJPEG変換するときの背景処理
    if img.mode in ("RGBA", "LA"):
        background = Image.new("RGB", img.size, (255, 255, 255))
        background.paste(img, mask=img.split()[-1])
        img = background
    elif img.mode != "RGB":
        img = img.convert("RGB")
 
    # 解像度の正規化(長辺基準で縮小、拡大はしない)
    long_side = max(img.size)
    if long_side > max_long_side:
        ratio = max_long_side / long_side
        new_size = (int(img.size[0] * ratio), int(img.size[1] * ratio))
        img = img.resize(new_size, Image.LANCZOS)
 
    # コントラスト強調(テキスト・図表が含まれる画像で有効)
    if enhance_contrast:
        enhancer = ImageEnhance.Contrast(img)
        img = enhancer.enhance(1.2)  # 1.0が原画像、1.5を超えると不自然になる
 
    # 出力形式の自動判定
    if output_format == "auto":
        # サイズが小さい・色数が少ない場合はPNG、それ以外はJPEG
        if long_side < 800 or len(img.getcolors(maxcolors=256) or []) > 0:
            output_format = "PNG"
        else:
            output_format = "JPEG"
 
    buffer = io.BytesIO()
    if output_format == "JPEG":
        img.save(buffer, format="JPEG", quality=88, optimize=True)
        mime = "image/jpeg"
    else:
        img.save(buffer, format="PNG", optimize=True)
        mime = "image/png"
 
    encoded = base64.standard_b64encode(buffer.getvalue()).decode("utf-8")
    return encoded, mime
 
# 使用例
image_data, mime_type = prepare_image_for_claude(
    "screenshot.png",
    max_long_side=1500,
    enhance_contrast=True,  # スクリーンショットや図表ならTrueがおすすめ
)
print(f"前処理完了: {mime_type}, データ長 {len(image_data)} bytes")

このスクリプトのポイントは、getcolors() を使った色数判定です。スクリーンショットや図表は色数が少ないことが多く、その場合はPNGの可逆圧縮が向きます。一方、写真は色数が多いため getcolors()None を返し、自動的にJPEGが選ばれます。判定ロジックは単純ですが、人手で形式を選び続けるよりミスが減ります。

API呼び出し側 — メッセージ構造の最適化

前処理を通した画像を Claude に渡すコードです。Anthropic 公式の Python SDK を使った実装例ですが、ここでもいくつか実用的な工夫があります。

import anthropic
 
client = anthropic.Anthropic(api_key="YOUR_ANTHROPIC_API_KEY")
 
def analyze_image_with_claude(
    image_data: str,
    mime_type: str,
    task: str,
    model: str = "claude-haiku-4-5-20251001",
) -> str:
    """
    前処理済み画像をClaude Visionに送って分析結果を得る。
    シンプルな分類・OCRはhaiku、複雑な解析はsonnet/opusを推奨。
    """
    response = client.messages.create(
        model=model,
        max_tokens=1024,
        messages=[
            {
                "role": "user",
                "content": [
                    {
                        "type": "image",
                        "source": {
                            "type": "base64",
                            "media_type": mime_type,
                            "data": image_data,
                        },
                    },
                    {
                        "type": "text",
                        "text": task,
                    },
                ],
            }
        ],
    )
    return response.content[0].text
 
# 使用例: アートワークの色彩傾向を分析
result = analyze_image_with_claude(
    image_data,
    mime_type,
    task="この画像の主要な色彩(3色まで)と、想起される雰囲気を簡潔に説明してください。",
    model="claude-haiku-4-5-20251001",  # 単純な分類タスクならHaikuで十分
)
print(result)

ここで意識しているのは、画像を先、テキスト指示を後 に置くという順序です。Anthropic のドキュメントにも明記されていますが、画像が先のほうが Claude は「これから提示される指示は、この画像についてのものだ」と理解しやすくなります。プロンプトを工夫してもうまくいかなかった人は、まずこの順序を確認してみてください。

モデル選択 — タスクの複雑さで使い分ける

私の運用ルールはシンプルで、以下の表のように使い分けています。

  • claude-haiku-4-5: 単純な物体認識、色彩抽出、低解像度OCR(領収書・名刺など)
  • claude-sonnet-4-6: 構図解析、図表のテキスト+構造抽出、中程度の手書き認識
  • claude-opus-4-6: 複雑な技術図解の解釈、難読手書き、推論を伴うシーン理解

「精度が出ない」と感じたとき、最初に試すべきは「上位モデルに切り替える」ではなく「前処理を見直す」です。前処理が雑なまま claude-opus-4-6 を使っても、コストが増えるだけで精度向上は限定的です。逆に、丁寧に前処理した画像なら claude-haiku-4-5 でも十分に実用的な結果が返ってきます。

これは API 課金にも直結する話です。アプリで Vision を回すなら、まずは Haiku で前処理パターンを確立してから、必要に応じて Sonnet/Opus に切り替える設計をおすすめします。

「こうするとうまくいかない」失敗パターン集

実際に私が踏んだ落とし穴を共有します。同じ轍を踏まないでいただければ嬉しいです。

落とし穴1: 高解像度のまま送る

「高解像度のほうが認識精度が上がるはず」という直感は、Claude Vision では当てはまりません。4K画像をそのまま送ると、内部正規化で過度に圧縮されて細部が失われることがあります。長辺1,500px前後にダウンサンプリングしてから送るのが現実的な落としどころです。

落とし穴2: スクリーンショットをJPEG保存する

UI スクリーンショットや図表をJPEGで保存すると、テキスト周りに圧縮ノイズが乗ります。これはOCR精度を著しく下げる原因になります。テキストを含む画像は必ずPNGで送りましょう。前述のコードでは色数判定で自動的にPNGが選ばれるようにしています。

落とし穴3: EXIF回転情報を無視する

スマートフォンで撮影した画像は、ファイルのピクセル配列とは別にEXIFで「正しい向き」が記録されています。これを無視して読み込むと、Claude は90度回転した画像として処理してしまいます。Pillow の ImageOps.exif_transpose() を必ず通すようにしてください。

落とし穴4: 画像と指示テキストを分離しない

複数の画像を一度に送って「この中から〜を見つけて」と指示すると、Claude は画像同士の対応関係を取り違えることがあります。画像が複数ある場合は、それぞれに「画像1: 〜」「画像2: 〜」とラベル付きの説明テキストを挟むと精度が安定します。

SDK エラーが返ってきたときに見るべき箇所

前処理スクリプト自体に問題がなくても、API 側でエラーが返ってくるケースがあります。よくあるパターンと対応法は以下の通りです。

  • invalid_request_error(画像サイズ超過): 1ファイルあたり5MBが上限。base64エンコード後はさらに増えるため、リサイズかquality調整で対応
  • invalid_request_error(不正なmedia_type): WebP は対応していますが、AVIF や HEIC は事前にPNG/JPEGへ変換が必要
  • overloaded_error(503): 一時的な負荷。Exponential backoff で再試行するか、claude-haiku-4-5 にフォールバック

Tool Use を併用する場合のエラー対応については Claude API Tool Use エラーの完全トラブルシューティングガイド で詳しくまとめています。

さらに学びたい方へ

Vision API を体系的に学ぶなら、まずは Claude Vision マルチモーダル活用ガイド で基本を押さえると効率的です。PDF を扱う場合は Claude API PDF 解析と Vision・Extended Thinking の連携 が参考になります。

Claude/OpenAIどちらにも応用できる前処理の考え方が押さえられます。


精度が出なくて諦めかけていた方も、画像の渡し方を少し見直すだけで結果が変わるはずです。今日まずできることは、PIL を使って手元の画像を1,500px長辺に揃え、PNG/JPEGの選択を見直してみる——それだけです。5分で試せて、効果は次のAPI呼び出しから実感できます。

シェア

お読みいただきありがとうございます

Claude Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

もしこの記事がお役に立ちましたら、チップ(¥150)で応援いただけると大変励みになります。広告なしでの運営を続けるため、皆さまのご支援が大きな力になっています。

関連記事

API & SDK2026-04-28
Claude API × Inngest で耐障害性のある AI ワークフローを本番運用する — リトライ・冪等性・人間承認を組み込んだ実装ガイド
Claude API と Inngest を組み合わせて、リトライ・冪等性・人間承認・ファンアウトを TypeScript の動くコードで実装します。Next.js / Vercel / Cloudflare Workers に乗せられる軽量な耐障害ワークフローの設計指針です。
API & SDK2026-04-28
Claude API のプロンプトをコードとして管理する — レジストリ・バージョニング・A/Bテストの本番運用ガイド
Claude API を本番運用していると必ず直面する「どの prompt が、いつ、誰に、どの version で配信されたか」を解決するためのレジストリ設計と、A/Bテスト・段階的ロールアウト・自動ロールバックまでを実装レベルで解説します。
API & SDK2026-07-14
ユーザーに届くAI生成の短文を、公開前に二段ゲートで止める
アプリでユーザーに配信するAI生成の短文に、決定的ルール層とClaude分類層の二段公開ゲートを組む設計です。fail-closed・生成時検疫・コスト設計まで、実装コード付きで整理しました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →