LESSON 30分

ストーリー

田中VPoE
Step 2では画像AIを業務に活用する方法を学ぶ。まずは画像認識の基礎からだ
あなた
OCRや物体検出ですよね。最近はAPIで簡単に使えると聞きましたが
田中VPoE
その通り。以前は専門的な知識が必要だったが、今はAPIを呼ぶだけで高精度の画像認識が実現できる。ただし、業務に適用するにはAPIの使い分けや前処理の工夫が重要だ
あなた
どのAPIをどんな場面で使うべきか、しっかり学びたいです
田中VPoE
NetShop社で実際に使うシナリオを想定しながら進めよう。商品画像の分類、請求書のOCR、製品の外観検査だ

画像認識の主要タスク

タスクの分類

タスク概要業務での用途
画像分類画像をカテゴリに分類商品カテゴリの自動判定
物体検出画像内のオブジェクトの位置と種類を特定製品の傷検出、在庫カウント
OCR画像内のテキストを読み取り請求書、名刺、看板の文字認識
セグメンテーション画像をピクセル単位で分類商品の背景除去
類似画像検索類似する画像を検索重複商品の検出

OCR(光学文字認識)

OCRの進化

第1世代: ルールベースOCR
  → テンプレートマッチング、定型文書のみ

第2世代: 機械学習ベースOCR(Tesseract等)
  → より柔軟だが精度に限界

第3世代: ディープラーニングOCR(Vision API等)
  → 高精度、多言語対応

第4世代: VLMベースOCR(GPT-4V、Claude Vision等)
  → 文脈理解、レイアウト解析も同時に実行

API別OCR比較

API特徴得意分野コスト
Google Cloud Vision高精度、多言語印刷文字、手書き
AWS Textract表・フォーム対応構造化文書
Azure Document Intelligenceレイアウト解析ビジネス文書
GPT-4V / Claude Vision文脈理解非定型文書
Tesseract(OSS)無料、カスタマイズ可定型文書無料

OCRの実装例

# Google Cloud Vision APIを使ったOCR
from google.cloud import vision

def ocr_with_google_vision(image_path: str) -> dict:
    """Google Cloud Vision APIでOCRを実行"""
    client = vision.ImageAnnotatorClient()

    with open(image_path, "rb") as f:
        content = f.read()

    image = vision.Image(content=content)

    # テキスト検出(文書全体)
    response = client.document_text_detection(image=image)
    document = response.full_text_annotation

    result = {
        "full_text": document.text,
        "pages": [],
        "confidence": 0.0
    }

    for page in document.pages:
        page_data = {"blocks": []}
        for block in page.blocks:
            block_text = ""
            for paragraph in block.paragraphs:
                for word in paragraph.words:
                    word_text = "".join([s.text for s in word.symbols])
                    block_text += word_text + " "
            page_data["blocks"].append({
                "text": block_text.strip(),
                "confidence": block.confidence,
                "bounding_box": [
                    (v.x, v.y) for v in block.bounding_box.vertices
                ]
            })
        result["pages"].append(page_data)

    return result
# VLMを使ったインテリジェントOCR
import anthropic
import base64

def intelligent_ocr(image_path: str, extraction_prompt: str) -> str:
    """Claude Visionで文脈を理解したOCR"""
    client = anthropic.Anthropic()

    with open(image_path, "rb") as f:
        image_data = base64.b64encode(f.read()).decode()

    response = client.messages.create(
        model="claude-sonnet-4-20250514",
        max_tokens=2048,
        messages=[{
            "role": "user",
            "content": [
                {
                    "type": "image",
                    "source": {
                        "type": "base64",
                        "media_type": "image/png",
                        "data": image_data
                    }
                },
                {
                    "type": "text",
                    "text": extraction_prompt
                }
            ]
        }]
    )
    return response.content[0].text

物体検出

主要な物体検出API

# AWS Rekognitionを使った物体検出
import boto3

def detect_objects(image_path: str) -> list[dict]:
    """AWS Rekognitionで物体を検出"""
    client = boto3.client("rekognition")

    with open(image_path, "rb") as f:
        image_bytes = f.read()

    response = client.detect_labels(
        Image={"Bytes": image_bytes},
        MaxLabels=20,
        MinConfidence=70.0
    )

    results = []
    for label in response["Labels"]:
        results.append({
            "name": label["Name"],
            "confidence": label["Confidence"],
            "instances": [
                {
                    "bounding_box": inst["BoundingBox"],
                    "confidence": inst["Confidence"]
                }
                for inst in label.get("Instances", [])
            ]
        })

    return results

画像分類の実装

# VLMを使った商品画像の品質分類
def classify_product_image(image_path: str) -> dict:
    """商品画像を品質分類する"""
    prompt = """この商品画像を以下の基準で評価してください。

評価基準:
- A: 掲載可能(明るさ・構図・背景が適切)
- B: 軽微な修正が必要(色調調整やトリミングで改善可能)
- C: 再撮影が必要(ブレ、暗さ、不適切な背景)

以下のJSON形式で回答してください:
{
  "grade": "A/B/C",
  "issues": ["問題点のリスト"],
  "suggestions": ["改善提案のリスト"],
  "description": "画像の簡潔な説明"
}"""

    return intelligent_ocr(image_path, prompt)

画像認識のベストプラクティス

精度を高めるコツ

テクニック説明効果
画像前処理傾き補正、コントラスト調整OCR精度+10〜20%
複数API併用結果をアンサンブル全体精度+5〜10%
プロンプト設計具体的な出力形式を指定構造化精度向上
信頼度フィルタリング低信頼度結果を除外誤検出の削減
後処理ルール業務ルールでバリデーション業務適合性向上

API選定フローチャート

画像認識タスク
├── テキスト読み取り → OCR
│   ├── 定型文書 → AWS Textract / Azure Document Intelligence
│   ├── 非定型文書 → VLM(GPT-4V / Claude Vision)
│   └── 大量バッチ → Google Cloud Vision
├── 物体検出 → AWS Rekognition / Google Vision
├── 画像分類 → VLM / カスタムモデル
└── 類似検索 → CLIP + ベクトルDB

まとめ

項目内容
OCR文書のテキスト読み取り。定型→Textract、非定型→VLM
物体検出画像内のオブジェクト位置と種類の特定
画像分類VLMを使った柔軟な分類が可能
精度向上前処理 + 複数API併用 + 後処理ルール

チェックリスト

  • OCRの進化(ルールベース → ML → DL → VLM)を理解した
  • 主要なOCR APIの特徴と使い分けを把握した
  • 物体検出と画像分類のAPI実装コードを理解した
  • 精度を高めるためのベストプラクティスを説明できる

推定所要時間: 30分