2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

GCPのCloud Vsion APIを使ってOCR(画像からテキスト抽出)してみる

Last updated at Posted at 2023-10-17

はじめに

今回は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")))

スクリーンショット 2023-10-17 153026.png

このようなスクショが↓のように処理されてリスト化されます。

image.png

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?