はじめに
今回はGCPのCloud Vison APIを利用して画像からテキスト(日本語)を抽出します。
経緯として、Tesseractを使用してみたんですが、精度の高いバージョンでも日本語の読み取り制度が低いんですよね...
今回は個人使用でリクエスト数も少ないため、GCPのAPIの中で探したところ、Cloud Vision APIを見つけたので使うことにしました。
料金
GCPのAPIなので料金がかかります。が!個人使用レベルなら基本無料です。というのもリクエストの送信が1000回を超えると1001回目から有料になるみたいです(それまでは無料)。
その後は1000回ごとに1.5ドルかかるってことですかね?(間違ってたら指摘お願いします)
今回の使い方的には月に1000回も利用しないので大丈夫でしょう。
環境
- Python
- google-cloud-vision
- gcloud CLI
google-cloud-visionのインストール
Cloud Vision APIを使うために必要となるのでpipでインストールしておきます
pip install --upgrade google-cloud-vision
ちなみにGCPのAPI関連ライブラリはここにまとまっていて、下の方からPyPIにアクセス可能です
GCPでプロジェクトを作成
GCPで新規プロジェクトを適当に作ります。
そこにAPIライブラリからCloud Vision APIを探して有効にします。
gcloud CLIを使用した認証
今回使用するAPIはADC(アプリケーションデフォルト認証)が必要となります。ローカル環境で開発することになるので以下を参考にgcloud CLIから認証をしましょう。
まず、gcloud CLIをインストールします。
そこからgcloud CLIにこのコマンドを入力します。
gcloud auth application-default login
認証過程でどのプロジェクトを利用するかなど聞かれるので適宜読みながら入力してください。
OCRしてみる
ここのクイックスタートを参考にコードを書きました。
from google.cloud import vision
def detect_text(path):
client = vision.ImageAnnotatorClient()
with open(path, "rb") as image_file:
content = image_file.read()
image = vision.Image(content=content)
response = client.text_detection(image=image)
texts = response.text_annotations
return texts[0].description
たったこれだけで高精度なOCRが使えるのはとても便利ですね。
おまけ
今回このAPIを使った理由ですが、WinningPost10というゲームをしていて、馬のリストを画像から生成したかったからなんです。
最後にStreamlitを使ったアプリとしてコードを書いたので参考にしてみてください。
from google.cloud import vision
import streamlit as st
import pandas as pd
def detect_text(file):
client = vision.ImageAnnotatorClient()
# with open("a.png", "rb") as image_file:
# content = image_file.read()
image = vision.Image(content=file)
response = client.text_detection(image=image)
texts = response.text_annotations
return texts[0].description
files = st.file_uploader("画像アップロード", accept_multiple_files=True)
texts = []
for f in files:
st.write("filename:", f.name)
texts.append(detect_text(f.read()))
if len(files) >= 1:
st.dataframe(pd.DataFrame("\n".join(texts).split("\n")))
このようなスクショが↓のように処理されてリスト化されます。