Home About
ocr , Python

Cloud Vision API を使う Python3 編

Google の Cloud Vision APIの機能のひとつにOCRがあり これを業務で使う機会がありました。 実際に使ってみると、対象が印刷物をスキャンした画像データだったなど条件がよかったのだとは思いますが ほぼOCR処理として100%に近い形でテキストに変換されました。 とはいえ、100%ではないので、そこは人間が一度はすべて確認する必要がありますし、 そもそもOCRで読みとったテキストをこちらが使用したい単位に整理する処理については 当然OCRの守備範囲外になります。 そのため、その部分のコードを書くのが相当に大変でした。

もし人間が目視&手作業としてテキスト入力すれば、その整理部分も含めて人間が処理することになる。 それがアウトソーシングとしてページ単価いくらで予算の範囲で収まるのであれば、 どうなんだろう。 自分ががんばって書いたコード部分は結局たいした価値があるのだろうか……という微妙な仕事になってしまった。

Cloud Vision API 自体はとても簡単に使えます。 画像を用意してそれをPOSTして結果のJSONを受け取るだけです。 当然、Google Cloud サービスなので、Google のアカウントを用意して、APIを使用する設定や 課金設定などなどが必要です。 そのあたりはいくらでも情報がネット上にあるのでここでは割愛します。

ここで紹介するコードは、APIKey を使用する方法です。 これはお手軽ですが、その APIKey が流出すると、クラウド破産になる可能性があるので注意が必要です。

Python3

main.py

import socket
import requests
import base64
import json
import sys

# IPv4 でPOSTするのを強制する:
import requests.packages.urllib3.util.connection as urllib3_cn
def allowed_gai_family4(): return socket.AF_INET
urllib3_cn.allowed_gai_family = allowed_gai_family4


def image_file_to_base64(file_path):
    with open(file_path, "rb") as image_file:
        data = base64.b64encode(image_file.read())

    return data.decode('utf-8')

def save_text_as_file(text, file_path):
	with open(file_path, "w") as f:
		f.write(text)


args = sys.argv[1:]
if len(args)>2:
	api_key = args[0]
	image_file_path = args[1]
	result_json_file_path = args[2]

	encoded_string = image_file_to_base64(image_file_path)
	
	params = {"requests":[{"image": {"content": encoded_string}, "features":[{"type":"TEXT_DETECTION"}], "imageContext":{"languageHints": ["ja", "en"]}}]}
	req_body = json.dumps(params)
	
	api_url = "https://vision.googleapis.com/v1/images:annotate?key=" + api_key
	
	res = requests.post(api_url, data=req_body)
	result = json.dumps(res.json())
	save_text_as_file(result, result_json_file_path)

IPv4 に制限しています。本来その必要はないのですが、もし IPv4 の IPアドレスを使って APIKey の使用制限を設定している場合には必要になる可能性があります。

ここでは features の指定で TEXT_DETECTION を指定しています。 これではなく DOCUMENT_TEXT_DETECTION を指定した方が結果がよい場合もあるので注意しましょう。

使い方は:

$ python3 main.py APIキー 画像ファイルパス 結果を保存するファイルパス

です。 APIキーが foobar で 対象画像ファイル名が hoge.png 結果を result.json に保存するとすれば:

$ python3 main.py foobar hoge.png result.json

これだけです。

もし requests モジュールがない、というエラーが出たら:

$ pip3 install requests

でインストールできました。(macOSの場合)