Google CloudのCloud Vision APIで画像から日本語の文字抽出をしてみた

2021.06.17

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、リサリサです。

AWSにはAmazon Textractという文字抽出できるサービスがあるのですが、日本語にまだ対応していません…。日本語の文字抽出がしたかったので、GoogleCloudのサービスのCloud Vision APIを使ってみました。

Googleドライブに置いた画像をGoogleドキュメントで開くと無料で似たようなことができたりはするのですが、今回は大量の画像データを一気にテキスト化したかったため、コードで解決したくてCloud Vision APIを使ってみる事にしました。

やってみた

こちらを参考にさせて頂きました。

Google Cloudのプロジェクトを作成する

Cloud Vision APIのクイックスタートの通りに進めていきます。

プロジェクト作成

新規でプロジェクトを作成します。

Cloud Vision APIを有効にする

Cloud Vision APIを有効にします。

認証情報の設定

認証情報の設定をします。

サービスアカウントを設定

クイックスタート通りにサービスアカウントを設定します。

 

サービスアカウントのキーを作成、取得

ここまででGoogle Cloudのプロジェクトを作成は終わりです。

最後に、Cloud Vision APIを呼び出すときに必要な、サービスアカウントのキーを作成、取得します。

JSONで作成するのがいいみたいです。

Cloud Vision APIを呼び出してみる

こちらに従って環境を作っていきます。

Cloud Visionクライアントライブラリをインストールします。Pythonを使っていきたいので、Pythonのライブラリをインストールします。

pip install --upgrade google-cloud-vision

↑で取得したjsonのパスを環境変数に設定します。

export GOOGLE_APPLICATION_CREDENTIALS="jsonキーのフルパス"

以下のコードを実行します。

block.paragraphsの単位が文字の一塊のようなので、block.paragraphs単位で改行して、単純に文字列を縦に並べて出力してみました。

import io
import os

# Imports the Google Cloud client library
from google.cloud import vision

# Instantiates a client
client = vision.ImageAnnotatorClient()

# The name of the image file to annotate
file_name = os.path.abspath('画像の相対パス')

# Loads the image into memory
with io.open(file_name, 'rb') as image_file:
    content = image_file.read()

image = vision.Image(content=content)

# Performs label detection on the image file
response =  client.document_text_detection(
        image=image,
        image_context={'language_hints': ['ja']}
    )

# レスポンスからテキストデータを抽出
output_text = ''
for page in response.full_text_annotation.pages:
    for block in page.blocks:
        for paragraph in block.paragraphs:
            for word in paragraph.words:
                output_text += ''.join([
                    symbol.text for symbol in word.symbols
                ])
            output_text += '\n'
print(output_text)

こんな感じになりました。なかなか綺麗に取れていて感動です!

料金

公式ページはこちらになります。

今回使ったのはテキスト検出で、最初の1000ユニットは無料。

1,001~5,000,000 ユニット/月:$1.50/1000ユニット

5,000,001 以上のユニット/月:$0.60/1000ユニット

のようです。

最後に

Google Cloudを使ったのは初めてだったのですが、チュートリアル通りに進めれば簡単に動かすことができました。

次はこれをS3のPUTイベントで動くLambdaで動かしていきたいと思います。

おまけ

↑のコードを丸っとLINE botにしてみました。

どんな感じで返ってくるのか、お気軽に試してみたい方は使ってみて下さい。

こちらから友達登録できます。

※このアプリでは精度を気にせずに、取得できた文字の確度を判断せずそのまま返しています。精度が微妙だなと思うかもしれませんが、Cloud Visionのレスポンスとしては文字の確度も返ってきています。その辺りを見るようにして頂ければ、必要に応じた確度で文字抽出が可能かと思います。