画像からのテキスト抽出 - OCR 技術の仕組みと実装ガイド
OCR 技術の概要 - 画像からテキストを読み取る仕組み
OCR (Optical Character Recognition / 光学文字認識) は、画像内の文字を機械可読なテキストデータに変換する技術です。スキャンした書類のデジタル化、名刺の自動読み取り、街中の看板認識、手書きメモのテキスト化など、幅広い用途で活用されています。
OCR の処理パイプライン:
- 前処理 (Preprocessing): 入力画像のノイズ除去、二値化、傾き補正、コントラスト強調を行い、文字認識の精度を高める準備段階
- テキスト検出 (Text Detection): 画像内のどこにテキストが存在するかを特定する。バウンディングボックスで文字領域を囲む
- 文字分割 (Segmentation): 検出されたテキスト領域を行単位、さらに文字単位に分割する
- 文字認識 (Recognition): 分割された各文字画像をパターンマッチングまたはニューラルネットワークで識別し、対応する文字コードに変換する
- 後処理 (Post-processing): 言語モデルや辞書を使って認識結果を補正する。文脈から誤認識を修正する
現代の OCR は大きく 2 つのアプローチに分かれます。従来型は各文字を個別に認識する「文字単位認識」で、Tesseract がこの代表です。最新の深層学習ベースは、テキスト行全体を一度に認識する「シーケンス認識」で、CRNN (Convolutional Recurrent Neural Network) + CTC (Connectionist Temporal Classification) が主流です。後者は文字分割が不要で、手書き文字や変形フォントへの対応力が格段に高くなっています。
Tesseract OCR - オープンソースの定番エンジン
Tesseract は Google がメンテナンスするオープンソース OCR エンジンで、100 以上の言語に対応しています。バージョン 4.0 以降は LSTM (Long Short-Term Memory) ベースの認識エンジンを搭載し、従来のパターンマッチング方式から大幅に精度が向上しました。
Tesseract の基本的な使い方:
- インストール:
brew install tesseract tesseract-lang(macOS) またはapt install tesseract-ocr tesseract-ocr-jpn(Ubuntu) - コマンドライン実行:
tesseract input.png output -l jpn --oem 1 --psm 6 - OEM (OCR Engine Mode): 0 = Legacy、1 = LSTM、2 = Legacy + LSTM、3 = デフォルト (利用可能な最良のエンジン)
- PSM (Page Segmentation Mode): 3 = 自動ページ分割、6 = 単一テキストブロック、7 = 単一行、13 = 生テキスト (分割なし)
Python からの利用 (pytesseract):
import pytesseract; from PIL import Image; text = pytesseract.image_to_string(Image.open('doc.png'), lang='jpn', config='--oem 1 --psm 6')
Tesseract の日本語認識精度は、印刷物のスキャン画像で 90-95% 程度です。ただし以下の条件で精度が大幅に低下します:
- 解像度が 300dpi 未満の画像 (推奨: 300-600dpi)
- 背景にノイズやテクスチャがある画像
- 斜めに撮影された文書
- 手書き文字 (Tesseract は印刷文字に最適化されている)
- 縦書きテキスト (PSM 5 で対応可能だが精度は低い)
これらの制約を克服するには、適切な前処理と、必要に応じてクラウド API や深層学習モデルへの切り替えを検討してください。
深層学習ベースの OCR - CRNN と Transformer モデル
最新の OCR 技術は深層学習に基づいており、従来の文字単位認識を超えた高精度な認識を実現しています。特に CRNN (Convolutional Recurrent Neural Network) アーキテクチャと、近年台頭している Transformer ベースのモデルが主流です。
CRNN + CTC の仕組み:
- CNN 層: 入力画像から視覚的特徴を抽出する。VGG や ResNet ベースのバックボーンが一般的。テキスト行画像を固定高さにリサイズし、幅方向の特徴シーケンスを生成する
- RNN 層: CNN が出力した特徴シーケンスを双方向 LSTM で処理し、文脈情報を考慮した文字予測を行う。前後の文字の関係性を学習することで、単独では判別困難な文字も正しく認識できる
- CTC デコーダ: RNN の出力から最終的な文字列を生成する。入力と出力の長さが異なる場合でも、アライメントを自動的に学習する。文字分割が不要になる核心技術
Transformer ベースの最新モデル:
- TrOCR (Microsoft): Vision Transformer (ViT) エンコーダ + GPT-2 デコーダの構成。事前学習済みモデルにより、少量のファインチューニングで高精度を達成
- PaddleOCR: Baidu が開発したオープンソース OCR フレームワーク。PP-OCRv4 は軽量ながら高精度で、日本語を含む 80 以上の言語に対応。モバイルデバイスでもリアルタイム動作可能
- EasyOCR: PyTorch ベースの OCR ライブラリ。CRAFT (テキスト検出) + CRNN (認識) の組み合わせで、40 以上の言語をサポート
深層学習 OCR の精度比較 (日本語印刷文書、文字単位正解率):
- Tesseract 4.x LSTM: 92-95%
- PaddleOCR PP-OCRv4: 96-98%
- Google Cloud Vision API: 97-99%
- Azure AI Vision: 96-98%
前処理テクニック - OCR 精度を劇的に向上させる方法
OCR の認識精度は入力画像の品質に大きく依存します。適切な前処理を施すことで、認識率を 10-20 ポイント向上させることが可能です。以下に実践的な前処理テクニックを紹介します。
必須の前処理ステップ:
- グレースケール変換: カラー画像をグレースケールに変換し、処理を単純化する。
cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) - 二値化 (Binarization): 文字を黒、背景を白に明確に分離する。大津の方法 (
cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)) が基本。背景が不均一な場合は適応的二値化 (cv2.adaptiveThreshold) を使用する - ノイズ除去: メディアンフィルタ (
cv2.medianBlur(img, 3)) やガウシアンフィルタでスキャンノイズを除去する。ただし過度なぼかしは文字のエッジを損なうため注意 - 傾き補正 (Deskew): 文書が傾いている場合、ハフ変換やミニマムエリア矩形で傾き角度を検出し、アフィン変換で補正する。1 度以上の傾きは認識精度に大きく影響する
高度な前処理テクニック:
- 解像度の正規化: 入力画像を 300dpi 相当にリサイズする。文字の高さが 30-50 ピクセル程度になるのが理想的
- コントラスト強調: CLAHE (Contrast Limited Adaptive Histogram Equalization) で局所的なコントラストを改善する。薄い文字や影のある領域で効果的
- モルフォロジー演算: 膨張 (Dilation) で文字の切れを補修し、収縮 (Erosion) で文字同士の接触を分離する
- 背景除去: 文書画像の背景パターン (罫線、透かし、テクスチャ) を除去する。周波数フィルタリングや色差分離が有効
前処理の効果測定: 前処理なしの Tesseract で 78% だった認識率が、二値化 + ノイズ除去 + 傾き補正の組み合わせで 94% に向上した事例があります。前処理パイプラインは画像の種類ごとにチューニングが必要です。
クラウド OCR サービスの比較と使い分け
自前で OCR エンジンを構築・運用する代わりに、クラウド OCR サービスを利用する選択肢もあります。高精度な認識モデルがマネージドサービスとして提供され、インフラ管理なしで利用できます。
主要クラウド OCR サービス:
- Google Cloud Vision API: 日本語認識精度が最も高い (97-99%)。手書き文字にも対応。TEXT_DETECTION (テキスト検出) と DOCUMENT_TEXT_DETECTION (文書構造認識) の 2 モードを提供。料金は 1000 リクエストあたり $1.50
- Amazon Textract: 表 (テーブル) やフォームの構造認識に強い。請求書、領収書、身分証明書などの定型文書に特化した API を提供。料金はページあたり $0.0015 (テキスト検出) から $0.015 (テーブル抽出)
- Azure AI Vision (旧 Computer Vision): Read API で印刷・手書きの両方に対応。50 以上の言語をサポート。非同期処理で大量ページの一括処理が可能。料金は 1000 トランザクションあたり $1.00
- Azure Document Intelligence (旧 Form Recognizer): 請求書、レシート、名刺などの事前構築モデルを提供。カスタムモデルのトレーニングも可能
選定の指針:
- 日本語の一般文書 → Google Cloud Vision API (最高精度)
- 表やフォームの構造抽出 → Amazon Textract
- 大量ページの一括処理 → Azure AI Vision (非同期バッチ処理)
- 定型帳票の自動読み取り → Azure Document Intelligence
- コスト最小化 → Tesseract (無料) + 前処理パイプライン
ハイブリッドアプローチとして、まず Tesseract で処理し、信頼度スコアが低い (0.7 未満) 画像のみクラウド API にフォールバックする設計が、コストと精度のバランスに優れています。月間 10 万枚の処理で、全件クラウド API 利用時の 30-40% のコストに抑えられます。
実装パターン - OCR パイプラインの設計と運用
本番環境で OCR システムを運用する際の実装パターンと、精度を継続的に改善するための運用ノウハウを紹介します。
推奨アーキテクチャ (サーバーレス OCR パイプライン):
- 入力層: S3 にアップロードされた画像を EventBridge/S3 イベントで検知し、Lambda を起動する
- 前処理層: Lambda で画像の前処理 (リサイズ、二値化、傾き補正) を実行。OpenCV の Lambda Layer を使用
- 認識層: 前処理済み画像を Textract または Cloud Vision API に送信。大量処理時は SQS キューでスロットリングする
- 後処理層: 認識結果に対して正規表現ベースの補正、辞書照合、フォーマット検証を適用する
- 出力層: 構造化されたテキストデータを DynamoDB に保存し、検索インデックスを更新する
精度改善のための運用テクニック:
- 信頼度スコアの活用: 各文字・単語の認識信頼度を記録し、低信頼度の結果を人間レビューキューに回す
- フィードバックループ: 人間が修正した結果を蓄積し、カスタムモデルのファインチューニングデータとして活用する
- ドメイン辞書: 業界固有の用語辞書を用意し、後処理で認識結果を補正する。医療文書なら医学用語辞書、法律文書なら法律用語辞書を適用
- テンプレートマッチング: 定型帳票 (請求書、申込書) では、フィールドの位置を事前定義し、該当領域のみを切り出して認識する。全体認識より精度が 5-10% 向上する
パフォーマンス指標: 文字単位正解率 (Character Accuracy) 95% 以上、単語単位正解率 (Word Accuracy) 90% 以上を目標とし、月次でモニタリングします。精度が閾値を下回った場合は、入力画像の品質変化や新しい文書タイプの追加を疑い、前処理パイプラインの調整を行います。