Azure OCR API останавливается после 90 изображений.Как исправить ошибку подключения? - PullRequest
0 голосов
/ 26 декабря 2018

Я пытаюсь запустить Azure OCR API для более чем 6000 изображений.К сожалению, код останавливается только после 90 изображений.

Документация:

  1. https://docs.microsoft.com/en-us/azure/cognitive-services/computer-vision/quickstarts/python-print-text#prerequisites
  2. https://docs.microsoft.com/en-us/azure/cognitive-services/computer-vision/quickstarts/python-disk

Ввод: 6000+ изображений (.png)

Требуемый вывод:

  1. Файл только с извлеченным текстом
  2. Файл с извлеченным текстом и соответствующими им ограничивающими прямоугольниками

Сообщение об ошибке: ConnectionError: HTTPSConnectionPool (host = 'westcentralus.api.cognitive.microsoft.com', port =443): максимальное количество повторных попыток превышено с помощью url: /vision/v2.0/ocr?language=unk&detectOrientation=true (вызвано NewConnectionError (': не удалось установить новое соединение: [Errno -2] имя или служба неизвестна',))

Я предоставил задержку в 60 секунд после каждых 10 изображений, что в идеале должно учитывать квоту в 20 транзакций в минуту.

import warnings
warnings.filterwarnings("ignore")

import glob
import os
import requests
import pandas as pd
import time

# Replace the value of subscription_key with your subscription key.
subscription_key = "{key}"
assert subscription_key

# Replace the value of vision_base_url (not necessary for trial version)
vision_base_url="https://westcentralus.api.cognitive.microsoft.com/vision/v2.0/"
analyze_url = vision_base_url + "ocr"

# Initializing Source and Output Directories
source_directory = glob.glob('folder/with/6000/images/*.png')
output_directory_textFiles = 'folder/for/saving/6000/textFiles/'
output_directory_JSONFiles = 'folder/for/saving/6000/JSONFiles/'

if not os.path.exists(output_directory_textFiles):
        os.makedirs(output_directory_textFiles)

if not os.path.exists(output_directory_JSONFiles):
        os.makedirs(output_directory_JSONFiles)

# Define Function for Extracting Text

def extract_text(image_path):
# Read the image into a byte array
image_data = open(image_path, "rb").read()
headers    = {'Ocp-Apim-Subscription-Key': subscription_key,'Content-Type': 'application/octet-stream'}
params     = {'language': 'unk', 'detectOrientation': 'true'}
response = requests.post(analyze_url, headers=headers, params=params, data=image_data)
analysis = response.json()

# Extract the word bounding boxes and text.
line_infos = [region["lines"] for region in analysis["regions"]]
word_infos = []
for line in line_infos:
    for word_metadata in line:
        for word_info in word_metadata["words"]:
            word_infos.append(word_info)
return(word_infos)

# Generating Text and JSON Files

counter = 0
for image in sorted(source_directory):
    counter += 1
    print(r'Processing %d %s' %(counter, image))

    word_infos = extract_text(image)

    filename = image.split('/')[-1].replace('.png', '')

    if len(word_infos) != 0:
        bboxOutput = pd.DataFrame(word_infos)
        bboxOutput[['x','y', 'width','height']] =     bboxOutput['boundingBox'].str.split(',',expand=True)
        bboxOutput = bboxOutput.drop(['boundingBox'], axis=1)

        textFile = bboxOutput['text']     

        textFile = textFile.to_csv(r'{}/{}.txt'.format(output_directory_textFiles, filename), header = False, index = None, sep = ',')
        jsonFile = bboxOutput.to_json(orient = 'records')
        with open(r'{}/{}.txt'.format(output_directory_JSONFiles, filename), 'w') as f:
            f.write(jsonFile)
            f.close()

    else:
        word_infos = pd.DataFrame(word_infos)
        textFile = word_infos.to_csv(r'{}/{}.txt'.format(output_directory_textFiles, filename), header = False, index = None, sep = ',')
        jsonFile = word_infos.to_json(orient = 'records')
        with open(r'{}/{}.txt'.format(output_directory_JSONFiles, filename), 'w') as f:
            f.write(jsonFile)
            f.close()

    if (counter % 10) == 0:
        time.sleep(60)

    else:
        pass

1 Ответ

0 голосов
/ 26 декабря 2018

Я предлагаю вам попробовать изменить time.sleep вызов на 3 или 4 секунды после каждого изображения вместо 60 секунд после 10 изображений.

Хотя ограничение для бесплатного уровня составляет 20 в минуту, платное имеет ограничение в 10 в секунду, поэтому возможно, что вы достигли предела, который нарушает механизм регулирования (ваш код может отправлять10 изображений менее чем за секунду).

Надеюсь, это поможет!

...