Cloud Vision APIを使ってPDFファイルからテキストを抽出してみる

2022.03.02

Google Cloud Platformで利用できるVision AIというサービスは、機械学習を使用した画像認識が行えます。

AutoML Visionという独自のカスタム機械学習モデルのトレーニングを自動化できるプロダクトと、Vision APIという事前トレーニング済み機械学習モデルが使われた画像分析をREST API や RPC APIで行えるプロダクトがあります。

PDFの中身を読み取ってテキストデータを取得するということをやる機会があるので、Vision APIを使用してどこまで読み取りができるのか確認していきたいと思います。

Vision APIは画像からテキストを検出、抽出できるのですが、

TEXT_DETECTIONDOCUMENT_TEXT_DETECTIONという2つの光学式文字認識(OCR)をサポートするアノテーション機能があります。

DOCUMENT_TEXT_DETECTIONは、

高密度のテキストやドキュメントに応じてレスポンスが最適化され、ページ、ブロック、段落、単語、改行の情報が JSON に含まれます。

ということができる機能で、手書き入力の抽出とファイル(PDF/TIFF)からのテキスト抽出はこちらを使う必要があるようです。

Doc: ファイル内のテキストを検出する(PDF/TIFF)

準備

まず前提として、Google Cloudのアカウントプロジェクトの作成 が必要ですので用意しておきます。

その上で、

が必要です。

サービスアカウントの作成※1

Cloud Console で [サービス アカウントの作成] ページに移動します。このページで対象のプロジェクトを選択しましょう。

サービス アカウント名とサービス アカウントの説明を入力して続行します。

Vision API 自体にはサービス アカウントが必要ですが、使用するロールを作成する必要はありません。

と説明があり、省略することも可能です。

ただし、今回使用するAPIでは

出力のために指定する Cloud Storage バケットへのアクセス権(roles/editor または roles/storage.objectCreator 以上の役割)が付与されている必要

なので、

上記のように編集者ロールを付与しておきます。

ユーザーにこのサービス アカウントへのアクセスを許可 も省略可能です。 今回は必要ありませんので省略して完了をクリックします。

サービスアカウントキーの作成※2

サービスアカウントを作成後、作成したサービスアカウントのメールアドレスをクリックします。

鍵を追加のボックスにある新しい鍵を作成をクリックします

キータイプは推奨のJSONにし、作成します。

秘密鍵がパソコンに保存されました というダイアログと共に、JSONキーファイルがパソコンにダウンロードされます。

JSONキーファイルの保存場所は適時変更します。

最後に、 GOOGLE_APPLICATION_CREDENTIALS という環境変数にJSONキーファイルのパスを設定します。

(MAC, Linux)

export GOOGLE_APPLICATION_CREDENTIALS="KEY_PATH"

(Win)

set GOOGLE_APPLICATION_CREDENTIALS=KEY_PATH
$env:GOOGLE_APPLICATION_CREDENTIALS="KEY_PATH"

KEY_PATH をサービス アカウント キーが含まれる JSON ファイルのパスに置き換えます

Vision APIを実行してみる

Cloud Storage に保存されているファイルにしか実行できないようなので、抽出したいPDFファイルはあらかじめアップロードしておきます

PDFからテキストを抽出する場合、

  • files:asyncBatchAnnotateという関数を使用してリクエストする(非同期で処理される)
    • サービスアカウントによる認証を行う
      • 出力のために指定するCloud Storageバケットへのアクセス権(roles/editor または roles/storage.objectCreator 以上の役割)が付与されている

必要があります。

Method: files.asyncBatchAnnotate

Pythonのサンプルで実行

RESTやコマンドラインでの実行サンプルにいろんな言語で実行できるサンプルコードがあるので、これを使って実行してみます。

ライブラリのインストール

pip install google-cloud-storage
pip install --upgrade google-cloud-vision

実行結果

def async_detect_document(gcs_source_uri, gcs_destination_uri):
    """OCR with PDF/TIFF as source files on GCS"""
    import json
    import re
    from google.cloud import vision
    from google.cloud import storage

~~~~~~~省略~~~~~~~

source_uri = 'gs://<<バケット名>>/<<ファイルパス>>'
destination_uri = 'gs://<<バケット名>>/<<出力先のパス>>/'

async_detect_document(source_uri, destination_uri)

サンプルコードに書かれていた関数を上記のように実行してみました。

上記の請求書を読み取るように指定した結果、

gcs_destination_uri に指定したパスに結果のjsonファイルが格納され,読み取れたテキストが出力されます。

読み取った内容のフォーマットですが、

{
  "pages": [
    {
      object (Page)
    }
  ],
  "text": string
}

pages[]はOCRで検出されたページの一覧、textはページで検出されたUTF-8テキスト  が格納されます。

TextAnnotation のページに詳しく記載されています。

jsonの中身の例)

かなりの読み取り精度だと思います。

pagesオブジェクトの中をより深く探索していくと、読み取ったブロックの情報も格納されているので、

その内容を使って読み取った箇所を線で囲ってみる

というのも試していこうと思います。

参考

Vision APIの入門ガイド