Эта статья написана в сотрудничестве с Энтони Франклином, доктором философии из Microsoft.

В связи с быстрым развитием технологий большинство повседневных транзакций, с которыми мы имеем дело, было перенесено в Интернет. Хотя необработанные отсканированные документы позволяют хранить в цифровом виде, обычно сохраняется потребность в интеллектуальном структурировании и анализе содержимого в форме. В Azure AI есть лучшие в своем классе службы распознавания текста и инструменты искусственного интеллекта, которые можно использовать для интеллектуального извлечения информации из рукописных документов. В этом блоге вы познакомитесь с конкретным вариантом использования, используя как Azure Cognitive Services, так и Azure Databricks.

Пример использования:

Формы приема в больницу необходимы всем посетителям, независимо от того, посещали они ранее или нет. Больница хочет использовать миллионы заполненных форм для будущих исследований. Поскольку эта форма заполняется по запросу, обычно она пишется от руки. Это означает, что персонал больницы сталкивается с проблемой ручного и дорогостоящего ручного процесса. Большинство больниц сочли бы большую ценность и экономию времени, если бы они могли автоматизировать этот процесс. Итак, что им делать?

Почему Azure Cognitive & Databricks:

Microsoft Azure предоставляет набор сервисов машинного обучения и искусственного интеллекта для практиков, которые можно использовать в самых разных сценариях использования. Двумя наиболее популярными наборами служб являются Azure Cognitive Services и Azure Databricks. Когнитивные службы Azure - это API, пакеты SDK и службы, предоставляющие готовые модели искусственного интеллекта, позволяющие разработчикам использовать когнитивные функции в своих интеллектуальных приложениях. Услуги разделены на 6 модулей: зрение, речь, язык, поиск, лабораторные работы и знания. Любой специалист-аналитик может выполнить классификацию изображений, просто вызвав RESTful API. Обычно процесс классификации изображений требует обучения модели с сотнями тысяч или миллионами изображений, а затем соответствующей инфраструктуры для развертывания модели как услуги. Все это сделано за вас (спасибо, Azure!). С другой стороны, Azure Databricks (ADB) - это быстрая, простая и совместная аналитическая служба на основе Apache Spark. Azure Databricks предоставляет интерактивную рабочую область с похожей на записную книжкой средой для разработки.

Во многих анализах результаты службы классификации изображений являются просто этапом разработки, и эта информация может использоваться в качестве входных данных для другого процесса. В случаях, когда дальнейшее развитие полученной информации требует более значительной распределенной обработки, предпочтительным приложением может быть ADB. Более того, бывают случаи, когда ADB используется для работы конвейера данных и предоставления дополнительной информации к результатам классификации изображений. В любом сценарии есть четкие варианты использования для объединения когнитивных служб Azure и Azure Databricks.

Предварительные требования:

1. Вы создали когнитивную службу компьютерного зрения. ("Узнать, как")

2. Вы создали учетную запись хранения BLOB-объектов, в которой хранятся файлы изображений. ("Узнать, как")

3. Вы создали экземпляр рабочего пространства ADB, следуйте инструкциям по этой ссылке. ("Узнать, как").

4. Образец формы. Образец формы, используемый в этом сценарии, показан на изображении 1 ниже. «Пациент» - джентльмен по имени Бенджамин Баттон, родился 25 декабря 1965 года и получил травму во время игры в баскетбол. Посмотрим, сможет ли наша служба технического зрения зафиксировать ту же информацию.

Эта статья - первый шаг (Часть 1) в серии. В первой части мы рассмотрим, как преобразовать большой набор форм, заполненных от руки, в компьютерно-читаемый набор данных. И поговорим о том, как отформатировать набор данных и проанализировать его в следующих разделах.

Как?

Создайте кластер ADB:

Мы начинаем этот пример с ранее созданного экземпляра рабочего пространства ADB. Затем мы должны создать кластер Azure Databricks со следующими характеристиками:

  • Название кластера: ‹На ваш выбор›
  • Параметры автопилота: Завершить после «60» минут бездействия
  • Тип работника:
  • ВМ: Standard_DS3_v2
  • Мин. = 2, Макс. = 4
  • Остальные параметры: по умолчанию

Установите пакет SDK для Python для когнитивных служб Azure:

После создания кластера нам необходимо установить пакет SDK для компьютерного зрения Azure Cognitive Service. Сначала перейдите к структуре папок рабочей области этого проекта и «щелкните правой кнопкой мыши» в открытом пространстве. Выберите в меню опцию «Импорт». Выберите гиперссылку «щелкните здесь» внизу, чтобы импортировать библиотеку. Это приведет вас к диалоговому окну с параметрами для ввода информации о библиотеке (см. Изображение ниже).

Затем выберите «Загрузить Python Egg или PyPi» в качестве источника и введите в рамку следующее имя PyPi: «azure-cognitiveservices-vision-computervision». Затем нажмите кнопку «Установить библиотеку», чтобы завершить установку. Повторите этот процесс, чтобы установить библиотеку «запросов» из PyPi. Обязательно перейдите к соответствующему кластеру, который вы создали, и присоедините эту библиотеку к этому кластеру.

Ноутбук ADB:

Нам нужно создать новую записную книжку Python в папке вашего проекта. Подключите ноутбук к активному кластеру (вы узнаете зеленую точку, когда кластер активен).

Мы подробно опишем необходимые фрагменты кода для вызова когнитивной службы в вашем блокноте рабочего пространства ADB. Приведенные ниже фрагменты кода могут служить шаблоном для вызова службы компьютерного зрения и просто могут быть непосредственно вставлены в ячейку в вашей записной книжке ADB на Python. Полный код можно найти здесь.

Шаг 1 Импортируйте модули

Первым шагом является импорт определенного Azure «ComputerVisionClient» вместе с его соответствующим классом «CognitiveServiceCredentials». Клиент компьютерного зрения - это настраиваемый класс Azure, предназначенный для расширения клиента службы для выполнения запросов. Класс CognitiveServiceCredentials создает объект учетных данных, который однозначно идентифицирует подписку клиента. Библиотека запросов - это популярная библиотека для выполнения HTTP-запросов.

from azure.cognitiveservices.vision.computervision import ComputerVisionClient
from msrest.authentication import CognitiveServicesCredentials
import requests
import os
import time
import json

Шаг 2 Установите контейнер для хранения BLOB-объектов

Azure Databricks не предназначен для постоянного хранения файлов. Итак, чтобы получить доступ к нашим данным и файлам, мы настроим указатель на наш ранее созданный контейнер хранилища BLOB-объектов Azure. Этот указатель называется точкой монтирования. В приведенном ниже коде показано, как создать точку монтирования с использованием соответствующих конфигураций. Во-первых, мы должны указать источник и указать URL-адрес Blob. Атрибут точки подключения - это имя папки, которая будет использоваться в Azure Databricks. Он должен начинаться с «/ mnt /…» для всех точек монтирования. Дополнительные конфигурации используются, чтобы убедиться, что пользователь может аутентифицироваться и подключиться к контейнеру BLOB.

dbutils.fs.mount(source = “wasbs://<your-container-name>@<your-storage-account-name>.blob.core.windows.net/”, mount_point = “/mnt/<desired-folder-name> “, extra_configs = {“fs.azure.account.key.<your-storagre-account-name>.blob.core.windows.net”:”<your_account_key>”})

Шаг 3 Определите классы

Чтобы упростить приложение клиента, мы предлагаем вам создать несколько пользовательских классов для консолидации важной информации.

Определите класс с двумя атрибутами:

url: конечная точка вашей пользовательской службы технического зрения, например (https://eastus.api.cognitive.microsoft.com/).

ключ: ваш ключ к когнитивным услугам. Вы можете получить его из своей специализированной службы технического зрения, в разделе «Управление ресурсами» нажмите «Ключи»:

class CognitiveConfig:
def __init__(self, url, key):
self.url = url
self.key = key

Определите класс для пути к изображению:

storagePath: путь к папке подключенного большого двоичного объекта. Например: «/ dbfs / mnt / forms» (обратите внимание на добавление «/ dbfs» к месту монтирования, которое вы указали выше)

imgName: имя файла изображения.

function getFullPath: Объедините путь к папке и путь к файлу изображения вместе с допустимым путем к файлу.

class Img:
def __init__(self, storagePath, imgName):
self.storagePath = storagePath
self.imgName = imgName
def getFullPath(self):
return os.path.join(self.storagePath, self.imgName)

Определите класс для изображения в текстовом режиме:

Режим: тип текста для распознавания. Возможные значения: «Рукописный» и «Напечатанный».

isRaw: если возвращает true, вернет прямой ответ вместе с десериализованным ответом.

class ImgToTextMode:
def __init__(self, mode, isRaw):
self.mode = mode
self.isRaw = isRaw

Шаг 4 Инициируйте переменные

Затем мы инициируем переменные из пользовательских классов, созданных выше.

cogConfig = CognitiveConfig(“https://eastus.api.cognitive.microsoft.com/", “<your_Cognitive_service_key>”)
img = Img(<your_Azure_data_storage_folder_path>,”medical_form.jpg”)
mode = ImgToTextMode(“HANDWRITTEN”, True)

Шаг 5 Функция определения изображения в текст

В этой функции мы сначала запускаем «ComputerVisionClient», а затем передаем изображение в потоковом формате функции, называемой «распознавать_текст_в_стриме». Клиенту компьютерного зрения требуется предоставленная конечная точка когнитивной службы владельца учетной записи и ключ подписки владельца учетной записи. Клиентский объект является основным агентом для вызова службы компьютерного зрения. Поскольку мы используем функцию OCR, для этого необходимо вызвать метод «распознавать_текст_в_стриме».

Таймер здесь просто дает компьютерному зрению некоторое время для обработки изображения, вы также можете использовать состояние проверки цикла while.

def retrieve_text_from_img(cogConfig, img, imgToTextMode):
client = ComputerVisionClient(cogConfig.url, CognitiveServicesCredentials(cogConfig.key))
with open(img.getFullPath(), “rb”) as image_stream:
txt_analysis=client.recognize_text_in_stream(image_stream, mode = imgToTextMode.mode, raw = imgToTextMode.isRaw)
headers = {‘Ocp-Apim-Subscription-Key’:cogConfig.key}
url = txt_analysis.response.headers[‘Operation-Location’]
time.sleep(20)
return json.loads(requests.get(url, headers = headers).text)

Шаг 6 Функция вызова службы:

words = retrieve_text_from_img(cogConfig, img, mode)
print(words)

Если вы выполните код, описанный выше, вы получите выходные данные в формате JSON от службы компьютерного зрения. Теперь давайте посмотрим на результат вызова. Выходные данные структурированы таким образом, чтобы отделить каждую ограничивающую рамку с координатами и текстом (выходные данные обрезаются по месту). Обратите внимание на выделенный текст, который соответствует написанному нами.

{
‘status’: ‘Succeeded’, 
‘recognitionResult’: {
        ‘lines’: [
                  {
                   ‘boundingBox’: [783, ...525], 
                   ‘words’: [
                       {
                        ‘boundingBox’: [776,..521], 
                        ‘text’: ‘Patient’}, 
                        {
                         ‘boundingBox’: [1032, ...526], 
                         ‘text’: ‘Medical’
                        }...
                    ], 
                   ‘text’: ‘Patient Medical History Form’
                   }, 
                   {
                    ‘boundingBox’: [325...627], 
                    ‘words’: [
                       {
                       ‘boundingBox’: [326...625], 
                       ‘text’: ‘Please’
                       }...
                   ], 
              ‘text’: ‘Please provide your name and date of birth’
                },
                {
                ‘boundingBox’: [327...709], 
                ‘words’: [...],
                ‘text’: ‘First Name :”’
                }, 
                {
                ‘boundingBox’: [...], 
                ‘words’: [..], 
                ‘text’:‘Benjamin’
                }, 
                ...                
                {
                 'bouningBox':[...],
                 'words':[...],
                 ‘text’: ‘Reason for seeing the doctor*’
                }, 
                {
                 `boundingBox’: [..], 
                  ‘words’: [...], 
                  ‘text’: ‘I hurt my leg playing basketball yesterday .’}, …

Вот и все! Все вопросы и ответы в анкете пациента красиво разбираются в формате JSON. В следующем блоге будет описано, как анализировать выходной текст JSON и помещать его в формат структурированной таблицы для хранения в подключенном хранилище данных. Хлопайте, если считаете, что это полезно, или не стесняйтесь оставлять свои вопросы;)