Извлечение текста и сведений из изображений с помощью обогащения ИИ

Изображения часто содержат полезные сведения, относящиеся к сценариям поиска. Поиск с использованием ИИ Azure не запрашивает содержимое изображения в режиме реального времени, но вы можете извлечь сведения об изображении во время индексирования и сделать его доступным для поиска. Для представления содержимого изображения в индексе поиска можно использовать следующие подходы:

  • Векторизация изображений для представления визуального содержимого в виде вектора, допускаемого для поиска.
  • Словесная обработка изображений с помощью навыка генерации подсказок GenAI, который отправляет запрос на словесное описание в модель завершения чата LLM для описания изображения.
  • Анализ изображений с помощью навыка анализа изображений для создания текстового представления изображения, например одуванчика для фотографии одуванчика или желтого цвета. Также можно извлечь такие метаданные изображения, как его размер.
  • Используйте OCR для извлечения текста и фотографий или рисунков, таких как слово STOP в знаке остановки.

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

В этой статье рассматриваются анализ изображений и OCR, пользовательские навыки, обеспечивающие внешнюю обработку, работу с внедренными изображениями и перекладывание визуализаций на исходные изображения. Если словесность или векторизация — это предпочтительный подход, см. статью "Многомодальный поиск ".

Чтобы работать с содержимым изображения в наборе навыков, вам потребуется:

  • Исходные файлы, содержащие изображения
  • Индексатор поиска, настроенный для действий с изображением
  • Набор навыков со встроенными или настраиваемыми навыками, которые вызывают анализ OCR или изображения
  • Индекс поиска с полями для получения проанализированных текстовых выходных данных, а также сопоставления полей выходных данных в индексаторе, который устанавливает связь

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

Настройка исходных файлов

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

  • Анализ изображений поддерживает JPEG, PNG, GIF и BMP
  • OCR поддерживает JPEG, PNG, BMP и TIF

Изображения — это автономные двоичные файлы или внедренные в документы, такие как PDF, RTF или файлы приложений Майкрософт. Из данного документа можно извлечь не более 1000 изображений. Если в документе более 1000 изображений, извлекаются первые 1000 изображений, а затем создается предупреждение.

Хранилище BLOB-объектов Azure чаще всего используется для хранения и обработки изображений в Поиск с использованием ИИ Azure. Три основные задачи, связанные с извлечением изображений из BLOB-контейнера:

Настройка индексаторов для обработки изображений

После настройки исходных файлов включите нормализацию изображений, задав imageAction параметр в конфигурации индексатора. Нормализация изображений помогает сделать изображения более универсальными для последующей обработки. Нормализация изображений включает следующие операции:

  • Большие изображения изменяются до максимальной высоты и ширины, чтобы сделать их универсальными.
  • Для изображений с метаданными, указывающими ориентацию, поворот изображения настраивается для вертикальной загрузки.

Обратите внимание, что при включении imageAction (установке этого параметра на значение, отличное от none) будет взиматься дополнительная плата за извлечение изображений в соответствии с тарифами службы Поиск с использованием ИИ Azure.

Изменения метаданных записываются в сложном типе, создаваемом для каждого изображения. Вы не можете отказаться от требования нормализации изображений. Навыки, работающие с изображениями, такие как OCR и анализ изображений, ожидают предварительно нормализованных изображений.

  1. Создайте или обновите индексатор , чтобы задать свойства конфигурации:

    {
      "parameters":
      {
        "configuration": 
        {
           "dataToExtract": "contentAndMetadata",
           "parsingMode": "default",
           "imageAction": "generateNormalizedImages"
        }
      }
    }
    
  2. Установите dataToExtract в contentAndMetadata (обязательно).

  3. Убедитесь, что parsingMode задано значение по умолчанию (обязательно).

    Этот параметр определяет степень детализации документов поиска, созданных в индексе. Режим по умолчанию создает однозначное соответствие, так что один blob приводит к одному документу поиска. Если документы большие или навыки требуют использования меньших фрагментов текста, можно добавить навык разделения текста, который подразделяет документ на страницы для целей обработки. Но для сценариев поиска требуется один BLOB для каждого документа, если обогащение включает обработку изображений.

  4. Установите imageAction, чтобы включить узел normalized_images в дереве обогащения (требуемо):

    • generateNormalizedImages для создания массива нормализованных изображений в рамках взлома документов.

    • generateNormalizedImagePerPage (применяется только к PDF-файлу) для создания массива нормализованных изображений, где каждая страница в PDF-файле отображается на одном выходном изображении. Для файлов, отличных от PDF, поведение этого параметра похоже на то, как если бы вы установили generateNormalizedImages. Однако параметр generateNormalizedImagePerPage может сделать операцию индексирования менее производительной путем проектирования (особенно для больших документов), так как необходимо создать несколько образов.

  5. При необходимости настройте ширину или высоту созданных нормализованных изображений:

    • normalizedImageMaxWidth в пикселях. Значение по умолчанию — 2000. Максимальное значение равно 10 000.

    • normalizedImageMaxHeight в пикселях. Значение по умолчанию — 2000. Максимальное значение равно 10 000.

    Значение по умолчанию 2000 пикселей для нормализованных изображений максимальной ширины и высоты основано на максимальных размерах, поддерживаемых навыком OCR и навыком анализа изображений. Навык OCR поддерживает максимальную ширину и высоту 4200 для неанглийских языков и 10 000 для английского. Если увеличить максимальные пределы, обработка может завершиться сбоем на больших изображениях в зависимости от того, как определен набор навыков, и языка, используемого в документах.

  6. При необходимости установите критерии типа файла, если рабочая нагрузка предназначена для определенного типа файла. Конфигурация индексатора BLOB-объектов включает в себя параметры включения файлов и исключений. Вы можете отфильтровать файлы, которые вы не хотите.

{
  "parameters" : { 
      "configuration" : { 
          "indexedFileNameExtensions" : ".pdf, .docx",
          "excludedFileNameExtensions" : ".png, .jpeg" 
      } 
  }
}

Сведения о нормализованных изображениях

Если imageAction задано значение, отличное от ни одного, новое normalized_images поле содержит массив изображений. Каждое изображение представляет сложный тип со следующими элементами:

Компонент изображения Description
data Строка нормализованного изображения в формате JPEG в кодировке Base64.
width Ширина нормализованного изображения в пикселях.
height Высота нормализованного изображения в пикселях.
originalWidth Исходная ширина изображения перед нормализацией.
originalHeight Исходная высота изображения перед нормализацией.
rotationFromOriginal Поворот против часовой стрелки (в градусах), выполняемый для создания нормализованного изображения. Значение от 0 до 360 градусов. На этом этапе считываются метаданные изображения, созданного камерой или сканером. Обычно это кратное 90 градусам.
contentOffset Смещение символов в содержимом поля, из которого было извлечено изображение. Это поле используется только для файлов с внедренными изображениями. Для contentOffset изображений, извлеченных из ДОКУМЕНТОВ PDF, всегда находится в конце текста на странице, из который он был извлечен из документа. Это означает, что изображения отображаются после всего текста на этой странице независимо от исходного расположения изображения на странице.
pageNumber Если изображение было извлечено или визуализировано из PDF-документа, это поле содержит номер страницы в PDF-файле, из которого оно было извлечено или отрисовано, начиная с 1. Если изображение не из PDF-файла, это поле равно 0.
boundingPolygon Если изображение было извлечено или отрендерено из PDF-файла, это поле содержит координаты ограничивающего многоугольника, который охватывает изображение на странице. Многоугольник представлен как вложенный массив точек, где каждая точка имеет координаты x и y, нормализованные для размеров страницы. Это относится только к изображениям, извлеченным с помощью imageAction: generateNormalizedImages.

Пример значения normalized_images:

[
  {
    "data": "BASE64 ENCODED STRING OF A JPEG IMAGE",
    "width": 500,
    "height": 300,
    "originalWidth": 5000,  
    "originalHeight": 3000,
    "rotationFromOriginal": 90,
    "contentOffset": 500,
    "pageNumber": 2,
    "boundingPolygon": "[[{\"x\":0.0,\"y\":0.0},{\"x\":500.0,\"y\":0.0},{\"x\":0.0,\"y\":300.0},{\"x\":500.0,\"y\":300.0}]]"
  }
]

Note

Данные ограничивающего многоугольника представлены в виде строки, содержащей дважды вложенный массив многоугольников в формате JSON. Каждый многоугольник представляет собой массив точек, где каждая точка имеет координаты x и y. Координаты относительно PDF-страницы с источником (0, 0) в левом верхнем углу. В настоящее время изображения, извлеченные с помощью imageAction: generateNormalizedImages, всегда создают один многоугольник, но двойная вложенная структура поддерживается для согласованности с функцией макета документа, которая поддерживает несколько многоугольников.

Определение наборов навыков для обработки изображений

Этот раздел дополняет справочные статьи о навыках, предоставляя контекст для работы с входными данными навыка, выходными данными и шаблонами, так как они относятся к обработке изображений.

  1. Создайте или обновите набор навыков для добавления навыков.

  2. Добавьте шаблоны для анализа OCR и анализа изображений из портала Azure или скопируйте определения из документации skill reference. Вставьте их в массив навыков вашего набора навыков.

  3. При необходимости включите ключ ресурса Microsoft Foundry в набор навыков. Поиск с использованием ИИ Azure выполняет вызовы оплачиваемого ресурса Microsoft Foundry для OCR и анализа изображений для транзакций, превышающих бесплатный предел (20 на индексатор в день). Если вы не используете подключение без ключа (предварительная версия), ресурс Microsoft Foundry должен находиться в том же регионе, что и search service.

  4. Если исходные изображения внедрены в PDF-файлы или файлы приложений, например PPTX или DOCX, необходимо добавить навык слияния текста, если вы хотите, чтобы выходные данные изображения и текстовые выходные данные были вместе. Работа с внедренными изображениями рассматривается далее в этой статье.

После создания базового набора навыков и настройки средств Foundry вы можете сосредоточиться на каждом навыке изображения, определении входных данных и контексте источника и сопоставлении выходных данных с полями в индексе или хранилище знаний.

Note

Пример набора навыков, объединяющего обработку изображений с последующей обработкой естественного языка, см. в руководстве Урок REST: использование REST и AI для создания контента с возможностью поиска из Azure blobs. В нём показано, как использовать вывод данных о навыках для распознавания сущностей и извлечения ключевых фраз.

Входные данные для обработки изображений

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

  • /document/normalized_images/* предназначен для документов, которые обрабатываются целиком.

  • /document/normalized_images/*/pages предназначен для документов, обрабатываемых в блоках (страницах).

Если вы используете OCR и анализ изображений в одном и том же, входные данные имеют практически одно и то же построение:

    {
      "@odata.type": "#Microsoft.Skills.Vision.OcrSkill",
      "context": "/document/normalized_images/*",
      "detectOrientation": true,
      "inputs": [
        {
          "name": "image",
          "source": "/document/normalized_images/*"
        }
      ],
      "outputs": [ ]
    },
    {
      "@odata.type": "#Microsoft.Skills.Vision.ImageAnalysisSkill",
      "context": "/document/normalized_images/*",
      "visualFeatures": [ "tags", "description" ],
      "inputs": [
        {
          "name": "image",
          "source": "/document/normalized_images/*"
        }
      ],
      "outputs": [ ]
    }

Сопоставление выходных данных с полями поиска

В наборе навыков выходные данные навыка анализа изображений и навыка OCR всегда являются текстом. Выходной текст представлен как узлы во внутреннем обогащенном дереве документов, и каждый узел должен быть сопоставлен с полями в индексе поиска или проекциями в хранилище знаний, чтобы сделать содержимое доступным в приложении.

  1. В наборе навыков просмотрите outputs раздел каждого навыка, чтобы определить, какие узлы существуют в обогащенном документе:

    {
      "@odata.type": "#Microsoft.Skills.Vision.OcrSkill",
      "context": "/document/normalized_images/*",
      "detectOrientation": true,
      "inputs": [ ],
      "outputs": [
        {
          "name": "text",
          "targetName": "text"
        },
        {
          "name": "layoutText",
          "targetName": "layoutText"
        }
      ]
    }
    
  2. Создайте или обновите индекс поиска, чтобы добавить поля для принятия выходных данных навыка.

    В следующем примере коллекции полей содержимое — это содержимое BLOB-объекта. Metadata_storage_name содержит имя файла (установлено retrievable в true). Metadata_storage_path является уникальным путем BLOB и является ключом документа по умолчанию. Merged_content — это выходные данные из слияния текста, полезные при внедрении изображений.

    Text и layoutText — это результаты работы навыка OCR и должны быть коллекцией строк, чтобы охватить все выходные данные, сгенерированные OCR, для всего документа.

      "fields": [
        {
          "name": "content",
          "type": "Edm.String",
          "filterable": false,
          "retrievable": true,
          "searchable": true,
          "sortable": false
        },
        {
          "name": "metadata_storage_name",
          "type": "Edm.String",
          "filterable": true,
          "retrievable": true,
          "searchable": true,
          "sortable": false
        },
        {
          "name": "metadata_storage_path",
          "type": "Edm.String",
          "filterable": false,
          "key": true,
          "retrievable": true,
          "searchable": false,
          "sortable": false
        },
        {
          "name": "merged_content",
          "type": "Edm.String",
          "filterable": false,
          "retrievable": true,
          "searchable": true,
          "sortable": false
        },
        {
          "name": "text",
          "type": "Collection(Edm.String)",
          "filterable": false,
          "retrievable": true,
          "searchable": true
        },
        {
          "name": "layoutText",
          "type": "Collection(Edm.String)",
          "filterable": false,
          "retrievable": true,
          "searchable": true
        }
      ],
    
  3. Обновите индексатор , чтобы сопоставить выходные данные набора навыков (узлы в дереве обогащения) с полями индекса.

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

      "outputFieldMappings": [
        {
          "sourceFieldName": "/document/normalized_images/*/text",
          "targetFieldName": "text"
        },
        {
          "sourceFieldName": "/document/normalized_images/*/layoutText",
          "targetFieldName": "layoutText"
        }
      ]
    
  4. Запустите индексатор, чтобы вызвать извлечение исходного документа, обработку изображений и индексирование.

Проверка результатов

Выполните запрос к индексу, чтобы проверить результаты обработки изображений. Используйте обозреватель поиска в качестве клиента поиска или любого средства, отправляющего HTTP-запросы. Следующий запрос выбирает поля, содержащие выходные данные обработки изображений.

POST /indexes/[index name]/docs/search?api-version=[api-version]
{
    "search": "*",
    "select": "metadata_storage_name, text, layoutText, imageCaption, imageTags"
}

OCR распознает текст в файлах изображений. Это означает, что поля OCR (text и layoutText) пусты, если исходные документы являются чистыми текстовыми или чистыми изображениями. Аналогичным образом поля анализа изображений (imageCaption и imageTags) пусты, если входные данные исходного документа являются строго текстовыми. Выполнение индексатора выдает предупреждения, если входные данные изображения пусты. Такие предупреждения ожидаемы, когда в обогащенном документе узлы не заполнены. Помните, что индексирование BLOB-объектов позволяет включать или исключать типы файлов, если вы хотите работать с типами контента в изоляции. Эти параметры можно использовать для уменьшения шума во время выполнения индексатора.

Альтернативный запрос на проверку результатов может включать содержимое и merged_content поля. Обратите внимание, что эти поля включают содержимое для любых BLOB-файлов, включая те, в которых обработка изображений не выполнялась.

Сведения о выходных данных навыка

Выходные данные навыка: text (OCR), layoutText (OCR), merged_content, captions (анализ изображений), tags (анализ изображений):

  • text сохраняет результаты, созданные с помощью технологии OCR. Этот узел должен быть сопоставлен с полем типа Collection(Edm.String). Существует одно text поле для каждого документа поиска, состоящее из строк с разделителями-запятыми для документов, содержащих несколько изображений. На следующем рисунке показаны выходные данные OCR для трех документов. Сначала это документ, содержащий файл без изображений. Во-вторых, это документ (файл изображения), содержащий одно слово, Корпорация Майкрософт. Третий — это документ, содержащий несколько изображений, некоторые без текста ("",).

    "value": [
        {
            "@search.score": 1,
            "metadata_storage_name": "facts-about-microsoft.html",
            "text": []
        },
        {
            "@search.score": 1,
            "metadata_storage_name": "guthrie.jpg",
            "text": [ "Microsoft" ]
        },
        {
            "@search.score": 1,
            "metadata_storage_name": "Foundry Tools and Content Intelligence.pptx",
            "text": [
                "",
                "Microsoft",
                "",
                "",
                "",
                "Azure AI Search and Augmentation Combining Foundry Tools and Azure Search"
            ]
        }
    ]
    
  • layoutText хранит информацию, сгенерированную OCR, о расположении текста на странице, описанную в терминах ограничивающих прямоугольников и координат нормализованного изображения. Этот узел должен быть сопоставлен с полем типа Collection(Edm.String). В документе поиска есть одно layoutText поле, состоящее из строк с разделителями-запятыми.

  • merged_content сохраняет выходные данные навыка Text Merge и должно содержать одно большое поле типа Edm.String, содержащее необработанный текст из исходного документа, с внедренным text вместо изображения. Если файлы только текстовые, то OCR и анализ изображений не имеют ничего общего, а merged_content совпадает с content (свойство блоба, содержащее содержимое блоба).

  • imageCaption записывает описание изображения в виде отдельных тегов, а также в виде более длинного текстового описания.

  • imageTags сохраняет теги о изображении в виде коллекции ключевых слов, одну коллекцию для всех изображений в исходном документе.

На следующем снимках экрана показана иллюстрация PDF-файла, включающего текст и внедренные изображения. В документе обнаружены три встроенных изображения: стая чаек, карта, орел. Другой текст в примере (включая заголовки и основной текст) был извлечен как текст и исключен из обработки изображений.

Снимок экрана: три изображения в ФОРМАТЕ PDF.

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

  • imageCaption выходные данные — это массив описаний, один на изображение, обозначающийся tags одним словом и длинными фразами, описывающими изображение. Обратите внимание, что теги, состоящие из стаи морских чаек, плавают в воде, или крупный план птицы.

  • imageTags выходные данные — это массив отдельных тегов, перечисленных в порядке создания. Обратите внимание, что теги повторялись. Нет агрегирования или группировки.

 "imageCaption": [
      "{\"tags\":[\"bird\",\"outdoor\",\"water\",\"flock\",\"many\",\"lot\",\"bunch\",\"group\",\"several\",\"gathered\",\"pond\",\"lake\",\"different\",\"family\",\"flying\",\"standing\",\"little\",\"air\",\"beach\",\"swimming\",\"large\",\"dog\",\"landing\",\"jumping\",\"playing\"],\"captions\":[{\"text\":\"a flock of seagulls are swimming in the water\",\"confidence\":0.70419257326275686}]}",
      "{\"tags\":[\"map\"],\"captions\":[{\"text\":\"map\",\"confidence\":0.99942880868911743}]}",
      "{\"tags\":[\"animal\",\"bird\",\"raptor\",\"eagle\",\"sitting\",\"table\"],\"captions\":[{\"text\":\"a close up of a bird\",\"confidence\":0.89643581933539462}]}",
    . . .

 "imageTags": [
    "bird",
    "outdoor",
    "water",
    "flock",
    "animal",
    "bunch",
    "group",
    "several",
    "drink",
    "gathered",
    "pond",
    "different",
    "family",
    "same",
    "map",
    "text",
    "animal",
    "bird",
    "bird of prey",
    "eagle"
    . . .

Сценарий. Внедренные образы в PDF-файлах

Когда изображения, которые нужно обрабатывать, внедряются в другие файлы, например PDF или DOCX, конвейер обогащения извлекает только изображения, а затем передает их в OCR или анализ изображений для обработки. Извлечение изображений происходит на этапе взлома документа, и после разделения изображений они остаются отдельными, если вы явно не объединяете обработанные выходные данные обратно в исходный текст.

Слияние текста используется для размещения выходных данных обработки изображений обратно в документ. Несмотря на то, что слияние текста не является обязательным требованием, оно часто используется для повторного ввода выходных данных изображения (текст OCR, компоновка текста OCR, теги изображений, подписи изображений) в документ. В зависимости от умения, выходное изображение заменяет встроенное двоичное изображение текстовым эквивалентом на месте. Выходные данные анализа изображения можно объединить непосредственно в месте нахождения изображения. Выходные данные OCR всегда отображаются в конце каждой страницы.

Следующий рабочий процесс описывает процесс извлечения изображений, анализа, объединения и расширения конвейера для отправки выходных данных, обработанных изображением, в другие навыки на основе текста, такие как распознавание сущностей или преобразование текста.

  1. После подключения к источнику данных индексатор загружает и анализирует исходные документы, извлекая изображения и текст, и ставит в очередь каждый тип контента для обработки. Создан обогащенный документ, состоящий только из корневого узла (document).

  2. Изображения в очереди нормализуются и передаются в обогащенные документы как узел document/normalized_images.

  3. Обогащения изображений выполняются, используя "/document/normalized_images" в качестве входных данных.

  4. Изображения передаются в обогащенное дерево документов, каждый в виде отдельного узла. Выходные данные зависят от навыка (текст и макетТекст для OCR; теги и подписи для анализа изображений).

  5. Необязательно, но рекомендуется, если вы хотите, чтобы в поисковых документах были представлены как текст, так и текст, извлеченный из изображений. В этом случае выполняется функция Объединение текста, объединяющая текстовое представление изображений с исходным текстом, извлеченным из файла. Фрагменты текста объединяются в одну большую строку, где текст вставляется сначала в строку, а затем выходные данные текста OCR или теги изображений и субтитры.

    Результаты объединения текста теперь являются окончательным текстом для анализа всех последующих навыков, выполняющих обработку текста. Например, если набор навыков включает как распознавание объектов, так и распознавание сущностей, то входные данные распознавания сущностей должны быть "document/merged_text" (целевое имя выходных данных навыка слияния текста).

  6. После выполнения всех навыков обогащенный документ будет завершен. На последнем шаге индексаторы ссылаются на сопоставления полей вывода для отправки обогащенного содержимого отдельным полям в индексе поиска.

В следующем примере набора навыков создается merged_text поле, содержащее исходный текст документа с внедренным текстом OCRed вместо внедренных изображений. Он также включает навык распознавания сущностей, который использует merged_text в качестве входных данных.

Синтаксис текста запроса

{
  "description": "Extract text from images and merge with content text to produce merged_text",
  "skills":
  [
    {
        "description": "Extract text (plain and structured) from image.",
        "@odata.type": "#Microsoft.Skills.Vision.OcrSkill",
        "context": "/document/normalized_images/*",
        "defaultLanguageCode": "en",
        "detectOrientation": true,
        "inputs": [
          {
            "name": "image",
            "source": "/document/normalized_images/*"
          }
        ],
        "outputs": [
          {
            "name": "text"
          }
        ]
    },
    {
      "@odata.type": "#Microsoft.Skills.Text.MergeSkill",
      "description": "Create merged_text, which includes all the textual representation of each image inserted at the right location in the content field.",
      "context": "/document",
      "insertPreTag": " ",
      "insertPostTag": " ",
      "inputs": [
        {
          "name":"text", "source": "/document/content"
        },
        {
          "name": "itemsToInsert", "source": "/document/normalized_images/*/text"
        },
        {
          "name":"offsets", "source": "/document/normalized_images/*/contentOffset" 
        }
      ],
      "outputs": [
        {
          "name": "mergedText", "targetName" : "merged_text"
        }
      ]
    },
    {
      "@odata.type": "#Microsoft.Skills.Text.V3.EntityRecognitionSkill",
      "context": "/document",
      "categories": [ "Person"],
      "defaultLanguageCode": "en", 
      "minimumPrecision": 0.5, 
      "inputs": [
        {
            "name": "text", "source": "/document/merged_text"
        }
      ],
      "outputs": [
        {
            "name": "persons", "targetName": "people"
        }
      ]
    }
  ]
}

Теперь, когда у вас есть merged_text поле, вы можете сопоставить его как поле с возможностью поиска в определении индексатора. Все содержимое файлов, включая текст изображений, будет доступно для поиска.

Сценарий: визуализация ограничивающих прямоугольников

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

Так как шаг OCR выполняется на нормализованных изображениях, координаты макета находятся в нормализованном пространстве изображения, но если необходимо отобразить исходное изображение, преобразуйте точки координат в макет в исходную систему координат изображения.

Следующий алгоритм иллюстрирует шаблон:

/// <summary>
///  Converts a point in the normalized coordinate space to the original coordinate space.
///  This method assumes the rotation angles are multiples of 90 degrees.
/// </summary>
public static Point GetOriginalCoordinates(Point normalized,
                            int originalWidth,
                            int originalHeight,
                            int width,
                            int height,
                            double rotationFromOriginal)
{
    Point original = new Point();
    double angle = rotationFromOriginal % 360;

    if (angle == 0 )
    {
        original.X = normalized.X;
        original.Y = normalized.Y;
    } else if (angle == 90)
    {
        original.X = normalized.Y;
        original.Y = (width - normalized.X);
    } else if (angle == 180)
    {
        original.X = (width -  normalized.X);
        original.Y = (height - normalized.Y);
    } else if (angle == 270)
    {
        original.X = height - normalized.Y;
        original.Y = normalized.X;
    }

    double scalingFactor = (angle % 180 == 0) ? originalHeight / height : originalHeight / width;
    original.X = (int) (original.X * scalingFactor);
    original.Y = (int)(original.Y * scalingFactor);

    return original;
}

Сценарий: навыки работы с пользовательскими образами

Изображения также могут передаваться в пользовательские навыки и возвращаться из них. Набор навыков кодирует изображение в формат Base64 перед его передачей в пользовательский навык. Чтобы использовать изображение в пользовательском навыке, задайте "/document/normalized_images/*/data" в качестве входных данных для пользовательского навыка. В коде пользовательского навыка декодируйте строку из формата Base64 перед преобразованием её в изображение. Чтобы вернуть изображение в набор навыков, сначала закодируйте изображение в Base64, а затем верните его.

Изображение возвращается в виде объекта со следующими свойствами.

 { 
  "$type": "file", 
  "data": "base64String" 
 }

В репозитории образцов Python для Azure Search есть полный пример пользовательского навыка, реализованного на Python и обогащающего изображения.

Передача изображений в пользовательские навыки

В сценариях, где требуется пользовательский навык для обработки изображений, можно передавать изображения в этот навык и получать обратно текст или изображения. Следующий набор навыков представлен в примере.

Следующий набор навыков принимает нормализованное изображение (полученное во время распознавания документа) и выводит срезы изображения.

Пример набора навыков

{
  "description": "Extract text from images and merge with content text to produce merged_text",
  "skills":
  [
    {
          "@odata.type": "#Microsoft.Skills.Custom.WebApiSkill",
          "name": "ImageSkill",
          "description": "Segment Images",
          "context": "/document/normalized_images/*",
          "uri": "https://your.custom.skill.url",
          "httpMethod": "POST",
          "timeout": "PT30S",
          "batchSize": 100,
          "degreeOfParallelism": 1,
          "inputs": [
            {
              "name": "image",
              "source": "/document/normalized_images/*"
            }
          ],
          "outputs": [
            {
              "name": "slices",
              "targetName": "slices"
            }
          ],
          "httpHeaders": {}
        }
  ]
}

Пример пользовательского навыка

Навык как таковой является внешним по отношению к набору навыков. В этом случае это код на Python, который сначала проходит по записям запросов в формате пользовательского навыка, а затем преобразует строку в кодировке Base64 в изображение.

# deserialize the request, for each item in the batch
for value in values:
  data = value['data']
  base64String = data["image"]["data"]
  base64Bytes = base64String.encode('utf-8')
  inputBytes = base64.b64decode(base64Bytes)
  # Use numpy to convert the string to an image
  jpg_as_np = np.frombuffer(inputBytes, dtype=np.uint8)
  # you now have an image to work with

Аналогично возврату изображения, нужно вернуть строку в кодировке Base64 в объекте JSON со свойством $typefile.

def base64EncodeImage(image):
    is_success, im_buf_arr = cv2.imencode(".jpg", image)
    byte_im = im_buf_arr.tobytes()
    base64Bytes = base64.b64encode(byte_im)
    base64String = base64Bytes.decode('utf-8')
    return base64String

 base64String = base64EncodeImage(jpg_as_np)
 result = { 
  "$type": "file", 
  "data": base64String 
}