質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.74%

  • Python 3.x

    5278questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • API

    1420questions

    APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

  • Google API

    480questions

    Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

  • Google Cloud Platform

    114questions

CloudVisionAPIでOCR(DOCUMENT_TEXT_DETECTION)

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 208

ryounaman19

score 12

CloudVisionAPIのDOCUMENT_TEXT_DETECTIONを用いて画像から文字を抽出しています
使用言語:Python3

問題点:レスポンスにconfidenceという情報が含まれ、confidenceはすべてのblock/paragraph/word/symbolに含まれています。しかし、symbolにconfidenceが含まれないことが稀に起こります。確率的には48036文字中67文字です。あらゆる角度から検証しましたが、理由がわかりません。

確認に用いたコード

import json
import glob
json_path_from_list=glob.glob('./RawJSON/*')
#confidenceが含まれなかった回数
no_confidence_number=0
#総文字数
char_number=0
for json_path_from in json_path_from_list:
    with open(json_path_from) as fr:
        json_data = json.load(fr)
        for response_j in json_data["responses"]:
            for page_j in response_j["fullTextAnnotation"]["pages"]:
                for block_j in page_j["blocks"]:
                    x=block_j["confidence"]
                    for paragraph_j in block_j["paragraphs"]:
                        x=paragraph_j["confidence"]
                        for word_j in paragraph_j["words"]:
                            x=word_j["confidence"]
                            #confidenceを保持しない文字の信用度格納
                            symbol_confidence_list=[]
                            #confidenceを保持しない文字が作る単語格納
                            word=""
                            #symbolsのループが終わって、confidenceを保持しない文字が含まれていた場合、諸々表示のフラグ
                            flag=0
                            for symbol_j in word_j["symbols"]:
                                #総文字数カウント
                                char_number+=1
                                try:
                                    #confidenceをとってこれるか
                                    x=symbol_j["confidence"]
                                    #単語生成
                                    word=word+symbol_j["text"]
                                    #信用度格納
                                    symbol_confidence_list.append(symbol_j["confidence"])
                                except:
                                    #単語生成
                                    word=word+symbol_j["text"]
                                    #confidenceを保持しなかった文字を記憶
                                    no_confidence_text=symbol_j
                                    #printフラグを立てる
                                    flag=1
                            #symbolsの中にconfidenceを持たない文字があった時だけ詳細情報を表示
                            if flag==1:
                                #confidenceがなかった文字数カウント
                                no_confidence_number+=1
                                #ファイル名
                                print(json_path_from)
                                #単語
                                print(word)
                                #confidenceを保持していなかった文字
                                print(no_confidence_text)
                                #上位Wrapperの信用度
                                print(word_j["confidence"])
                                print(paragraph_j["confidence"])
                                print(block_j["confidence"])
                                #信用度を保持していなかった文字を除く文字たちの信用度
                                print(symbol_confidence_list)
                                print("________________________________________________")
                            else:pass
#confidenceがなかった文字数
print(no_confidence_number)
#総文字数
print(char_number)

念のためにCloudVisionAPIに投げたリクエストも見てください
DOCUMENT_TEXT_DETECTIONに対して、日本語の指定をしただけです

import json
import base64
import requests
#base64エンコード関数
def convert_img_to_base64(img_path):
    img_data = open(img_path, 'rb').read()
    img_base64 = base64.b64encode(img_data).decode()
    return img_base64
#OCRクラスの定義
class OCR:
    def __init__(self,api_key):
        self.api_key=api_key
    def get_json_responce_from_img(self,img_base64,json_request):
        json_request['requests'][0]['image']['content']=img_base64
        url="https://vision.googleapis.com/v1/images:annotate?key="+self.api_key
        result=requests.post(url,json.dumps(json_request),headers={'Content-Type': 'application/json'})
        return result.text
#APIキー
API_KEY="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
#画像のパス
img_path="./test.jpg"
#JSONリクエスト文
json_request={'requests':[{'image':{'content':""},'features': {'type': "DOCUMENT_TEXT_DETECTION"},'imageContext':{'languageHints':"ja"}}]}
#img_base64に変換後の画像を保存
img_base64=convert_img_to_base64(img_path)
#OCRクラスのインスタンス生成
ocr=OCR(API_KEY)
#JSONレスポンス
data=json.loads(ocr.get_json_responce_from_img(img_base64,json_request))
#JSONレスポンスを保存
with open("./test.json",'w') as fw:
    json.dump(data,fw,indent=4)
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

check解決した方法

0

その他にも、矩形領域が抜け落ちるなど、ちらほら不具合がありましたので、バグと認定しまして、対策を講じました

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

https://cloud.google.com/vision/docs/reference/rest/v1/images/annotate

confidence

携帯からなので間違ってたらすいません。confidenceは廃止に見受けられますが、違いますかね?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/19 01:05

    そちらの写真はtextAnnotationのレスポンスの説明と思われます。fullTextAnnotationはconfidenceは健在です。回答してくださったページをもう一度詳しく見てみましたが、やはり、confidenceがレスポンスに付与されないことは考えられないです。。。。どういうことなんでしょうか???

    キャンセル

  • 2018/04/19 01:12

    それは失礼しました。これ以上は私から何もありません。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.74%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python 3.x

    5278questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • API

    1420questions

    APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

  • Google API

    480questions

    Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

  • Google Cloud Platform

    114questions