Azure Computer Vision Read API【数字認識】

前提

・目的は、A4サイズの画像から数字のみを認識すること

・精度向上のために、画像形式(JPEGやPNG)、画像解像度(300DPI以上)とすること

ライブラリのインストール

pip install azure-cognitiveservives-vision-computervision

PYTHON

from azure.cognitiveservices.vision.computervision import ComputerVisionClient
from azure.cognitiveservices.vision.computervision.models import OperationStatusCodes
from msrest.authentication import CognitiveServicesCredentials
import time

# key, endpoint
subscription_key = "あなたのキー"
endpoint = "あなたのエンドポイント"

# initialize client
computervision_client = ComputerVisionClient(endpoint, CognitiveServicesCredentials(subscription_key))

def extract_text_from_image(image_path):
    """画像からテキストを抽出する"""
    # call Read API
    with open(image_path, "rb") as image_file:
        read_response = computervision_client.read_in_stream(image_file, raw=True)
    
    # get operation ID
    operation_location = read_response.headers["Operation-Location"]
    operation_id = operation_location.split("/")[-1]

    # wait until get result
    while True:
        read_result = computervision_client.get_read_result(operation_id)
        if read_result.status not in [OperationStatusCodes.not_started, OperationStatusCodes.running]:
            break
        time.sleep(1)
    
    # process results
    if read_result.status == OperationStatusCodes.succeeded:
        extracted_text = []
        # read_resultはJSON形式になっているため、入れ子の中のread_resultsを抜き取る
        for result in read_result.analyze_result.read_results:
            for line in result.lines:
                extracted_text.append(line.text)
        return extracted_text
    else:
        print("テキスト認識に失敗しました")
        return None


# 画像パスを指定
# バックスラッシュ(\)はエスケープ文字として解釈されるため、\\にするか/にするかr""とすること
image_path = "C:/Windows/System32/pj/app/sample.png"
recognized_text = extract_text_from_image(image_path)

# 数字のみを抽出/文字を抽出
if recognized_text:
    numbers = [text for text in recognized_text if text.isdigit()]
    print("認識された数字:", numbers)
    finaltexts = [text for text in recognized_text]
    print("認識された文字", finaltexts)

反省点

・2つの枠が隣接している場合、くっついている部分が「1」と認識されることがありました

⇒実線→点線に変えました

・「23」として認識される部分と、「2」と「3」の2つの数字として認識される部分がありました

⇒枠同士をより離す必要があります

・「1月25日」と認識される場合と、「1月25」「日」と認識される部分がありました

⇒数字と文字を別の行に書くようにしました

・「L」が「1」として認識されてしまいました。

⇒「リットル」と書くようにしました

・「8」をいい加減に書くと認識できない場合がありました

⇒デジタル数字のように書くことで書き方を統一しました

・デジタル数字を書いたとき、「8」が「日」として認識され、「6」が「b」として認識されてしまいました