記事概要
Google Vision APIを用いてOCRをした際の結果を再利用するためにJSONファイルに書き出し、読み込みを行います。
本記事の前提条件
環境における前提としてGoogleのVision APIのアクセスキー登録やライブラリのダウンロードが終わっているものとします。
筆者はソースコードも含め下記を参考にしているため、そちらを一度参照するとスムースに本記事が読めると思います。
モチベーション
Googleの提供するVision APIはかなり良い精度のOCRを可能にしてくれますが、従量課金制になっているためなるべく少ない回数の呼び出しで済ませたいという事情があります。
具体的には、OCRのテキスト抽出に限って言うとだいたい下記のようになっています。
- 月に1000画像まで無料
- 以後は1000画像あたり1.5$(非常に大量にやると割引になる)
- なお、最初に登録したときに300$のクレジットが付与される
本当のところはもっと細かいので以下のページを参考にしてください。
正直結構安い気もしますがfor文が入ったコードとかをデバッグしまくると1000画像なんかは結構簡単に超えちゃいそうなので一度APIの処理結果をファイルとして保存してあとからいろいろな処理をしたくなります。
解決策
解決策として下記の手順をとります。
- APIを呼び出して結果を取得
- OCRの結果が格納されたobjectをJSON形式で相互変換
- JSONのdump/loadで読み書き
APIを使ってOCR結果を取得
これは引用元のQiita記事のコピーになります。
# 画像のファイル名:input_file を 定義すること
import io
from google.cloud import vision
client = vision.ImageAnnotatorClient()
with io.open(input_file, 'rb') as image_file:
content = image_file.read()
image = vision.Image(content=content)
# 結果を格納するobjectを取得
response = client.document_text_detection(image=image)
OCRの結果をJSON形式に相互変換
先程得られた結果はgoogle.cloud.vision_v1.types.image_annotator.AnnotateImageResponse
という型のobjectになっているため、json形式に変換して読み書きをするようにします。
下記のStackoverflowの質疑を見た感じそれ用の変換関数が用意されているようです。
ひとまず下記の関数で相互変換が可能でした。ドキュメントはしっかり読み込んでいないので変なところがあったら教えて下さい。
from google.cloud.vision import AnnotateImageResponse
# object->json
json_data = AnnotateImageResponse.to_json(response)
# json->object
response_ = AnnotateImageResponse.from_json(json_data)
# True
print(response == response_)
ファイルに読み書き
JSON形式になったのでdump/loadで読み書きができます。
ということでそれっぽく関数を書くとすると下記の様になります。
import json
from google.cloud.vision import AnnotateImageResponse
def save_as_json(response, filename):
data = AnnotateImageResponse.to_json(response)
with open(filename, mode='wt', encoding='utf-8') as file:
json.dump(data, file, ensure_ascii=False, indent=2)
def load_from_json(filename):
with open(filename, mode='r', encoding='utf-8') as file:
temp = json.load(file)
response = AnnotateImageResponse.from_json(temp)
return response