Habilidade cognitiva de Análise de Imagens

A habilidade Análise de Imagens extrai um conjunto avançado de recursos visuais com base no conteúdo da imagem. Por exemplo, é possível gerar uma legenda de uma imagem, criar marcas ou identificar celebridades e pontos de referência. Este artigo é a documentação de referência para a habilidade Análise de Imagem. Confira Extrair texto e informações de imagens para ver as instruções de uso.

Essa habilidade usa os modelos de machine learning fornecidos pela Visão de IA do Azure nos serviços de IA do Azure. A Análise de Imagem funciona em imagens que atendem aos seguintes requisitos:

  • A imagem deve ser apresentada no formato JPEG, PNG, GIF ou BMP
  • O tamanho do arquivo da imagem deve ser menor que 4 MB (megabytes)
  • As dimensões da imagem devem ser maiores que 50 x 50 pixels

Essa habilidade é implementada usando a API de Análise de Imagem AI versão 3.2. Se sua solução exigir chamar uma versão mais recente dessa API de serviço (como a versão 4.0), considere implementar por meio da habilidade personalizada da API da Web.

Observação

Essa habilidade está associada aos serviços de IA do Azure e requer um recurso faturável para transações que excedem 20 documentos por indexador por dia. A execução de habilidades internas é cobrada pelo preço pago conforme o uso dos serviços de IA do Azure existentes.

Além disso, a extração de imagens é faturável pelo IA do Azure Search.

@odata.type

Microsoft.Skills.Vision.ImageAnalysisSkill

Parâmetros de habilidades

Os parâmetros diferenciam maiúsculas de minúsculas.

Nome do parâmetro Descrição
defaultLanguageCode Uma cadeia de caracteres que indica o idioma para retornar. O serviço retorna resultados de reconhecimento no idioma especificado. Se esse parâmetro não for especificado, o valor padrão será “en”.

Os idiomas com suporte incluem um subconjunto de idiomas geralmente disponíveis do Azure AI Vision. Quando uma linguagem é introduzida recentemente com status de disponibilidade geral no serviço AI Vision, espera-se um atraso antes que eles sejam totalmente integrados a essa habilidade.
visualFeatures Uma matriz de cadeias de caracteres que indica os tipos de recurso visuais para retornar. Tipos de recurso válido visuais:
  • adulto: detecta se a imagem é pornográfica (retrata nudez ou um ato sexual) ou é violenta (retrata violência extrema ou sangue) ou sugestiva (também conhecido como conteúdo chocante).
  • marcas: detecta várias marcas em uma imagem, incluindo a localização aproximada.
  • categorias – categoriza o conteúdo da imagem de acordo com uma taxonomia definida pelos serviços de IA do Azure.
  • descrição: descreve o conteúdo da imagem com uma frase completa nos idiomas com suporte.
  • rostos: detecta se há rostos presentes. Nesse caso, gera coordenadas de sexo e idade.
  • objetos: detecta vários objetos dentro de uma imagem, incluindo a localização aproximada.
  • marcas - marca a imagem com uma lista detalhada das palavras relacionadas ao conteúdo da imagem.
Nomes de recursos visuais diferenciam maiusculas de minúsculas. Os recursos visuais cor e imageType foram preteridos, mas é possível acessar essa funcionalidade por meio de uma habilidade personalizada. Consulte a Documentação da Análise de Imagem da Visão de IA do Azure na qual há suporte para recursos visuais com cada defaultLanguageCode.
details Uma matriz de cadeias de caracteres que indica qual domínio específico de detalhes retornar. Tipos de recurso válido visuais:
  • celebridades: identifica se há celebridades detectadas na imagem.
  • pontos de referência: identifica se há pontos de referência detectados na imagem.

Entradas de habilidades

Nome de entrada Descrição
image Tipo complexo. No momento, só funciona com o campo "/document/normalized_images", produzido pelo indexador de blobs do Azure quando imageAction definido como um valor diferente de none.

Saídas de habilidades

Nome de saída Descrição
adult A saída é um único objeto de adulto de um tipo complexo, que consiste em campos boolianos (isAdultContent, isGoryContent, isRacyContent) e pontuações de tipo duplo (adultScore, goreScore, racyScore).
brands A saída é uma matriz de objetos de marca, onde o objeto é um tipo complexo que consiste em name (cadeia de caracteres) e uma pontuação confidence (duplo). Ele também retorna uma rectangle com quatro coordenadas de caixa delimitadora (x, y, w, h em pixels), indicando o posicionamento dentro da imagem. Para o retângulo, x e y são a parte superior esquerda. A parte inferior esquerda é x, y+h. A parte superior direita é x+w, y. A parte inferior direita é x+w, y+h.
categories A saída é uma matriz de objetos de categoria, onde cada objeto de categoria é um tipo complexo que consiste em uma name (cadeia de caracteres), score (duplo) e detail opcional que contém detalhes de celebridades ou de ponto de referência. Consulte a taxonomia de categoria para ver a lista completa de nomes de categorias. Um detalhe é um tipo complexo aninhado. Um detalhe de celebridade consiste em um nome, uma pontuação de confiança e uma caixa delimitadora de rosto. Um detalhe de ponto referência consiste em um nome e uma pontuação de confiança.
description A saída é um único objeto de descrição de um tipo complexo, que consiste em listas de tags e caption (uma matriz que consiste em Text (cadeia de caracteres) e confidence (duplo)).
faces Tipo complexo que consiste em age, gender e faceBoundingBox tendo quatro coordenadas de caixa delimitadora (em pixels), indicando o posicionamento dentro da imagem. As coordenadas são top, left, width, height.
objects A saída é uma matriz de objetos de recurso visual. Cada objeto é um tipo complexo, composto por object (cadeia de caracteres), confidence (duplo), rectangle (com quatro coordenadas de caixa delimitadora indicando o posicionamento dentro da imagem) e um parent que contém um nome de objeto e a confiança.
tags A saída é uma matriz de objetos imageTag, em que um objeto de marca é um tipo complexo que consiste em name (cadeia de caracteres), hint (cadeia de caracteres) e confidence (duplo). A adição de uma dica é rara. Ela somente será gerada se uma marca for ambígua. Por exemplo, uma imagem marcada como "curling" pode ter uma dica de "esportes" para indicar melhor o conteúdo.

Exemplo de definição de habilidade

{
    "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"
        }
    ]
}

Índice de exemplo

Para objetos únicos (como adult e description), é possível estruturá-los no índice como um Collection(Edm.ComplexType) para retornar a saída adult e description para todos eles. Para saber mais sobre como mapear saídas para campos de índice, consulte Mesclar informações de tipos complexos.

{
    "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
                }
            ]
        }
    ]
}

Mapeamento de campo de saída de exemplo

O campo de destino pode ser uma coleção ou campo complexo. A definição de índice especifica quaisquer subcampos.

"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"
    }

Variação em mapeamentos de campo de saída (propriedades aninhadas)

É possível definir mapeamentos de campo de saída para propriedades de nível inferior, como apenas celebridades ou pontos de referência. Nesse caso, verifique se o esquema de índice tem um campo para conter cada detalhe especificamente.

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

Entrada de exemplo

{
    "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
                }
            }
        }
    ]
}

Saída de exemplo

{
  "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
              }
           }
        ]
      }
    }
  ]
}

Casos de erro

Nos casos de erro a seguir, nenhum elemento é extraído.

Código do Erro Descrição
NotSupportedLanguage Não há suporte para o idioma fornecido.
InvalidImageUrl A URL da imagem está incorretamente formatada ou não está acessível.
InvalidImageFormat Os dados de entrada não são uma imagem válida.
InvalidImageSize A imagem de entrada é muito grande.
NotSupportedVisualFeature O tipo de recurso especificado não é válido.
NotSupportedImage Imagem sem suporte, por exemplo, pornografia infantil.
InvalidDetails Modelo de domínio específico sem suporte.

Se você receber o erro semelhante a "One or more skills are invalid. Details: Error in skill #<num>: Outputs are not supported by skill: Landmarks", verifique o caminho. As celebridades e os pontos de referência são propriedades em detail.

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

Confira também