SQL1つでレシート画像から商品名や金額をBigQueryのテーブルに出力する

2024/01/18に公開4

はじめに

こんにちは、クラウドエース データML ディビジョン所属の永山です。
クラウドエースのITエンジニアリングを担うシステム開発部の中で、特にデータ基盤構築・分析基盤構築からデータ分析までを含む一貫したデータ課題の解決を専門とするのがデータML ディビジョンになります。

データML ディビジョンでは活動の一環として、毎週Google Cloud の新規リリースを調査・発表し、データ領域のプロダクトのキャッチアップをしています。その中でも重要と考えるリリースを本ページ含め記事として公開しています。

本記事で紹介する内容

概要

今回紹介するリリースは、「BigQuery上に作成したオブジェクトテーブルのドキュメント処理」についてのプレビュー機能になります。

本プレビュー機能を使用するために必要な、大まかなステップは以下になります。

  1. Cloud Storageにドキュメントを保存するバケットを作成、ドキュメントをアップロード
  2. BigQueryで、1で作成したバケットと紐づくオブジェクトテーブルを作成
  3. BigQueryで、Document AIのAPIを用いるリモートモデルを作成
  4. 3で作成したリモートモデルを ML.PROCESS_DOCUMENT 関数にセットし、2で作成したオブジェクトテーブルに対して、ドキュメント処理を実行

本記事では、Cloud Storageのバケットに保存したレシートの画像から、BigQueryの ML.PROCESS_DOCUMENT 関数を用いてドキュメントを抽出し、買った商品や金額をBigQueryのテーブルに抽出する機能を検証いたしました。

メリットとユースケース

  • メリット
    SQLを1つ実行するだけで、Document AIのプロセッサを用いてCloud Storageのバケットに保存したドキュメントの内容を抽出し、テーブルに出力することができる点

  • ユースケース
    請求書や領収書などのデータをBigQuery に保存する。

各用語の説明

以下に各用語の説明を記載いたします。特に必要のない方はこのセクションを読み飛ばしてください。

  • Cloud Storage

    • Cloud Storage[1]は、大規模なデータを保存、取得、管理するためのスケーラブルなオブジェクトストレージサービスです。以下のような特徴がございます。
      • 任意の量のデータを保存でき、データはいつでもどこからでもアクセス可能です。
      • 静的コンテンツの配信、バックアップと復元、アーカイブ、大規模な分析、機械学習など、さまざまな用途に利用できます。
      • データの耐久性と可用性を高めるための機能を提供し、データは自動的に複数の地域に複製されます。
      • データのセキュリティを確保するための強力な機能も提供しており、データは転送中も保存中も暗号化されます。
  • BigQuery

    • BigQuery[2]は、ペタバイト規模のデータ分析を可能にするフルマネージド型のエンタープライズデータウェアハウスです。以下のような特徴がございます。
      • フルマネージド型のデータウェアハウスであるため、インフラストラクチャの構成等を気にすることなく、SQLクエリを使用してデータを探索し、分析することができます。
      • BigQuery MLを使用すれば、SQLを使った機械学習モデルの作成や結果の予測も行うことができます。
  • BigQuery ML

    • BigQuery ML[3]は、BigQuery内で直接機械学習モデルを作成、訓練、評価、予測することができる機能です。以下のような特徴がございます。
      • SQLクエリを使用して学習モデルの訓練や結果の予測などを実行できるため、複雑なプログラミングや機械学習の専門知識がなくても、ユーザーは自分のデータから洞察を得ることができます。
      • 線形回帰、二項ロジスティック回帰、k平均クラスタリングなど、さまざまな機械学習モデルをサポートしています。これにより、ユーザーは自分のビジネスデータを活用して、予測分析、顧客セグメンテーション、異常検出などのタスクを効率的に行うことができます。
  • Document AI

    • Document AI[4]は、Googleの強力な機械学習と自然言語処理技術を活用して、ドキュメントから重要な情報を抽出、理解、分類するためのツールです。以下のような特徴がございます。
      • PDF、スキャンされたドキュメント、画像など、さまざまな形式のドキュメントを処理することができます。
      • カスタムモデルを作成して特定のドキュメントの処理に対応することも可能です。これにより、企業はドキュメントからの情報抽出プロセスを自動化できるため、より迅速かつ正確な意思決定を支援することができます。
  • リモートモデル

    • リモートモデル[5]は、クラウド上で訓練された機械学習モデルをアプリケーションに統合するための機能です。以下のような特徴がございます。
      • Google CloudのAutoMLやTensorFlow、Document AIなどで訓練されたモデルをサポートしています。
      • 画像認識、自然言語処理、予測分析など、様々なタスクに使用することができます。リモートモデルを使用することで、ユーザーは自分のアプリケーションに機械学習の能力を追加することができます。
  • ML.PROCESS_DOCUMENT関数

    • ML.PROCESS_DOCUMENT関数[6]は、Document AIを使用して、さまざまな形式のドキュメントから重要な情報を抽出するためのBigQuery関数です。以下のような特徴がございます。
      • BigQueryのSQLクエリ内で直接使用することができ、結果はBigQueryのテーブルに保存され、後で分析やレポート作成に使用することができます。
      • PDF、JPEG、PNG、GIF、TIFFなどのファイル形式をサポートしています。
      • ドキュメントからテキストを抽出し、そのテキストの構造と意味を理解することができます。これにより、ユーザーは手動でのデータ入力とエラーの可能性を減らすことができます。
  • オブジェクトテーブル

    • オブジェクトテーブル[7]は、BigQueryの機能で、非構造化データや半構造化データを扱うためのものです。以下のような特徴がございます。
      • BigQueryのSQLクエリを使用してデータを操作することができ、結果はBigQueryのテーブルに保存され、後で分析やレポート作成に使用することができます。
      • JSONやARRAYなどのデータ型をサポートしており、これらのデータ型を使用して、ネストされたデータや複数の値を持つデータを表現することができます。これにより、ユーザーは複雑なデータ構造を扱うことができ、より詳細な分析を行うことが可能になります。

検証

目的

BigQueryのオブジェクトテーブルに対して、ML.PROCESS_DOCUMENT関数を用いてドキュメントの内容をテーブルに出力する機能を検証することが目的になります。

検証内容

BigQueryの ML.PROCESS_DOCUMENT 関数を用いて、Cloud Storageのバケットに保存したレシートの画像から買った商品や金額を抽出し、BigQueryのテーブルに結果を出力する機能を検証いたします。

前準備

  • Google Cloud プロジェクトに対して課金を有効化します。
  • BigQuery API と BigQuery Connection API を有効します。
  • Document AI APIを有効化します。

Cloud Storage (GCS)のバケットにレシート画像を保存

  • GCS上で画像を保存する任意のバケットを作成します。
    今回はバケット receipt-raw を作成します。

    • バケットの「作成」をクリック
      Alt text
    • バケット名を receipt-rawに設定
      Alt text
    • 任意の保存場所を設定し、作成をクリック
      ※今回は保存場所をリージョンの us-west1 に設定いたしました。
      Alt text
  • receipt-rawバケットに、任意のレシート画像をアップロードします。
    今回はアメリカと日本のレシートを準備いたしました。
    ※店名や特定の商品名がわかる箇所はマスクしました。
    Alt text

    • 日本のレシート (jp_sample.png)
      Alt text

    • アメリカのレシート (us_sample.png)
      Alt text

    ※今回用いるDocument AIのプロセッサは以下の形式に対応しております。いずれかの形式のファイルをアップロードしてください。

    • JPEG, JPG, PNG, BMP, PDF, TIFF, TIF, GIF

BigQueryで、作成したバケットと紐づくオブジェクトテーブルを作成

作成したバケットと紐づくオブジェクトテーブルを作成するために、以下の2点を実行します。

  1. テーブルと外部データを接続するコネクションを作成
  2. 作成したコネクションとバケットを指定して、オブジェクトテーブルを作成

BigQueryで外部データソースへの接続を作成

  • BigQueryのエクスプローラ - 追加をクリック
    Alt text
  • 外部データソースへの接続をクリック
    Alt text
  • 接続タイプは Vertex AI remote models, remote functions and BigLake (Cloud Resource) を設定
    Alt text
  • 任意の接続ID、マルチリージョンを指定して「接続を作成」をクリック
    今回は接続ID receipt_connection 、マルチリージョン US を指定して接続を作成いたしました。
    ※現在、マルチリージョン USまたはEUのみDocument AIのプロセッサーで利用できるため、接続もマルチリージョンに設定する必要がございます。
    Alt text
  • 外部接続より、作成したコネクション us.receipt_connection を開く
    Alt text
  • 接続 receipt_connection のサービスアカウントIDをコピーします。
    ※外部データソースへの接続を作成した際に自動で生成されるサービスアカウントIDになります。
    Alt text
  • IAMに移動し、「アクセス権を付与」をクリック
    Alt text
  • 「新しいプリンシパル」にコピーしたサービスアカウントIDを貼り付け、以下のロールを設定して保存をクリック
    • Document AI 閲覧者
    • Storage オブジェクト閲覧者
      Alt text
  • コピーしたサービスアカウントIDにロールが付与されたことを確認
    Alt text

BigQueryでオブジェクトテーブルを作成

  • 「データセットを作成」をクリック
    Alt text
  • 任意のデータセットID、マルチリージョンに設定し、「データセットを作成」をクリック
    今回はデータセットID receipt 、マルチリージョン US に設定し、データセットを作成いたしました。
    ※現在、マルチリージョン USまたはEUのみDocument AIのプロセッサーで利用できるため、データセットもマルチリージョンに設定する必要がございます。
    Alt text
  • 以下のSQLを実行して、データセット receipt に任意のオブジェクトテーブルを作成
    今回はオブジェクトテーブル sample_images を作成しました。
    ※以降、本記事の全てのSQLは、BigQueryのクエリエディタで実行してください。
    • CONNECTIONには us.receipt_connection を指定
    • urisにはバケット receipt-raw にアップロードしたオブジェクトのURI gs://receipt-raw/* を指定
CREATE EXTERNAL TABLE `receipt.sample_images`
WITH CONNECTION `us.receipt_connection`
OPTIONS(
  object_metadata = 'SIMPLE',
  uris = ['gs://receipt-raw/*']
);

BigQueryで、Document AIのAPIを用いるリモートモデルを作成

Document AIのAPIを用いるリモートモデルをBigQuery上に作成するために、以下の2点を実行します。

  1. Document AIで使用したいプロセッサを作成
  2. BigQueryで、1で作成したDocument AIのプロセッサのモデルを作成

Document AIで、使用したいプロセッサを作成

  • Document AIのプロセッサ ギャラリーをクリック。
  • 今回はレシート画像を読み込みたいため、プロセッサ Expense Parser の「プロセッサを作成」をクリック
    Alt text
  • 任意のプロセッサ名、リージョンを設定し、「作成」をクリック
    今回はプロセッサ名 receipt_parser、リージョン USに設定し、プロセッサを作成しました。
    ※現在、マルチリージョン USまたはEUのみDocument AIのプロセッサーで利用できます。
    Alt text
  • マイプロセッサをクリック、作成した receipt_parser をクリック
    Alt text
  • 「バージョンの管理」タブをクリック
    Alt text
  • バージョンID pretrained-expense-v1.3-2022-07-15 の「詳細を表示」をクリックし、予測エンドポイントの「URLをコピー」をクリック
    コピーしたURLは、以下のような文字列になります。
    https://us-documentai.googleapis.com/v1/projects/{project_number}/locations/{processor_location}/processors/{processor_id}/processorVersions/{version_id}:process
    Alt text
    Alt text

Document AIで作成したプロセッサを用いて、BigQueryでモデルを作成

  • 以下のSQLを実行して、Document AIで作成したプロセッサを用いてデータセット receipt に任意のモデルを作成します。
    今回は、モデル receipt_parser を作成いたしました。
    myproject の部分は、各環境のプロジェクト名に変更してください。

    • CONNECTION にはmyproject.us.receipt_connectionを指定
    • document_processorには、以下のように前セクションでコピーしたURLのprojectsから:processの手前までの文字列を指定
      document_processor='projects/{project_number}/locations/{processor_location}/processors/{processor_id}/processorVersions/{version_id}'
      project_number, processor_location,processor_id,version_idの部分は、コピーしたURLの情報に置き換えてください。
CREATE OR REPLACE MODEL
`myproject.receipt.receipt_parser`
REMOTE WITH CONNECTION `myproject.us.receipt_connection`
OPTIONS (remote_service_type = 'cloud_ai_document_v1',
        document_processor='projects/{project_number}/locations/{processor_location}/processors/{processor_id}/processorVersions/{version_id}'
        );

BigQueryで、レシート画像から要素を抽出、テーブル作成

  • 以下のSQLを実行し、レシートから商品名や値段・合計金額などを、データセット receipt の任意のテーブルに出力します。
    今回はテーブル sample に出力しました。
    ML.PROCESS_DOCUMENT関数内において、以下を指定

    • MODEL: 作成したモデル receipt.receipt_parser
    • TABLE: 作成したオブジェクトテーブル receipt.sample_images
    CREATE OR REPLACE TABLE receipt.sample as (
      SELECT *
      FROM ML.PROCESS_DOCUMENT(
        MODEL `receipt.receipt_parser`,
        TABLE `receipt.sample_images`
      )
    );
    
  • 以下のSQLを実行し、出力したテーブル sample に格納された各カラムの値を確認

    select
      total_amount,
      total_tax_amount,
      supplier_name,
      supplier_address,
      line_item
    from receipt.sample
    

    カラム line_item.description において、いくつか抽出できていない商品名(null)などがありますが、各商品名と値段や消費税額、合計金額等がSQL1つで簡単にテーブルに抽出できるようになります。

    • アメリカのレシートの場合

Alt text
Alt text

  • 日本のレシートの場合
    (アメリカのレシートよりも抽出精度は落ちる印象)

Alt text
Alt text

主にかかる費用(Document AIのExpense Parser)

  • プロセッサ Expense parser の費用[8]は以下になります。

    • ドキュメントの 10 ページにつき $0.10

    料金例

    • 1~10 ページのドキュメントのパースにかかる費用は $0.10 です。
    • 11~20 ページのドキュメントのパースにかかる費用は $0.20 です。
    • 91~100 ページのドキュメントのパースにかかる費用は $1.00 です。

    月にレシートを100枚読み込む場合、以下のような計算になります。

    • レシート1枚(1ドキュメント)ずつ読み込むと$10.0 / 月
    • レシート100枚を1ドキュメント100ページにして読み込むと$1.0 / 月

終わりに

BigQueryのオブジェクトテーブルとDocument AIのプロセッサを組み合わせることで、SQL1つでレシート画像の内容をテーブルに出力することができました。

デフォルトのプロセッサでは、うまく抽出できていない商品名や金額が見受けられましたが、
プロセッサの抽出の精度はfine tuningできるようです[9]
本記事ではプロセッサ抽出精度の向上は範囲外になりますので、ご紹介まで。

本記事の機能がGAになりましたら、プロセッサのfine tuningを行ってレシートの抽出精度を上げ、本格的に家計簿をBigQueryでまとめてみたいと思います!

脚注
  1. https://cloud.google.com/storage?hl=ja ↩︎

  2. https://cloud.google.com/bigquery?hl=ja ↩︎

  3. https://cloud.google.com/bigquery/docs/bqml-introduction?hl=ja ↩︎

  4. https://cloud.google.com/document-ai?hl=ja ↩︎

  5. https://cloud.google.com/bigquery/docs/bigquery-ml-remote-model-tutorial?hl=ja ↩︎

  6. https://cloud.google.com/bigquery/docs/process-document?hl=ja ↩︎

  7. https://cloud.google.com/bigquery/docs/object-table-introduction?hl=ja ↩︎

  8. https://cloud.google.com/document-ai/pricing ↩︎

  9. https://cloud.google.com/document-ai/docs/workbench/cde-with-genai#fine_tune_and_train_by_document_type ↩︎

Discussion

ashitaniashitani

記事ありがとうございます。すみません。1個教えてください。
Document AI のCustom ExtractorとCustom classfierを組みわ合わせて
例えば、このレシートの①経費タイプ、②金額、③日時をBigquery上に1つのテーブルに表示させることはできたりしますか?

クラウドエース株式会社クラウドエース株式会社

ashitani 様

この度は、コメントをくださりありがとうございます。

実際に試したものではありませんが、以下のような流れで実装は可能かと存じます。

・Custom ExtractorとCustom classfierを、それぞれ任意のカラムが出力されるように学習
・BigQueryでそれぞれのリモートモデルを構築
・Custom classfierのリモートモデルをwith句で読み込んでドキュメントから①経費タイプを取得
・Custom Extractorのリモートモデルを用いて、ドキュメントから②金額、③日時を取得し、with句の情報(①経費タイプ)をjoinする

参考になりましたら幸いでございます。

ashitaniashitani

迅速なコメントありがとうございます。
現在、Google driveに保存している請求書をDocument AIを使用して読み取り
読取り結果をGoogle spreadsheetに出力するプログラムをGASを使用して
取り組んでいるのですが、思う様に進まない状態です。
もし機会がございましたら、解説記事を掲載して頂けますと大変ありがたいです。

クラウドエース株式会社クラウドエース株式会社

ashitani 様

返信が遅くなり大変申し訳ございませんでした。
ご要望のテーマに関する記事について、社内で検討いたしました。
公開時期は明言できかねますが、いただいたご要望に関するテーマについて記事作成を進める意向です。
貴重なご提案をくださり、誠にありがとうございます。