Google Vision APIの画像認識(特にOCR)を業務システム開発の立場から検討してみる

本記事では、Googleが提供しているVision APIを業務システムでの利用という立場から検討してみます。

【目次】


[1]画像認識(特にOCR)の導入

業務システムにAI技術を導入できそうなところは多々あると思いますが、今回は、『「エージェント」と「環境」を意識して業務システムを少し賢くしたい』の記事の例にあげた、紙に書かれている情報を業務システムに入力する作業負担を減らすことを考えてみます。これはエージェントの考え方のセンサ(視覚)にあたります。

AIに関連する研究分野に、コンピュータビジョン(computer vision)があります。Wikipediaでは以下のように説明されています。
  • コンピュータがデジタルな画像、または動画をいかによく理解できるか、ということを扱う研究分野である。工学的には、人間の視覚システムが行うことができるタスクを自動化することを追求する分野である。

また、紙の情報から読み取る、ということなら真っ先に思いつくのはOCRではないかと思います。
OCR(光学文字認識)とは、ざっくり言えば、画像の中にある文字領域を認識し、それをコンピュータが扱える文字データとして抽出してくれる技術です。また、コンピュータビジョン関連技術でもあります。

具体的な利用の流れは、入力となる情報が書かれた紙を、スキャナーあるいはカメラで撮影して画像化し、OCR処理によって文字データを抽出します。この文字データを業務システムの入力に使います。

OCR技術の歴史は古く、様々な製品やサービスが存在しますが、今回はGoogle Cloud Platform(以下GCP)が提供しているVision APIを、業務システムでの利用という観点から検討してみます。

[2]Google Vision APIとは

コンピュータビジョンに対応するサービスとして、GoogleはVision APIを提供しており、以下のように説明されています。
  • Cloud Vision API を使用すると、開発するアプリケーションの中で簡単に画像検出機能を統合できます。この機能の例としては、画像ラベリング、顔やランドマークの検出、光学式文字認識(OCR)、不適切なコンテンツへのタグ付けがあります。

具体的には、与えられた画像に対して、主に以下の内容を認識する機能があります。
  1. 顔検出
  2. ランドマーク検出
  3. ロゴ検出
  4. ラベル検出
  5. テキスト検出
  6. ドキュメント テキスト検出(高密度テキスト / 手書き)
  7. 不適切なコンテンツの検出(セーフサーチ)
  8. 画像プロパティ(Image properties)
  9. クロップヒント検出(Crop hint detection)
  10. ウェブ エンティティとページ(Web entities and pages)
  11. オブジェクトのローカライズ(Object localization)
上記のうちOCRにあたる機能は、「テキスト検出」と「ドキュメント テキスト検出(高密度テキスト / 手書き)」です。
各機能の詳細については、以下を参照してください。

深く考えるより先に、上記の機能がどのようなものかを試してみたい場合は、以下のサイトを利用すると、(差しさわりの無い)試したい画像をドラッグ&ドロップするだけで、上記の認識結果を簡単に確認することができます。

もし、既にGCPを利用している場合は、API Explorerを利用して試す方法もあります。

Vision APIを利用すれば、一つの画像から、文字情報だけでなく、様々な情報が得られます。多くの場合、紙(画像)から業務システムへの入力に利用するのは文字情報が中心だと思いますが、それに加えて、ロゴから相手先を特定するとか、顔写真も一緒に抽出するなど、いろいろ用途がありそうです。さらに、出先の現場の情景写真などから抽出可能な情報を組み合わせると発展的な利用も考えられそうで、とても興味深いです。

[3]Vision API利用環境の整備と検討事項

入力対象とする紙をスキャナやカメラで画像化して、上記の「試してみる」(https://cloud.google.com/vision/docs/drag-and-drop)を利用すると、業務システムにとって有用な情報が抽出できるかどうかを大雑把に把握することが出来ると思います。
もし、面白そう、ということであれば、実際の業務システムとの連携に向けて、簡単ですが、利用環境などの考慮事項を検討してみます。

具体的な利用開始手順は、以下のドキュメントで説明されています。
GCPを利用したことがある方には、以下の説明は不要かと思いますが、GCPを始めて利用される方は、上記ドキュメントの意味が分かりにくいかもしれません。
GCPは小規模~大規模まで汎用的かつ非常に多くの機能が統合されており、GCPの構成要素や概念が理解できれば、うまく統合されているな、と納得できますが、初めて利用する方は戸惑うかもしれません。(私がそうでした。)

ネットで検索すると、詳細な操作手順を示して下さっているサイトが多々ありますので、ここでは具体的な操作手順ではなく、業務システムとVision APIを連携するためにはどのような考慮が必要か、を中心に概観してみます。

以下に、利用設定から運用までの概要を図で表してみます。
Vision API利用設定から運用までの概要

⓪事前準備

GCPを利用するには、予め
  • 利用するGoogleアカウント
  • 課金方法
  • インターネット環境
を検討しておく必要があります。

Googleアカウントは新規に作成してもよいし、既存のもの(GMailで利用しているアカウントなど)でもかまいません。

Vision APIの利用には一定量の無料枠があり、無料の範囲内で試してみることが可能ですが、その場合でも課金に対する請求先を設定する必要はあります。なお、初めてGCPを利用する場合は、(2020年7月現在、)$300 分の無料クレジット付きの無料枠もあります。

Googleアカウントと課金方法の選択については、個人での利用と企業での利用では大きく異なると思いますので、状況に応じて検討してください。特に、個人利用で試すだけならアカウントの権限設定(IAMなど)の深い考慮は不要かもしれませんが、企業での利用になると、権限設定なども重要な考慮事項になるかと思います。

また、Vision APIはWebサービスなのでインターネットに接続できる環境が無いと利用できません。業務システムの利用環境によっては、構成を工夫する必要があるかもしれません。

①利用設定

1.GoogleアカウントでCloud Consoleへログイン

利用するGoogleアカウントを決めたら、Cloud Console(統合型 Google Cloud Platform 管理コンソール)にログインします。


2.プロジェクトの決定

利用するGCPのサービスはプロジェクト単位で管理されるため、VisionAPIを利用するプロジェクトを決める必要があります。これは新規にプロジェクトを作成することもできますし、既存のプロジェクトを利用することもできます。
プロジェクト単位でセキュリティや利用状況のモニタリング等が分離されますので、手軽に試してみるような場合は、テスト用の新しいプロジェクトを作成するのがよいと思います。

3.課金を有効にする

Vision APIには一定の無料枠がありますが、無料枠の範囲内の利用でもプロジェクトの課金を有効化する必要があります。具体的な手順については、
の「課金がプロジェクトで有効になっていることを確認する」の項がヒントになると思います。

4.APIの有効化

プロジェクトでVisionAPIを利用できるようにするために有効化が必要です。具体的な手順としては、Consoleの左側メニューの「APIとサービス/ライブラリ」を選択して、「Vision API」を検索します。Cloud Vision APIを選択して、「有効にする」ボタンをクリックします。
なお、このVision APIを有効化する操作だけで課金されることはありません。

5.認証の設定

Vision APIは、正当な呼び出し元からの処理要求かどうかを確認したうえで処理要求に答えます。管理者が設定したプロジェクトの正当な呼び出し元かどうかをVision APIに知らせるための方法は、APIキーによる方法、サービスアカウントによる方法等があります。

どの方法が良いか(あるいは利用できるか)は業務アプリケーションの構築方法によって異なると思います。
業務アプリケーションがVision API クライアント ライブラリを使ってVision APIを利用できる場合は、上記「Vision API を設定する」の手順にある通り、サービスアカウントによる方法が良いと思います。

②キー情報

Vision APIを利用するには正当な利用者であることを示す認証情報が必要です。これは先の「認証の設定」の設定内容によってキー情報の形が異なります。
サービスアカウントを利用し、かつVision API クライアント ライブラリを利用する場合は、秘密鍵ファイル(JSONファイル)をダウンロードして、環境変数GOOGLE_APPLICATION_CREDENTIALSにそのファイルパスを設定します。

③解析要求(API呼び出し)

業務アプリケーションからVision APIを呼び出す方法には、Vision API クライアント ライブラリを利用する方法と、直接HTTPリクエストを行う方法がありますが、可能であれば、Vision API クライアント ライブラリを利用するのがよいと思います。
いずれの方法にしても、Vision APIを呼び出す場合は先のステップで用意したキー情報が必要です。

④権限確認、利用状況等

Vision APIは渡されたキー情報に基づき、利用者(呼び出し元)の認証、承認(利用者が行える内容の決定)を行い、処理内容は監査ログ等に記録されます。Vision APIの利用状況や課金情報等はCloud Consoleからも確認できます。

[4]業務システム連携における検討事項

(1)料金について

料金についてはこちらをご覧ください。

詳細は上記資料をもとに検討する必要がありますが、課金イメージをざっくり考えれば、画像1,000枚を1ユニットとして、ユニット単位で課金が発生します。ここで、毎月最初の1,000枚までは無料で、超過分の1,000枚毎に$1.50の課金が発生します。
簡単に試すだけなら無料の枠内で収まると思いますが、業務システムで本格的に利用する場合は、上記料金表を元に、利用シナリオに応じた料金試算が必要と思います。

(2)解析対象の画像に対するGoogleの取り扱い

解析対象の画像がVision APIでどのように扱われるかは、業務システムの要件とも関係して重要な検討項目かもしれません。例えば、Googleの機械学習に利用されるのではないか?と心配されるかもしれません。企業のセキュリティ要件もあると思います。

これについては、Googleの以下のドキュメントが参考になります。

詳細は割愛しますが、これを読む限り、現状では、Vision APIの処理以外で使用されることは無く、適切に暗号化され、削除まで行われていると思えます。

(3)Vision API呼び出しの実装方法

Vision APIは直接HTTPリクエストを行う(REST方式)か、RPC方式で利用可能ですが、可能な限りクライアントライブラリを利用するのがよいと思います。


上記ドキュメントにはクライアントライブラリを利用する利点として
  • Cloud API を簡単かつ直感的に使用できるように、各言語で慣用的な生成済みコードや手書きコードを提供します。
  • Google での認証など、サーバーとの通信に関する下位レベルのすべての詳細を処理します。
  • npm や pip など、使い慣れたパッケージ管理ツールを使用してインストールできます。
  • 場合によっては、gRPC を使用してパフォーマンスを高めることもできます。詳細については、後述の gRPC API をご覧ください。
を挙げています。また、クライアントライブラリのソースコードはGitHubで公開されています。

Vision APIのクライアントライブラリについての説明は以下を参照してください。
利用できるプログラミング言語は、C#、Go、Java、Node.js、PHP、Python、Ruby等です。

(クライアントライブラリについては、記事『Vision API クライアントライブラリの概要(Python編)』などを参考にしてください。)

業務システムから直接利用する場合は、ライブラリが要求する環境、バージョン等の整合が取れるか検討が必要かもしれません。業務システム環境と整合しない場合や、プログラミング言語が異なる場合は、プログラムを分離して外部連携する等の検討が必要になるかもしれません。
なお、Firebaseを利用している場合は、現在はベータ版のようですが、ML Kitを使用することで、iOS、Androidからも利用できるみたいです。

(4)解析対象画像の種類と指定(送信)方法

解析できる画像のファイル形式、画像の推奨サイズ、ファイルサイズについては以下に情報があります。

多くの画像ファイル形式を処理できますが、対象外のファイル形式(例えば、現状だとHEIC形式など)の場合は、事前に形式変換してVision APIを利用する必要があります。

また、Vision APIに解析対象の画像を指示する方法として、
  1. 画像ファイルを、base64-encoded stringに変換して送信する。
  2. Google Cloud Storage内に画像がある場合は、gs://bucket_name/object_nameの形式で画像ファイルを指定する。
  3. 一般公開されている画像のHTTP/HTTPSのURLを指定する。
があります。

業務システムでの利用では、1か2が基本かと思います。注意事項としては、「Vision API では、10 MB の JSON リクエスト サイズ上限が課せられます。」とされてますので、画像ファイルが大きい場合は、一度Cloud Storageに保存してから処理要求する必要があるかもしれません。また、Vision API が処理できる画像ファイルは 20 MBまでのようですので、それ以上の画像ファイルを扱う場合は、送信前に何らかの加工処理(対象領域の切り出しや間引き)等の工夫が必要になると思います。

(5)OCR機能で得られる情報

機能の概要については以下のドキュメントが参考になります。

とても大雑把な説明になりますが、認識結果(レスポンス)は以下のものです。
  • 認識した文字(コード)
  • Symbol、Word、Paragraph、Blockという文字の構造情報と改行情報。(これらは日本語としての意味を表す単語、段落とは異なり、文字位置からみた構造と考えたほうがよいと思います。)
  • 文字や構造を認識した座標(矩形領域)
  • 言語情報(日本語、英語、その他)

正式な情報は、RESTまたはRPCリファレンスから得られます。(英語です。)

なお、各プログラミング言語に対応したVision API クライアントライブラリのリファレンスもありますが、結果データの構造と説明については、上記RESTリファレンスの説明の方が詳しいです。

(参考)
Vision APIのOCRについては、記事『Vision API OCR事始め(1):TEXT_DETECTIONとDOCUMENT_TEXT_DETECTIONの違い』などを参考にしてください。

(6)業務システム連携に必要な機能

OCR機能により、画像から文字と位置が正確に得られたとしても、多くの場合、そのまま業務システムの入力情報としては使えないと思います。それは得られたテキストが名前、住所のように意味付けされていないと、業務システムのデータ項目に対応付けできないからです。

この部分の処理はOCR技術の範疇を超えているので、OCR後の処理として、得られた文字情報から意味付けする必要があります。

例えば、元となる紙が履歴書のような固定フォーム(例えば、氏名、住所などの項目蘭の座標位置が決まっている)であり、かつ、スキャナなどを利用して項目蘭の座標位置を常に特定できる場合は、文字の座標位置から意味付けが出来る可能性があります。
一方、固定フォームであっても、スマホのカメラで撮影した歪や回転がある画像の場合は、簡単ではありません。
さらに、OCRの文字認識精度は100%ではなく、認識されない文字、あるいは誤認識もありえます。これについては、データ項目の意味が分かっていれば、業務システム側で補正が可能な場合もあります。(例えば、住所の読み取りの場合、住所データベースを用いて補正するなど)

このように、業務システム連携を考える場合は、OCRの結果データの意味づけをどの様に行うかが大きな検討項目になると思います。

ところで、OCRから得られる情報に加えて、Vision APIのOCR以外の機能から得られる情報を組み合わせると何らかの意味付けのヒントが得られる可能性もあります。
さらに、現時点ではベータ版の状態ですが、OCRより高度な意味付け情報が得られるソリューションがあります。
  • Document AI(https://cloud.google.com/solutions/document-ai?hl=ja
  • 「Document AI は、Google Cloud の業界トップクラスの OCR と Natural Language を活用してドキュメントを読み取り、理解して、ドキュメント データから価値を引き出します。」
具体的には、文書中のフォームや表を認識して、解析結果を構造化データ(例えば、項目名と値のペア)として得ることが出来ます。つまり、OCR後の意味付け処理を行っていることになります。ここまでくると、文字と座標等の情報を意識することなく、DocumentAIによる構造化データと業務システムの項目間の対応関係を考えればよいので、業務処理側の負担は激減すると思います。

(参考)
記事『Google Document AIで画像から表形式データを抽出する(Vision API OCRとの違い)』を書きましたので、宜しければご参照ください。


ここまでは「事前トレーニング済み」のVision APIの話でした。この事前トレーニング済みモデルの利点は、カスタマイズはできないけれども、高精度な解析処理を簡単に利用できることです。さらに、業務システム側が何もしなくても、Googleが内部的にバージョンアップを行って精度を向上させてくれます。
一方、Googleは独自の機械学習モデルを作成するためのサービスも提供していますが、機械学習自体が大きなトピックのため、ここでは検討外とします。

[5]最後に

Vision APIと業務システムとの連携を考えると、OCR以降の意味付け処理まで考える必要がありますが、まずは、その前提となるOCRの認識がどの程度のものかを知る必要があると思います。
以降は、Vision APIを試す環境構築、Vision APIの利用方法や認識精度(特性)などを共有したいと思います。


コメント

このブログの人気の投稿

VirtualBoxのスナップショット機能

Google Document AIで画像から表形式データを抽出する(Vision API OCRとの違い)

オントロジーエディタ Protégé を使ってみる