【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

PythonでGoogle Cloud Vision APIを利用する方法 | ジコログ