ストーリー
田
田中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併用 + 後処理ルール |
チェックリスト
推定所要時間: 30分