はじめに
不可能から可能性に♪ nikkieです。
OCR(光学文字認識)ができるGoogleのAPIを触りました。
目次
- はじめに
- 目次
- Google CloudのVision AIの中のVision API
- Vision APIで画像内のテキストを検出する
- 終わりに
- P.S. Vision APIを触ったきっかけは、2022年のML Study
Google CloudのVision AIの中のVision API
Googleはサービス名称をかなり攻めた変え方をしてきますが、現在はVision AIの下に3つのプロダクトがあるようです。
あらゆる状況に対応するための 3 つのコンピュータ ビジョン プロダクト
この記事ではVision APIをPythonで触っていきます。
ドキュメント中にはVision APIの旧称と思われるCloud Vision APIという表記もありました。
Vision APIで画像内のテキストを検出する
ガイドの1つです。
「ローカル画像でテキストを検出する」のPythonのサンプルコードを動かします
Google Cloud プロジェクトと認証のセットアップ
サンプルコードを動かす前に準備が必要です。
「Google Cloud プロジェクトと認証のセットアップ」
- 大前提:Google Cloudのアカウント
- Google Cloudのプロジェクト1つ
- すでにあるものを選ぶ
- または、新規作成
- 余談:削除など管理したい場合は https://console.cloud.google.com/cloud-resource-manager から
- プロジェクトで課金が有効になっているか確認する
- 案内された別ドキュメントに従いました
- 直リンクは
https://console.cloud.google.com/billing/linkedaccount?hl=ja&project=<選んだプロジェクトID>
っぽいです - 課金を有効にしますが、今回のサンプルコードの範囲内では無料で使える認識です
- 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のメソッドについて
- そもそもVision APIのOCRには2つあります
- https://cloud.google.com/vision/docs/ocr?hl=ja#optical_character_recognition_ocr
- TEXT_DETECTION
- DOCUMENT_TEXT_DETECTION
- clientはそれぞれメソッドとして持つようでした
- 今回はDOCUMENT_TEXT_DETECTIONを選択
- そもそもVision APIのOCRには2つあります
- 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のニーズで思い出しました
- ref: https://cloud.google.com/vision/docs/detect-labels-image-client-libraries?hl=ja#install_the_client_library↩
- 写経して書いた記事です(GPT-4に精度低いですがOCRしてもらっています) ↩
-
「新年会」の前に半角スペースが入っていますが、過去の記事を参考に除けると考えています
↩Tesseract触ったところ、日本語のOCRはめっちゃ半角スペース入るようなんですが、過去記事参考に後処理を一発で書き上げられた!
— nikkie / にっきー (@ftnext) 2024年1月3日
過去の私、オメガグッショブ!https://t.co/msVCxvHXhb