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」として認識されてしまいました
⇒