Document AIで独自OCRモデルをトレーニングしてみた

記事タイトルとURLをコピーする

G-genの福井です。Google Cloud の Document AI を使い、独自 OCR モデルを開発する手順を紹介します。

はじめに

当記事の概要

当記事では、Google Cloud が提供する Document AIカスタム エクストラクタ機能を使用して、買い物のレシートから特定の情報を抽出する独自 OCR モデルを開発します。

買い物レシートからは、以下の項目を抽出します。

  • 店舗名
  • 購入日時
  • 商品名
  • 商品の値段
  • 合計金額

Document AI とは

Document AI は、Google Cloud(旧称 GCP)が提供するドキュメント処理プラットフォームです。スキャンされた書類や PDF ファイルなど、非構造化データから構造化された情報を抽出、分類、分析できます。請求書、領収書、身分証明書など、様々なドキュメントタイプに対応した事前トレーニング済みのモデルが用意されているほか、独自のドキュメントに合わせてモデルをカスタマイズ(カスタム エクストラクタ機能)することも可能です。

Document AI に関する詳細は、以下の記事も参照してください。

blog.g-gen.co.jp

カスタム エクストラクタとは

カスタム エクストラクタは、特定のドキュメントタイプや抽出したい項目に合わせて、ユーザーが独自にトレーニングできる Document AI の機能です。事前トレーニング済みモデルでは対応できない、独自の帳票や特定のレイアウトを持つドキュメントからの情報抽出を実現します。

カスタム エクストラクタには、主に以下の 2 種類があります。

基盤モデル(生成 AI)

  • 抽出したいフィールドを定義するだけで、大規模言語モデル(LLM)が自動的に情報を抽出するため、アノテーション作業は基本的に不要です。
  • より柔軟なドキュメント形式に対応できますが、精度はドキュメントの質やフィールドの定義に依存します。
  • 0〜50 件以上のドキュメントでモデルが作成できます。

カスタムモデル

  • 抽出したいテキストの箇所と、それに対応するラベル(例 : 「店名」「合計金額」)を手動でアノテーション(教師付け)してモデルをトレーニングします。
  • 生成 AI を使用せずに、固有のドキュメントに沿った独自のモデルを構築できます。
  • 10〜100件以上のドキュメントでモデルが作成できます。

 
今回は、基盤モデル(生成 AI) のカスタム エクストラクタを作成します。

事前準備

サンプルレシート画像の準備

基盤モデル(生成 AI)のトレーニングとテストに使用するレシート画像を準備します。今回は、レシートを 10枚程度用意し、スキャンまたは写真で撮影して JPEG 形式で保存します。

今回準備した画像ファイルは、トレーニング用とテスト用にフォルダを分けて管理します。 フォルダを分けずに管理した場合でも、ドキュメントをインポートする際に、Document AI の機能でトレーニング用とテスト用に自動分割することが可能です

カスタム エクストラクタの作成

プロセッサの作成

Google Cloud コンソールの Document AI 画面で、[カスタム プロセッサ] > [Custom Extractor] の [プロセッサを作成] を選択します。

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 からドキュメントをインポートする] を選択
  • 転送元のパス : 事前準備でトレーニング用のサンプルレシート画像を格納したフォルダを指定
  • データ分割 : トレーニング

ドキュメントのインポート

アノテーション作業

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

ラベル付けを開始を選択

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

生成AIがラベル付けしたドキュメント

アノテーションが正しくない場合は、手動での調整が可能です。 今回の場合、以下の項目が正しくないため手動で調整します。

項目名 現状の値 期待値
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の魅力を味わいながら日々精進