JUNのブログ

JUNのブログ

活動記録や技術メモ

Google Cloud Vision APIのTEXT_DETECTION を Pythonで試してみる

Google Cloud Vision API の中の文字認識(TEXT DETECTION)について書いてる記事が少なかったのと、自分が躓いたりしたりしたので、ここにメモしておく。

APIKEYの発行の仕方等々については以下のサイトを参考にした。
Google Cloud Vision APIの使い方まとめ

環境

  • Windows10
  • Python3.6.3
  • プログラムはbash上で実行

コード

import requests
import json
import base64  # 画像はbase64でエンコードする必要があるため

API_KEY = "自分のAPIKEY"


def text_detection(image_path):
    api_url = 'https://vision.googleapis.com/v1/images:annotate?key={}'.format(API_KEY)
    with open(image_path, "rb") as img:
        image_content = base64.b64encode(img.read())
        req_body = json.dumps({
            'requests': [{
                'image': {
                    'content': image_content.decode('utf-8')  # base64でエンコードしたものjsonにするためdecodeする
                },
                'features': [{
                    'type': 'TEXT_DETECTION'
                }]
            }]
        })
        res = requests.post(api_url, data=req_body)
        return res.json()


if __name__ == "__main__":
    img_path = "画像のpath"
    res_json = text_detection(img_path)
    res_text = res_json["responses"][0]["textAnnotations"][0]["description"]
    #print(json.dumps(res_json, indent=4, sort_keys=True, ensure_ascii=False))
    print(res_text)
    with open("result.json", "w") as js:
        #json.dump(res_json, js, indent=4, ensure_ascii=False)
        js.write(res_text)

実行結果

まずは英語

入力 f:id:JUN_NETWORKS:20180201042846p:plain

出力
facebook

いけるやん

日本語はどないや?

入力 f:id:JUN_NETWORKS:20180201043913j:plain

出力

に ほ ん ご
であそぼ

あぁ^~いいっすねぇ^~

こんな感じで結構いけます。

自分が引っかかった部分

  • 画像はbase64エンコードし、json.dumps()をする際には画像がbase64,つまりバイト列になってるのでこれをdecode("utf-8")utf-8にする必要がある。これをしないとエラーが出る。

  • windowsの場合 bash などの環境で実行しないとUnicodeEncodeError: 'cp932' codec can't encode character '\u3127' in position 507: illegal multibyte sequenceのようなクソみたいなエラーが出る。bashで実行する以外にも解決方法はあると思うが、bashで実行するのが一番手っ取り早い。

  • 他半数の人が既知だと思うがjsonからデータを取り出す時(今回の場合における"description") は{}に囲まれてるだけなら["キー"]で良いが、
    以下のような場合
    {"キー1":[{"キー2":0}]}
    ここから["キー2"]を取り出すには
    >["キー1"][0]["キー2"]とする必要がある。このリストが混ざってる感じのやつは途中に挟まってるリストでは文字列ではなくインデックス番号を指定しなければいけない(よく考えれば当たり前)。 これに気づかずに30分くらい「う~ん」とか言ってた。


何か間違えやアドバイス等あればコメントください