CloudVision APIのテキスト認識をpython3から利用する

CloudVision APIのテキスト認識を使うと安価に高精度の画像のOCRが利用できるのですが、pythonのサンプルが公式ドキュメント内で整理されていない感があり、少し手間取ったので自分用のメモとして残しておきます。

やったことは以下です。

  • テキスト認識のヒントに日本語を渡す
  • 結果解析用にAPIのレスポンスをJSON形式のファイルで残す
# -*- coding: utf_8 -*-
import io
import os
import json
import glob

from pprint import pprint

# Google Cloud client libraryのインポート
from google.cloud import vision
from google.cloud.vision import types

from google.protobuf.json_format import MessageToJson

def annotate(basename):
    # 画像のファイルパス
    file_name = os.path.join(
        os.path.dirname(__file__),
        'resources/{}'.format(basename))

    # 画像のロード
    with io.open(file_name, 'rb') as image_file:
        content = image_file.read()

    image = types.Image(content=content)

    # 日本語のヒントを与える
    image_context = types.ImageContext(language_hints=['ja'])

    response = client.text_detection(image=image,image_context=image_context)

    # JSON ファイル書き出し
    serialized = MessageToJson(response)
    data = json.loads(serialized)

    f = open('results/{}.json'.format(os.path.splitext(basename)[0]), 'w')
    f.write(json.dumps(data,ensure_ascii=False))
    f.close()

# クライアント初期化
client = vision.ImageAnnotatorClient()

# resources フォルダ内の画像をすべてAPIに投げる
paths = glob.glob("resources/*.jpg")

for path in paths:
    annotate(os.path.basename(path))

リポジトリ:

github.com

余談

  • 技術検証の段階だったので、curlからやればすんなりできたんですけどね。。
  • 内部実装protobuf使ってるんですね、しかもJSONのコンバータつけてるのはおしゃれ。複数言語をターゲットにするならそっちの方が効率いいのかな。かっこいいなあ。