Google Cloud Vision APIで光学式文字認識をpythonで実装できない
- 評価
- クリップ 0
- VIEW 977
Google Cloud Vision APIで光学式文字認識をpythonで実装しようとしているのですが、うまくテキストが表示されません。
実行の参考サイトは以下二つです。
https://qiita.com/AltGuNi/items/6f22f1441733da08fdc1
https://www.g104robo.com/entry/google-cloud-vision-api
実装したコードは以下になります。
APIキーは抜いています。
# -*- coding: utf-8 -*-
import requests
import base64
import json
import os
GOOGLE_CLOUD_VISION_API_URL = 'https://vision.googleapis.com/v1/images:annotate?key='
API_KEY = '' # 取得したAPIキーを入力してください。
# APIを呼び、認識結果をjson型で返す
def request_cloud_vison_api(image_base64):
api_url = GOOGLE_CLOUD_VISION_API_URL + API_KEY
req_body = json.dumps({
'requests': [{
'image': {
'content': image_base64.decode('utf-8') # jsonに変換するためにstring型に変換する
},
'features': [{
'type': 'TEXT_DETECTION', # ここを変更することで分析内容を変更できる
'maxResults': 10,
}]
}]
})
res = requests.post(api_url, data=req_body)
return res.json()
# 画像読み込み
def img_to_base64(filepath):
filepath = 'img/text-tool03.png'
with open(filepath, 'rb') as img:
img_byte = img.read()
return base64.b64encode(img_byte)
# 文字認識させたい画像を./img.pngとする
filepath = 'img/text-tool03.png'
img_base64 = img_to_base64(filepath)
result = request_cloud_vison_api(img_base64)
#認識した文字の位置など、すべての情報を出力
#print("{}".format(json.dumps(result, indent=4)))
#認識した文字のみを出力
def get_fullTextAnnotation(json_data):
text_dict = json.loads(json_data)
try:
text_r = text_dict["responses"][0]["fullTextAnnotation"]["text"]
return print(text_r)
except:
print(None)
return None
出力結果は特にエラーがなく何も表示されません。
写真はimgフォルダに一枚入っています。
写真は「あいうえお」とシンプルに書いてあるものです。
ご教示いただけましたら幸いです。
宜しくお願い致します。
追記
# 文字認識させたい画像を./img.pngとする
filepath = 'img'
path = os.listdir(filepath)
new_path = ','.join(path).replace(".DS_Store,","")
new_dir_path = 'img/' + new_path
img_base64 = img_to_base64(new_dir_path)
result = request_cloud_vison_api(img_base64)
**#認識した文字の位置など、すべての情報を出力
print("{}".format(json.dumps(result, indent=4)))**
#認識した文字のみを出力
# def get_fullTextAnnotation(json_data):
# text_dict = json.loads(json_data)
# try:
# text_r = text_dict["responses"][0]["fullTextAnnotation"]["text"]
# return print(text_r)
# except:
# print(None)
# return None
途中、print("{}".format(json.dumps(result, indent=4)))で出力した結果、以下が出ました。
{
"responses": [
{}
]
}
これは、そもそも画像が読み込まれていないのでしょうか。
すいません、pathを違うもので書いてました。
def img_to_base64(filepath):
filepath = 'img/text-tool03.png'
with open(filepath, 'rb') as img:
img_byte = img.read()
return base64.b64encode(img_byte)
# 文字認識させたい画像を./img.pngとする
filepath = 'img/text-tool03.png'
img_base64 = img_to_base64(filepath)
result = request_cloud_vison_api(img_base64)
#認識した文字の位置など、すべての情報を出力
print("{}".format(json.dumps(result, indent=4)))
#認識した文字のみを出力
# def get_fullTextAnnotation(json_data):
# text_dict = json.loads(json_data)
# try:
# text_r = text_dict["responses"][0]["fullTextAnnotation"]["text"]
# return print(text_r)
# except:
# print(None)
# return None
上記でも出力が同じでした。
ひらがなは読めないんでしょうか。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
まだ回答がついていません
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.22%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正の依頼
tetsunosuke
2019/07/02 17:33
print(None)
ではなく
except Exception as e:
print(e)
した場合は何か出力されるのでしょうか?
Tsuyoshi777
2019/07/02 17:52
質問ありがとうございます。
上記で打ってみましたが、変更前と同じでした。
出力は何も出ません。
tetsunosuke
2019/07/02 17:56
よく見たら、
get_fullTextAnnotationは使われてないですね・・・?
print(get_fullTextAnnotation(result)) が必要でしょうか?
tetsunosuke
2019/07/02 18:18
> これは、そもそも画像が読み込まれていないのでしょうか。
突然話が複雑になっていますが...
filepath = 'img/text-tool03.png'
img_base64 = img_to_base64(filepath)
result = request_cloud_vison_api(img_base64)
print("{}".format(json.dumps(result, indent=4)))
でも同じだったのでしょうか?
Tsuyoshi777
2019/07/02 18:25
同じでした。
print(get_fullTextAnnotation(result)) はどこに記載した方がいいでしょうか。
tetsunosuke
2019/07/02 18:32
もし同じだったのであれば、
responsesがほぼからの状況で get_fullTextAnnotation(result) しても
意味はなさそうですよね。
記載位置の想定は、
result = request_cloud_vison_api(img_base64)
のあとでした。
Tsuyoshi777
2019/07/02 18:39
わかりました。ちょっと考えてみます。
tetsunosuke
2019/07/02 18:51
こちらでは全く同様のコードでちゃんと動きました。
コード:
https://gist.github.com/tetsunosuke/9939a050d3696a4b838fee422ea6825b
画像データ:
https://placehold.jp/24/cc9999/993333/150x100.png
結果:
{
"responses": [
{
"textAnnotations": [
{
"locale": "en",
"description": "150 x 100\n",
"boundingPoly": {
"vertices": [
{
"x": 25,
"y": 42
},
{
(省略)
Tsuyoshi777
2019/07/02 19:54
そうなんですね。普通にこのコードが書かれたpythonファイルをターミナルで読み込んで出力すればいいんでしょうか。そもそも根本的なことが間違っているような気がして‥、出力の仕方が違うのかなと思いました。
Tsuyoshi777
2019/07/02 20:01
curlコマンドを使うのでしょうか。
Tsuyoshi777
2019/07/02 20:13
写真を提示されているものに変えたら同じように出力が出ました!
ただ、print("{}".format(json.dumps(result, indent=4)))が反映されただけで、以下コードのテキストだけの抽出が出てないので、考えます。
tetsunosuke
2019/07/02 21:05
とりあえずなんらかの解析をかけることは成功したのですね。よかった。
https://qiita.com/saken649/items/4bfd215bf943c36a52ab
ひらがなが読めないわけではない、ようですよ。
> ただ、print("{}".format(json.dumps(result, indent=4)))が反映されただけで、以下コードのテキストだけの抽出が出てないので、考えます。
こちらは、
get_fullTextAnnotation がそのままの記述ではエラーになることも確認しています。まああとはJSONデータから特定の部分を抜き出すコードを書けばいいだけなので、そう難しくなく到達できると思います。
Tsuyoshi777
2019/07/03 04:06
わかりました。ありがとうございます。調べてみます!