【GCP/Python】Vision APIのOCR(光学文字認識)でテキスト抽出!
もくじ
準備
参考:https://cloud.google.com/vision/docs/setup
1. GCPのプロジェクトを作成
2. 課金とCloud Vision API
を有効に
課金を有効にしていないと、いざOCR実行した際に請求先の設定がされてないというエラーが出ます。事前に設定しておきましょう。
google.api_core.exceptions.PermissionDenied: 403 This API method requires billing to be enabled. Please enable billing on project #xxxxxxxxxxxx by visiting https://console.developers.google.com/billing/enable?project=xxxxxxxxxxxx then retry. If you enabled billing for this project recently, wait a few minutes for the action to propagate to our systems and retry.
3-1. サービスアカウントのキー(JSON)を作成、ダウンロード
3-2. JSONを環境変数に設定
認証情報(JSON)が自動的に検出されるように設定します。
export GOOGLE_APPLICATION_CREDENTIALS="KEY_PATH"
export GOOGLE_APPLICATION_CREDENTIALS="/home/user/Downloads/service-account-file.json"
4. ライブラリのインストール
$ pip install --upgrade google-cloud-vision
参考:Vision client libraries | Cloud Vision API | Google Cloud
コード
全体像
import io import os from google.cloud import vision # 認証情報の取得 client = vision.ImageAnnotatorClient() # ファイルの絶対パスを取得 file_name = os.path.abspath('resources/sample.jpg') # ファイルを開く with io.open(file_name, 'rb') as image_file: content = image_file.read() # テキスト抽出 image = vision.Image(content=content) response = client.text_detection(image=image) texts = response.text_annotations if texts: print(texts[0].description) # ★ else: print("テキストは抽出されませんでした。")
最後(★部分)のテキストデータを出力するにあたってインデックス[0]
を指定しているのには理由があります。
インデックスが[1]
以降は文節(語)で抽出されるためです。
「今日は晴れです。」というOCR結果をfor
で取り出してみましょう。
for text in texts: print(text.description)
今日は晴れです。 今日 は 晴れ です 。
このため文章全てを抽出するにはインデックスを[0]
で指定する必要があります。
JSONを任意の場所に置いて読み込む
環境変数を読み込むのが定石ですが、任意の場所に置いても問題ありません。
方法はvision.ImageAnnotatorClient()
の引数にパスを指定するだけです。今回はホームに置いたJSONを渡してみます。
# ライブラリをimport from google.oauth2 import service_account # JSON json_path = '/home/service-account-file.json' credentials = service_account.Credentials.from_service_account_file(json_path) client = vision.ImageAnnotatorClient(credentials=credentials)
感想
今回実装してみて真っ先に感じたのはVisionAPIの精度に良さです。
すごいですね。こんなに正確に文字を抽出できるのかと心が踊りました!
スマホのスクショをOCRしてみると、電波のアンテナ部分が「111」となっていたのは笑いましたがご愛嬌のレベルですよね。素晴らしい〜。
参考URL
Vision AI | Cloud Vision API | Google Cloud
Cloud Vision APIをLambdaで使って、手書き文字(日本語)のOCRをやってみた | DevelopersIO