Анализ изображений, когнитивные навыки

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

Этот навык использует модели машинного обучения, предоставленные Azure Vision in Foundry Tools. Image Analysis работает с изображениями, соответствующими следующим требованиям:

  • Изображение должно быть представлено в форматах JPEG, PNG, GIF или BMP
  • Размер файла изображения должен быть меньше 4 мегабайт (МБ)
  • Размеры изображения должны превышать 50 x 50 пикселей

Поддерживаемые источники данных для OCR и анализа изображений — это blobs в Хранилище BLOB-объектов Azure и Azure Data Lake Storage (ADLS) Gen2, а также содержимое изображений в Microsoft OneLake. Изображения могут быть отдельными файлами или встроенными изображениями в PDF или другие файлы.

Этот навык реализован с помощью AI Image Analysis API версии 3.2. Если ваше решение требует вызова новой версии этого API (например, версии 4.0), рассмотрите возможность реализации через Web API custom skill или используйте ImageAnalysisV4 power skill.

Note

Этот навык связан с Foundry Tools и требует оплачиваемого ресурса для транзакций, превышающих 20 документов на индексатор в день. Выполнение встроенных навыков взимается по существующей цене средств Foundry Standard.

Кроме того, извлечение изображений оплачивается по Поиск с использованием ИИ Azure.

@odata.type

Microsoft.Skills.Vision.ImageAnalysisSkill

Skill parameters

Параметры чувствительны к регистру.

Parameter name Description
defaultLanguageCode Строка, указывающая язык для возврата. Сервис возвращает результаты распознавания в заданном языке. Если этот параметр не указан, значение по умолчанию — «en».

Поддерживаемые языки включают подмножество общедоступных языков Azure Vision. Когда язык вводится в Azure Vision с статусом общего доступа, ожидается задержка до полной интеграции в этот навык.
visualFeatures Массив строк, указывающих типы визуальных признаков для возврата. Допустимые типы визуальных признаков включают:
  • взрослый — определяет, является ли изображение порнографическим (изображает наготу или сексуальный акт), кровавым (изображает экстремальное насилие или кровь) или намекающим (также известно как провокационный контент).
  • brands — определяет различные бренды внутри изображения, включая приблизительное местоположение.
  • категории — классифицирует содержимое изображений согласно таксономии , определённой Foundry Tools.
  • Описание — описывает содержимое изображения полным предложением на поддерживаемых языках.
  • Лица — определяет, есть ли лица. Если он присутствует, генерирует координаты, пол и возраст.
  • Объекты — обнаруживает различные объекты внутри изображения, включая приблизительное местоположение.
  • Теги — отмечает изображение подробным списком слов, связанных с содержимым изображения.
Названия визуальных признаков зависят от регистра. Визуальные функции цвета и imageType устарели, но вы можете получить доступ к этой функции через кастомный навык. Обратитесь к документации Azure Vision Image Analysis о том, какие визуальные признаки поддерживаются с каждым defaultLanguageCode.
details Массив строк, указывающих, какие детали, специфичные для домена, возвращать. Допустимые типы визуальных признаков включают:
  • Знаменитости — идентифицирует знаменитостей, если они обнаружены на изображении.
  • Ориентиры — определяет ориентиры, если они обнаружены на изображении.

Skill inputs

Input name Description
image Complex Type. В настоящее время работает только с полем "/document/normalized_images", которое создаётся индексатором Azure blob, когда imageAction устанавливается на значение, отличное от none.

Skill outputs

Output name Description
adult Выход — это один взрослый объект сложного типа, состоящий из булевых полей (isAdultContent, isGoryContent, isRacyContent) и двойных типов оценок (adultScore, goreScore, ). racyScore
brands Выход — это массив брендовых объектов, где объект представляет собой сложный тип, состоящий из name (строка) и confidence партитура (двойной). Также он возвращает a rectangle с четырьмя ограничивающими рамками координатами (x, y, wh, в пикселях), указывающими на расположение внутри изображения. Для прямоугольника x и y — это верхний левый угол. Внизу слева — x. y+h Верхний правый угол — x+w. y Внизу справа — x+w, y+h.
categories Output — это массив объектов категорий , где каждый объект категории представляет собой комплексный тип, состоящий из name (строки), score (двойной) и опционального detail варианта, содержащий детали знаменитостей или знаковых объектов. См. таксономию категорий для полного списка названий категорий. Деталь — это вложенный комплексный тип. Деталь знаменитости состоит из имени, рейтинга уверенности и рамки с лицом. Ключевой деталь состоит из имени и оценки уверенности.
description Выход — это один объект описания сложного типа, состоящий из списков и tagscaption (массив из Text (строка) и confidence (двойный)).
faces Комплексный тип, состоящий из age, genderи faceBoundingBox имеющий четыре ограничивающих квадратных координаты (в пикселях), указывающие на расположение внутри изображения. Координаты: top, left, width, height.
objects Выход — это массив визуальных объектов признаков. Каждый объект — это комплексный тип, состоящий из object (строка), confidence (двойной), rectangle (с четырьмя координатами ограничивающих рамок, указывающих на расположение внутри изображения) и , parent содержащий имя объекта и уверенность .
tags Выход — это массив объектов imageTag , где объект тегов представляет собой сложный тип, состоящий из name (строка), hint (строка) и confidence (двойной). Добавление подсказки — редкость. Он генерируется только если тег неоднозначен. Например, изображение с тегом «кёрлинг» может содержать намёк на «спорт», чтобы лучше обозначить его содержание.

Примерное определение навыка

{
    "description": "Extract image analysis.",
    "@odata.type": "#Microsoft.Skills.Vision.ImageAnalysisSkill",
    "context": "/document/normalized_images/*",
    "defaultLanguageCode": "en",
    "visualFeatures": [
        "adult",
        "brands",
        "categories",
        "description",
        "faces",
        "objects",
        "tags"
    ],
    "inputs": [
        {
            "name": "image",
            "source": "/document/normalized_images/*"
        }
    ],
    "outputs": [
        {
            "name": "adult"
        },
        {
            "name": "brands"
        },
        {
            "name": "categories"
        },
        {
            "name": "description"
        },
        {
            "name": "faces"
        },
        {
            "name": "objects"
        },
        {
            "name": "tags"
        }
    ]
}

Sample index

Для отдельных объектов (например adult , и description), вы можете структурировать их в индексе как a Collection(Edm.ComplexType) , чтобы они возвращали adult и description выводили для всех них. Для получения дополнительной информации о отображении выходов в индексные поля см. раздел «Выравнивание информации из комплексных типов».

{
    "fields": [
        {
            "name": "metadata_storage_name",
            "type": "Edm.String",
            "key": true,
            "searchable": true,
            "filterable": false,
            "facetable": false,
            "sortable": true
        },
        {
            "name": "metadata_storage_path",
            "type": "Edm.String",
            "searchable": true,
            "filterable": false,
            "facetable": false,
            "sortable": true
        },
        {
            "name": "content",
            "type": "Edm.String",
            "sortable": false,
            "searchable": true,
            "filterable": false,
            "facetable": false
        },
        {
            "name": "adult",
            "type": "Edm.ComplexType",
            "fields": [
                {
                    "name": "isAdultContent",
                    "type": "Edm.Boolean",
                    "searchable": false,
                    "filterable": true,
                    "facetable": true
                },
                {
                    "name": "isGoryContent",
                    "type": "Edm.Boolean",
                    "searchable": false,
                    "filterable": true,
                    "facetable": true
                },
                {
                    "name": "isRacyContent",
                    "type": "Edm.Boolean",
                    "searchable": false,
                    "filterable": true,
                    "facetable": true
                },
                {
                    "name": "adultScore",
                    "type": "Edm.Double",
                    "searchable": false,
                    "filterable": false,
                    "facetable": false
                },
                {
                    "name": "goreScore",
                    "type": "Edm.Double",
                    "searchable": false,
                    "filterable": false,
                    "facetable": false
                },
                {
                    "name": "racyScore",
                    "type": "Edm.Double",
                    "searchable": false,
                    "filterable": false,
                    "facetable": false
                }
            ]
        },
        {
            "name": "brands",
            "type": "Collection(Edm.ComplexType)",
            "fields": [
                {
                    "name": "name",
                    "type": "Edm.String",
                    "searchable": true,
                    "filterable": false,
                    "facetable": false
                },
                {
                    "name": "confidence",
                    "type": "Edm.Double",
                    "searchable": false,
                    "filterable": false,
                    "facetable": false
                },
                {
                    "name": "rectangle",
                    "type": "Edm.ComplexType",
                    "fields": [
                        {
                            "name": "x",
                            "type": "Edm.Int32",
                            "searchable": false,
                            "filterable": false,
                            "facetable": false
                        },
                        {
                            "name": "y",
                            "type": "Edm.Int32",
                            "searchable": false,
                            "filterable": false,
                            "facetable": false
                        },
                        {
                            "name": "w",
                            "type": "Edm.Int32",
                            "searchable": false,
                            "filterable": false,
                            "facetable": false
                        },
                        {
                            "name": "h",
                            "type": "Edm.Int32",
                            "searchable": false,
                            "filterable": false,
                            "facetable": false
                        }
                    ]
                }
            ]
        },
        {
            "name": "categories",
            "type": "Collection(Edm.ComplexType)",
            "fields": [
                {
                    "name": "name",
                    "type": "Edm.String",
                    "searchable": true,
                    "filterable": false,
                    "facetable": false
                },
                {
                    "name": "score",
                    "type": "Edm.Double",
                    "searchable": false,
                    "filterable": false,
                    "facetable": false
                },
                {
                    "name": "detail",
                    "type": "Edm.ComplexType",
                    "fields": [
                        {
                            "name": "celebrities",
                            "type": "Collection(Edm.ComplexType)",
                            "fields": [
                                {
                                    "name": "name",
                                    "type": "Edm.String",
                                    "searchable": true,
                                    "filterable": false,
                                    "facetable": false
                                },
                                {
                                    "name": "faceBoundingBox",
                                    "type": "Collection(Edm.ComplexType)",
                                    "fields": [
                                        {
                                            "name": "x",
                                            "type": "Edm.Int32",
                                            "searchable": false,
                                            "filterable": false,
                                            "facetable": false
                                        },
                                        {
                                            "name": "y",
                                            "type": "Edm.Int32",
                                            "searchable": false,
                                            "filterable": false,
                                            "facetable": false
                                        }
                                    ]
                                },
                                {
                                    "name": "confidence",
                                    "type": "Edm.Double",
                                    "searchable": false,
                                    "filterable": false,
                                    "facetable": false
                                }
                            ]
                        },
                        {
                            "name": "landmarks",
                            "type": "Collection(Edm.ComplexType)",
                            "fields": [
                                {
                                    "name": "name",
                                    "type": "Edm.String",
                                    "searchable": true,
                                    "filterable": false,
                                    "facetable": false
                                },
                                {
                                    "name": "confidence",
                                    "type": "Edm.Double",
                                    "searchable": false,
                                    "filterable": false,
                                    "facetable": false
                                }
                            ]
                        }
                    ]
                }
            ]
        },
        {
            "name": "description",
            "type": "Collection(Edm.ComplexType)",
            "fields": [
                {
                    "name": "tags",
                    "type": "Collection(Edm.String)",
                    "searchable": true,
                    "filterable": false,
                    "facetable": false
                },
                {
                    "name": "captions",
                    "type": "Collection(Edm.ComplexType)",
                    "fields": [
                        {
                            "name": "text",
                            "type": "Edm.String",
                            "searchable": true,
                            "filterable": false,
                            "facetable": false
                        },
                        {
                            "name": "confidence",
                            "type": "Edm.Double",
                            "searchable": false,
                            "filterable": false,
                            "facetable": false
                        }
                    ]
                }
            ]
        },
        {
            "name": "faces",
            "type": "Collection(Edm.ComplexType)",
            "fields": [
                {
                    "name": "age",
                    "type": "Edm.Int32",
                    "searchable": false,
                    "filterable": false,
                    "facetable": false
                },
                {
                    "name": "gender",
                    "type": "Edm.String",
                    "searchable": false,
                    "filterable": false,
                    "facetable": false
                },
                {
                    "name": "faceBoundingBox",
                    "type": "Collection(Edm.ComplexType)",
                    "fields": [
                        {
                            "name": "top",
                            "type": "Edm.Int32",
                            "searchable": false,
                            "filterable": false,
                            "facetable": false
                        },
                        {
                            "name": "left",
                            "type": "Edm.Int32",
                            "searchable": false,
                            "filterable": false,
                            "facetable": false
                        },
                        {
                            "name": "width",
                            "type": "Edm.Int32",
                            "searchable": false,
                            "filterable": false,
                            "facetable": false
                        },
                        {
                            "name": "height",
                            "type": "Edm.Int32",
                            "searchable": false,
                            "filterable": false,
                            "facetable": false
                        }
                    ]
                }
            ]
        },
        {
            "name": "objects",
            "type": "Collection(Edm.ComplexType)",
            "fields": [
                {
                    "name": "object",
                    "type": "Edm.String",
                    "searchable": true,
                    "filterable": false,
                    "facetable": false
                },
                {
                    "name": "confidence",
                    "type": "Edm.Double",
                    "searchable": false,
                    "filterable": false,
                    "facetable": false
                },
                {
                    "name": "rectangle",
                    "type": "Edm.ComplexType",
                    "fields": [
                        {
                            "name": "x",
                            "type": "Edm.Int32",
                            "searchable": false,
                            "filterable": false,
                            "facetable": false
                        },
                        {
                            "name": "y",
                            "type": "Edm.Int32",
                            "searchable": false,
                            "filterable": false,
                            "facetable": false
                        },
                        {
                            "name": "w",
                            "type": "Edm.Int32",
                            "searchable": false,
                            "filterable": false,
                            "facetable": false
                        },
                        {
                            "name": "h",
                            "type": "Edm.Int32",
                            "searchable": false,
                            "filterable": false,
                            "facetable": false
                        }
                    ]
                },
                {
                    "name": "parent",
                    "type": "Edm.ComplexType",
                    "fields": [
                        {
                            "name": "object",
                            "type": "Edm.String",
                            "searchable": true,
                            "filterable": false,
                            "facetable": false
                        },
                        {
                            "name": "confidence",
                            "type": "Edm.Double",
                            "searchable": false,
                            "filterable": false,
                            "facetable": false
                        }
                    ]
                }
            ]
        },
        {
            "name": "tags",
            "type": "Collection(Edm.ComplexType)",
            "fields": [
                {
                    "name": "name",
                    "type": "Edm.String",
                    "searchable": true,
                    "filterable": false,
                    "facetable": false
                },
                {
                    "name": "hint",
                    "type": "Edm.String",
                    "searchable": true,
                    "filterable": false,
                    "facetable": false
                },
                {
                    "name": "confidence",
                    "type": "Edm.Double",
                    "searchable": false,
                    "filterable": false,
                    "facetable": false
                }
            ]
        }
    ]
}

Выборочное отображение выходных полей

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

"outputFieldMappings": [
    {
        "sourceFieldName": "/document/normalized_images/*/adult",
        "targetFieldName": "adult"
    },
    {
        "sourceFieldName": "/document/normalized_images/*/brands/*",
        "targetFieldName": "brands"
    },
    {
        "sourceFieldName": "/document/normalized_images/*/categories/*",
        "targetFieldName": "categories"
    },
    {
        "sourceFieldName": "/document/normalized_images/*/description",
        "targetFieldName": "description"
    },
    {
        "sourceFieldName": "/document/normalized_images/*/faces/*",
        "targetFieldName": "faces"
    },
    {
        "sourceFieldName": "/document/normalized_images/*/objects/*",
        "targetFieldName": "objects"
    },
    {
        "sourceFieldName": "/document/normalized_images/*/tags/*",
        "targetFieldName": "tags"
    }

Вариации отображения выходных полей (вложенные свойства)

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

"outputFieldMappings": [
    {
        "sourceFieldName": "/document/normalized_images/*/categories/detail/celebrities/*",
        "targetFieldName": "celebrities"
    },
    {
        "sourceFieldName": "/document/normalized_images/*/categories/detail/landmarks/*",
        "targetFieldName": "landmarks"
    }

Sample input

{
    "values": [
        {
            "recordId": "1",
            "data": {
                "image": {
                    "data": "BASE64 ENCODED STRING OF A JPEG IMAGE",
                    "width": 500,
                    "height": 300,
                    "originalWidth": 5000,
                    "originalHeight": 3000,
                    "rotationFromOriginal": 90,
                    "contentOffset": 500,
                    "pageNumber": 2
                }
            }
        }
    ]
}

Sample output

{
  "values": [
    {
      "recordId": "1",
      "data": {
        "categories": [
          {
            "name": "abstract_",
            "score": 0.00390625
          },
          {
            "name": "people_",
            "score": 0.83984375,
            "detail": {
              "celebrities": [
                {
                  "name": "Satya Nadella",
                  "faceBoundingBox": [
                        {
                            "x": 273,
                            "y": 309
                        },
                        {
                            "x": 395,
                            "y": 309
                        },
                        {
                            "x": 395,
                            "y": 431
                        },
                        {
                            "x": 273,
                            "y": 431
                        }
                    ],
                  "confidence": 0.999028444
                }
              ],
              "landmarks": [ ]
            }
          }
        ],
        "adult": {
          "isAdultContent": false,
          "isRacyContent": false,
          "isGoryContent": false,
          "adultScore": 0.0934349000453949,
          "racyScore": 0.068613491952419281,
          "goreScore": 0.08928389008070282
        },
        "tags": [
          {
            "name": "person",
            "confidence": 0.98979085683822632
          },
          {
            "name": "man",
            "confidence": 0.94493889808654785
          },
          {
            "name": "outdoor",
            "confidence": 0.938492476940155
          },
          {
            "name": "window",
            "confidence": 0.89513939619064331
          }
        ],
        "description": {
          "tags": [
            "person",
            "man",
            "outdoor",
            "window",
            "glasses"
          ],
          "captions": [
            {
              "text": "Satya Nadella sitting on a bench",
              "confidence": 0.48293603002174407
            }
          ]
        },
        "faces": [
          {
            "age": 44,
            "gender": "Male",
            "faceBoundingBox": [
                {
                    "x": 1601,
                    "y": 395
                },
                {
                    "x": 1653,
                    "y": 395
                },
                {
                    "x": 1653,
                    "y": 447
                },
                {
                    "x": 1601,
                    "y": 447
                }
            ]
          }
        ],
        "objects": [
          {
            "rectangle": {
              "x": 25,
              "y": 43,
              "w": 172,
              "h": 140
            },
            "object": "person",
            "confidence": 0.931
          }
        ],
        "brands":[  
           {  
              "name":"Microsoft",
              "confidence": 0.903,
              "rectangle":{  
                 "x":20,
                 "y":97,
                 "w":62,
                 "h":52
              }
           }
        ]
      }
    }
  ]
}

Error cases

В следующих случаях ошибок элементы не извлекаются.

Error Code Description
NotSupportedLanguage Предоставленная формулировка не поддерживается.
InvalidImageUrl URL изображения плохо отформатирован или недоступен.
InvalidImageFormat Входные данные не являются действительным изображением.
InvalidImageSize Входное изображение слишком большое.
NotSupportedVisualFeature Указанный тип признака невалиден.
NotSupportedImage Неподтверждённое изображение, например, детская порнография.
InvalidDetails Неподдерживаемая модель, специфичная для конкретной области.

Если вы получите ошибку, похожую на "One or more skills are invalid. Details: Error in skill #<num>: Outputs are not supported by skill: Landmarks", проверьте путь. И знаменитости, и достопримечательности относятся к объектам под detail.

"categories":[  
      {  
         "name":"building_",
         "score":0.97265625,
         "detail":{  
            "landmarks":[  
               {  
                  "name":"Forbidden City",
                  "confidence":0.92013400793075562
               }
            ]

See also