Cloud Vision APIでお手軽にゲーム画像からテキスト抽出してみた!
まえがき
うわーん、ゲーム画像からテキストが抽出したいよー
でも「画像 テキスト プログラム」で調べてもOCRエンジンをインストールしたりしなきゃいけないし、精度上げようとすると大変そうだよー
Googleレンズとかあるし、GoogleがそういうAPI公開してたりしないのー
あるじゃん!!!
Cloud Visionとは?
Googleが提供しているクラウドサービス「Google Cloud」で提供されているプロダクトの1つで、画像や動画といったメディアから
- テキストを抽出する
- 顔認識、ランドマーク認識を行う
- 商品の分類を行う
- キャプション生成、タグ付け
など様々な処理を行ってくれるAIを使えるみたいです。
今回はその中の1つである画像内のテキスト抽出を実際にCloud Vision APIを使ってやってみよう! という記事になります。
導入+準備
公式ドキュメント がとても良くまとまっているので基本的にそれをなぞっただけです。
Google Cloudの登録をする
こちらを参考にしてください。
今回私は初めてGoogle Cloudを使うので新規に登録しました。
AWSのように無料枠が切れたら急に有料になったりしないようなので、ちょっと安心です。
Cloud Vision APIのAPIを有効化
こちらを参考にしてください。
Pythonコード
テキスト抽出したい画像を用意する方法は主に3つあります。
- ローカルから送る
- Google CloudのCloud Storageに置いてそれを読み込む
- Webのどこかに置いてそのURLから読み込む
今回は一番簡単に試したかったのでローカルから送りました。
ただ、今回はとりあえず読んだ文字全てを出力してくれればいいのでレスポンスのtext_annotationsの0番目を取ってそのdescriptionだけを表示しています。
text_annotationsの1番目以降には一区切り?ずつの文字の情報が入ってるようで、画像のどの位置に文字があるかという位置情報(x,y)も取ることができるようです。
def detect_text(path):
"""Detects text in the file."""
from google.cloud import vision
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
if texts:
text = texts[0]
print(text.description)
if response.error.message:
raise Exception(
"{}\nFor more info on error messages, check: "
"https://cloud.google.com/apis/design/errors".format(response.error.message)
)
if __name__=='__main__':
import sys
detect_text(sys.argv[1])
これを使って
python detect_text.py /path/to/image.png
みたいに実行してローカルにある画像をAPIに投げて実際にテキストを抽出してみます。
実際に使ってみた
ゼンレスゾーンゼロ
まず手始めに簡単そうなものから。最近話題のゼンレスゾーンゼロから、適当な会話シーンを持ってきました。
結果がこちら。
WHITE STAR INSTITUTE
学会
WILLB
ARGET
ローランド
CLL
素晴らしい。私がメッセージを送ってから、 まだ1時間27分と35秒です。
独立調査員殿、 あなたの意気込み、 しかと感じました。 0308
000
::
いくつかノイズが混ざっていますが、メッセージウィンドウの文章は完璧に読めていますね。
そして背景のWHITE STAR INSTITUTEとか、ポスターのAGENTという文字も読めています。
学会の前の文字(中国語?)は今回は検出できていませんね。前回実行したときは読めたんですが…日本語や英語が入り混じっているせいでしょうか。
後ろの画面のソースコードらしきものは流石に読めませんでした。まあ人間でも読めませんし、そもそも文字が書いてあるかどうかも怪しいですが。
Magic: The Gathering
お次はMTGから、適当に文章の長いカードを持ってきてみました。テキスト抽出はやりやすそうですが、カードゲーム独自の用語(接死、絆魂など)は読めるのか。あとこの画像はもともとサイズが小さくて細かい字が潰れたりしていますが、どうでしょうか。
結果がこちら。
さいだい
きい しゃ
偉大なる統一者、アトラクサ 3
伝説のクリーチャー ファイレクシアン・天使
飛行、 警戒、接死、 絆魂
|偉大なる統一者、アトラクサが戦場に出たとき、 あなた
のライブラリーの一番上にあるカード10枚を公開す
る。 各カード・タイプにつきそれぞれ、 それらの公開さ
れたカードの中からそのタイプのカード1枚をあなた
の手札に加えてもよい。 残りをあなたのライブラリー
の一番下に無作為の順番で置く。 (「アーティファクト」 「イ
ンスタント」 「エンチャント」「クリーチャー」 「ソーサリー」 「土
「バトル」「プレインズウォーカー」はカード・タイプである。)
196/271 M
ONE JP MARTA NAEL
7/7
*2023 Winans of the Coast
ほぼ完璧です!
ルビ(いだい、とういつしゃ)が読めてないのと、行をまたいだ「土地」の地が抜けてしまっている、WizardsがWinansになっちゃってるなどありますが些細な点でしょう。
左下にあるコレクター番号(196/271)やアーティスト名(MARTA NAEL)までちゃんと抽出できてるのが素晴らしいですね。
アークナイツ
最後はアークナイツのホーム画面から。現在4.5周年でイベントをやっていることもあり、かなりゴチャゴチャしており、フォントも文字の大きさもバラバラ、配置もバラバラということでかなり難しいのでは?
結果がこちら。
4.5周年
ログイン
龍門開運
おみくじ
4.5周年
スタンプ
CA RHODES ISIANDA
VOICE
78
LV
Q
()、集中集中一。卜夕夕一、仕事中一⊃
しちゃダメだよ。 ぴーちゃんみたいにいい子にし
以上权。
BREAKING NEWS
PACK
RHODES ISLAN
100
E™ GIFTPACH
RHODES ISLAND BIG SA
戦友
2600
1回限定
期間限定販売 ¥30 情報
INDER CONSTRUC
2024/08/11 17:57.
139303695 143885+
AYAVA
OX
96端末
216+
TALES WITHIN
THE SAND
熱砂秘聞
進捗
理性/128
9-1 暗雲の中入
悽表離
HERE & PEOPLE SOWS
編成
人事
OPERATOR
SCOUT
WO
5日
Trainer
購買部
公開求人 人材発掘
任務
[2]
BETA
基地5
10時間
倉庫
はい、かなり要素が多くてゴチャゴチャしてしまいましたが結構読み取れているんじゃないでしょうか? 凄いですね。
細かいところでいくと、右上のTHE SANDの上にちっちゃーくTALES WITHINって書いてたり、その下の懐乖離というイベント(これは間違っていますが)HERE A PEOPLE SOWSって書いてるのも抽出できていたり(Aが&になってますが)。
あとINDER CONSTRUCってどこ?と思いましたが背景の中央上あたりの戦艦?にうっすーらと書いててそれを拾っているようです。気が付かない。
意外と読めてなかったのは左中央のボイスメッセージですね。かなり抽出しやすそうだと思ったんですが。
()、集中集中一。卜夕夕一、仕事中一⊃
しちゃダメだよ。 ぴーちゃんみたいにいい子にし
以上权。
1行目と3行目がおかしいですね、漢字が多いから中国語として検出してしまったんでしょうか。
気になるお値段は?
趣味でちょっとしたものに使う程度なら全然無料でいけちゃいますね。
まとめ
OCRはまともにやったことないのですが、こんなにお手軽かつそれなりに高精度にテキスト抽出ができるのはかなり魅力的じゃないでしょうか?
特に最近のソシャゲは文字が多くてテキストだけ抜き出してシナリオを読みたい!なんてことを思ったりもしますが、Cloud Vision APIを使えばそういうのも簡単にできてしまうかもしれませんね。
みなさんもぜひ利用してみてくださいね。
Discussion