G-genの福井です。Google Cloud の Document AI を使い、独自 OCR モデルを開発する手順を紹介します。
はじめに
当記事の概要
当記事では、Google Cloud が提供する Document AI のカスタム エクストラクタ機能を使用して、買い物のレシートから特定の情報を抽出する独自 OCR モデルを開発します。
買い物レシートからは、以下の項目を抽出します。
- 店舗名
- 購入日時
- 商品名
- 商品の値段
- 合計金額
Document AI とは
Document AI は、Google Cloud(旧称 GCP)が提供するドキュメント処理プラットフォームです。スキャンされた書類や PDF ファイルなど、非構造化データから構造化された情報を抽出、分類、分析できます。請求書、領収書、身分証明書など、様々なドキュメントタイプに対応した事前トレーニング済みのモデルが用意されているほか、独自のドキュメントに合わせてモデルをカスタマイズ(カスタム エクストラクタ機能)することも可能です。
Document AI に関する詳細は、以下の記事も参照してください。
カスタム エクストラクタとは
カスタム エクストラクタは、特定のドキュメントタイプや抽出したい項目に合わせて、ユーザーが独自にトレーニングできる Document AI の機能です。事前トレーニング済みモデルでは対応できない、独自の帳票や特定のレイアウトを持つドキュメントからの情報抽出を実現します。
カスタム エクストラクタには、主に以下の 2 種類があります。
基盤モデル(生成 AI)
- 抽出したいフィールドを定義するだけで、大規模言語モデル(LLM)が自動的に情報を抽出するため、アノテーション作業は基本的に不要です。
- より柔軟なドキュメント形式に対応できますが、精度はドキュメントの質やフィールドの定義に依存します。
- 0〜50 件以上のドキュメントでモデルが作成できます。
カスタムモデル
- 抽出したいテキストの箇所と、それに対応するラベル(例 : 「店名」「合計金額」)を手動でアノテーション(教師付け)してモデルをトレーニングします。
- 生成 AI を使用せずに、固有のドキュメントに沿った独自のモデルを構築できます。
- 10〜100件以上のドキュメントでモデルが作成できます。
今回は、基盤モデル(生成 AI) のカスタム エクストラクタを作成します。
事前準備
サンプルレシート画像の準備
基盤モデル(生成 AI)のトレーニングとテストに使用するレシート画像を準備します。今回は、レシートを 10枚程度用意し、スキャンまたは写真で撮影して JPEG 形式で保存します。
今回準備した画像ファイルは、トレーニング用とテスト用にフォルダを分けて管理します。 フォルダを分けずに管理した場合でも、ドキュメントをインポートする際に、Document AI の機能でトレーニング用とテスト用に自動分割することが可能です
- 参考 : サポートされているファイル
カスタム エクストラクタの作成
プロセッサの作成
Google Cloud コンソールの Document AI 画面で、[カスタム プロセッサ] > [Custom Extractor] の [プロセッサを作成] を選択します。

プロセッサ名に AICustomExtractor
と入力し、[作成]を選択します。

ラベルの定義
抽出したい情報を示す「ラベル」を定義するため、プロセッサの画面で [開始] > [フィールドを新規作成] を選択します。


以下の項目を順番に追加します。
名前 | 親ラベル | データ型 | オカレンス | 説明 |
---|---|---|---|---|
shop_name | No | 書式なしテキスト | 必須の1回 | 店舗名 |
purchase_datetime | No | 日時 | 必須の1回 | 購入日時 |
total_amount | No | 通貨 | 必須の1回 | 合計金額 |
item | Yes | - | 必須の複数回 | 商品 |
作成した [item] フィールドの [子を追加 フィールド] を選択し、以下の項目を順番に追加します。
名前 | 親ラベル | データ型 | オカレンス | 説明 |
---|---|---|---|---|
name | No | 書式なしテキスト | オプションの1回 | 商品名 |
price | No | 通貨 | 必須の1回 | 商品の値段 |

データセットの準備とインポート
トレーニング用のドキュメントを取り込むため、プロセッサの画面で [ビルド] > [ドキュメントのインポート] を選択します。

以下を選択し、[インポート] を選択します。
- [Google Cloud Storage からドキュメントをインポートする] を選択
- 転送元のパス : 事前準備でトレーニング用のサンプルレシート画像を格納したフォルダを指定
- データ分割 : トレーニング

アノテーション作業
定義したラベルを、実際のドキュメント上のテキストに対応付ける作業(アノテーション)するため、プロセッサの画面で [ビルド] > [ラベル付けを開始] を選択します。

定義したラベルが、トレーニング用ドキュメントのテキストに対応付けされた状態で表示されます。

アノテーションが正しくない場合は、手動での調整が可能です。 今回の場合、以下の項目が正しくないため手動で調整します。
項目名 | 現状の値 | 期待値 |
---|---|---|
shop_name | デランシー・ケータリング | 東京ディズニーシー デランシー・ケータリング |
price(一例) | ¥2,500軽 | 2,500 |
total_amount | ¥2,750 | 2,700 |
アノテーションを手動で調整する場合は、レシート画像の紫色の BOX を選択し、図形描画の拡大・縮小の操作で、期待値となるよう紫色の BOX を変更します。変更が完了した後に、[CONFIRM] を選択します。


すべてのアノテーション調整が完了した後、[ラベル付きとしてマーク] を選択します。

ラベル付きとしてマークすることで、ドキュメントに対するアノテーションが確定します。アノテーションを確定させると次のドキュメントに切り替わるため、トレーニング用ドキュメントに対して、この確認と調整を繰り返します。

デプロイ・テスト
基盤モデルの新しいバージョンを作成
学習させたモデルの新しいバージョンを作成するため、プロセッサの画面で [ビルド] > [基盤モデルを呼び出す] の [新しいバージョンを作成] を選択します。

バージョン名、ベースのバージョンを選択し、[作成] を選択します。

デプロイ
作成したバージョンを使用するため、プロセッサの画面で [デプロイと使用] > [作成したバージョン] の [︙] の [バージョンをデプロイ] を選択します。

[デプロイ] を選択します。

テスト
作成したバージョンのテストするため、プロセッサの画面で [評価とテスト] > [バージョン] から作成したバージョンを選択します。

[テスト ドキュメントをアップロード] からテスト対象のドキュメントを選択します。

期待通りの結果が取得できました。

API 呼び出し
作成したモデルは、Document AI の API 経由で利用できます。ここでは、curl
コマンドを用いて API を呼び出し、レシート画像の推論を実行します。結果は JSON 形式で返却されるため、自社システムへの組み込みも容易です。
以降に記述するコマンドは、Cloud Shell で実行します。実際に試す際は、ご自身の環境に合わせてコマンドを適宜変更してください。
OCR 対象とするドキュメントを Base64 文字列にエンコードします。
base64 -w 0 my_document.jpg > encoded_content.txt
API に送信するリクエストの内容を記述した JSON ファイルを作成します。
以下の内容を request.json
に記述します。 mimeType
は処理するファイルの種類に合わせてください。 content
には、一つ前の手順で生成した Base64 文字列を貼り付けます。
{ "skipHumanReview": true, "rawDocument": { "mimeType": "image/jpeg", "content": "ここに encoded_content.txt の中身を全て貼り付けてください" } }
curl
コマンドを実行して Document AI API を呼び出します。
# ご自身のプロジェクト ID に置き換えてください PROJECT_ID="YOUR_PROJECT_ID" # プロセッサがデプロイされているリージョン(例: us, eu)に置き換えてください LOCATION="us" # 使用するプロセッサの ID に置き換えてください PROCESSOR_ID="YOUR_PROCESSOR_ID" # API エンドポイント URL を組み立て API_ENDPOINT="https://${LOCATION}-documentai.googleapis.com/v1/projects/${PROJECT_ID}/locations/${LOCATION}/processors/${PROCESSOR_ID}:process" # Document AI API を呼び出し curl -X POST \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ -H "Content-Type: application/json; charset=utf-8" \ -d @request.json \ "${API_ENDPOINT}"
API 呼び出しの結果を一部抜粋して記載します。
{ "type": "item", "confidence": 1, "id": "10", "properties": [ { "textAnchor": { "textSegments": [ { "startIndex": "193", "endIndex": "203" } ] }, "type": "name", "mentionText": "カチューシャ フリー", "confidence": 1, "pageAnchor": { "pageRefs": [ { "boundingPoly": { "normalizedVertices": [ { "x": 0.3859127, "y": 0.33556548 }, { "x": 0.48214287, "y": 0.33556548 }, { "x": 0.48214287, "y": 0.35069445 }, { "x": 0.3859127, "y": 0.35069445 } ] } } ] }, "id": "11" }, { "textAnchor": { "textSegments": [ { "startIndex": "205", "endIndex": "210" } ] }, "type": "price", "mentionText": "1,900", "confidence": 1, "pageAnchor": { "pageRefs": [ { "boundingPoly": { "normalizedVertices": [ { "x": 0.58928573, "y": 0.34573412 }, { "x": 0.6362434, "y": 0.34573412 }, { "x": 0.6362434, "y": 0.35912699 }, { "x": 0.58928573, "y": 0.35912699 } ] } } ] }, "id": "12" } ] }
福井 達也(記事一覧)
カスタマーサクセス課 エンジニア
2024年2月 G-gen JOIN
元はアプリケーションエンジニア(インフラはAWS)として、PM/PL・上流工程を担当。G-genのGoogle Cloudへの熱量、Google Cloudの魅力を味わいながら日々精進