nikkie-ftnextの日記

イベントレポートや読書メモを発信

GoogleのVision APIをPythonから呼び出して、画像内のテキストを検出する

はじめに

不可能から可能性に♪ nikkieです。

OCR光学文字認識)ができるGoogleAPIを触りました。

目次

Google CloudのVision AIの中のVision API

Googleはサービス名称をかなり攻めた変え方をしてきますが、現在はVision AIの下に3つのプロダクトがあるようです。

あらゆる状況に対応するための 3 つのコンピュータ ビジョン プロダクト

この記事ではVision APIPythonで触っていきます。
ドキュメント中にはVision APIの旧称と思われるCloud Vision APIという表記もありました。

Vision APIで画像内のテキストを検出する

ガイドの1つです。

「ローカル画像でテキストを検出する」のPythonのサンプルコードを動かします

Google Cloud プロジェクトと認証のセットアップ

サンプルコードを動かす前に準備が必要です。
Google Cloud プロジェクトと認証のセットアップ

  • 大前提:Google Cloudのアカウント
  • Google Cloudのプロジェクト1つ
  • プロジェクトで課金が有効になっているか確認する
  • Vision APIを有効にする
  • gcloudコマンドが使えるようにする(インストールして初期化)
    • 過去にもGoogle Cloudは触っていたので、私にはこのステップは不要でした
  • gcloudコマンドでApplication Default Credentials (ADC)の作成
    • https://cloud.google.com/docs/authentication/provide-credentials-adc?hl=ja#local-dev
    • ユーザー認証情報で進めました
      • gcloud auth application-default login
      • 後述するライブラリで参照するJSONファイルが作られます(~/.config/gcloud/application_default_credentials.json
    • Vision APIを最初に叩いたとき「The vision.googleapis.com API requires a quota project, which is not set by default.」が返りました
      • 案内に沿ってgcloud auth application-default set-quota-project <選んだプロジェクトID>して解決しています(コマンド両方必要ということなのかな?)

Pythonのサンプルコードを動かす

依存ライブラリをインストールします1

pip install google-cloud-vision

(※私は仮想環境派ですが、ご自身の慣れた方法があると思うので、それに読み替えてください)

こんな環境で動かしました Python 3.11.4

cachetools==5.3.2
certifi==2023.11.17
charset-normalizer==3.3.2
google-api-core==2.15.0
google-auth==2.26.0
google-cloud-vision==3.5.0
googleapis-common-protos==1.62.0
grpcio==1.60.0
grpcio-status==1.60.0
idna==3.6
proto-plus==1.23.0
protobuf==4.25.1
pyasn1==0.5.1
pyasn1-modules==0.3.0
requests==2.31.0
rsa==4.9
urllib3==2.1.0

手元にテキストを検出したい画像を用意し、以下のコードを動かします。
私はChatGPTにやらせ隊のプロンプトをテキストで得たいと考えました2(だって写経するの面倒じゃないですか)

from google.cloud import vision

client = vision.ImageAnnotatorClient()

with open("kanji.png", "rb") as fb:
    content = fb.read()

image = vision.Image(content=content)

response = client.document_text_detection(image=image)
texts = response.text_annotations
print(texts[0].description)
  • clientのメソッドについて
  • responseについて
    • 検出されたテキストは画像中の座標と一緒に返っています
    • text_annotationsの最初の要素が全文のようだったので、決め打ちでprintする実装としました(ブラッシュアップの余地大いにあり)

目的は果たせました!🙌3

% python script.py
あなた
飯田橋から神楽坂エリアで、 新年会にぴったりの居酒屋を探してください。予算は1
人7000円以下で、8人では入れるお店にしてください。
ChatGPT
<以下省略>

なかなか精度高くて、「8人では入れる」は元のプロンプトのとおりです。

終わりに

Pythonのライブラリを使って、Vision APIに画像を送ってOCRしました。
これでどんなプロンプトでも真似できるぞ!

Google CloudのAPIは色々と触っていますが、今回は(サービスアカウントではなく)ユーザー認証情報でADCを作ったことでセットアップが簡単だったと感じます。
サービスアカウントだと「あのときのファイルどこやったっけ」ってなりがちでした。

Vision APIの返り値の座標の扱いが宿題事項です。
また、今回参照したガイドの冒頭ではDocument AIというサービスも案内されていて、こちらも気になりますね

スキャンされたドキュメント内のテキストを検出する場合は、Document AI を使用して光学式文字認識、構造化フォーム解析、エンティティ抽出を行います。

P.S. Vision APIを触ったきっかけは、2022年のML Study

UbieさんがCloud Vision APIを使っていると聞いていて、今回のOCRのニーズで思い出しました


  1. ref: https://cloud.google.com/vision/docs/detect-labels-image-client-libraries?hl=ja#install_the_client_library
  2. 写経して書いた記事です(GPT-4に精度低いですがOCRしてもらっています)
  3. 「新年会」の前に半角スペースが入っていますが、過去の記事を参考に除けると考えています