Habilidade cognitiva de Análise de Imagem

A habilidade de Análise de Imagem extrai um conjunto rico de recursos visuais com base no conteúdo da imagem. Por exemplo, você pode gerar uma legenda a partir de uma imagem, gerar tags ou identificar celebridades e pontos turísticos. Este artigo é a documentação de referência para a habilidade de Análise de Imagens . Veja Extrair texto e informações das imagens para instruções de uso.

Essa habilidade utiliza os modelos de aprendizado de máquina fornecidos pelo Azure Vision no Foundry Tools. A Análise de Imagens trabalha com imagens que atendem aos seguintes requisitos:

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

Fontes de dados suportadas para OCR e análise de imagens são blobs no Armazenamento de Blobs do Azure e Azure Data Lake Storage (ADLS) Gen2, e conteúdo de imagens no Microsoft OneLake. Imagens podem ser arquivos independentes ou imagens incorporadas em PDF ou outros arquivos.

Essa habilidade é implementada usando a API de Análise de Imagens de IA 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 através de Web API custom skill ou usar a ImageAnalysisV4 power skill.

Note

Essa habilidade está vinculada ao Foundry Tools e requer um recurso faturável para transações que ultrapassem 20 documentos por indexador por dia. A execução de habilidades internas é cobrada pelo preço padrão das Ferramentas de Fundiária existentes.

Além disso, a extração de imagem é faturável por Pesquisa de IA do Azure .

@odata.type

Microsoft.Skills.Vision.ImageAnalysisSkill

Skill parameters

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

Parameter name Description
defaultLanguageCode Uma string indicando o idioma a ser retornado. O serviço retorna resultados de reconhecimento em uma linguagem especificada. Se esse parâmetro não for especificado, o valor padrão é "en".

Linguagens suportadas incluem um subconjunto de linguagens geralmente disponíveis do Azure Vision. Quando uma linguagem é recém-introduzida com status de disponibilidade geral no Azure Vision, há um atraso esperado até que ela seja totalmente integrada a essa habilidade.
visualFeatures Um array de strings indicando os tipos de características visuais a serem retornadas. Tipos válidos de características visuais incluem:
  • Adulto - detecta se a imagem é pornográfica (mostra nudez ou ato sexual), sangrenta (mostra violência extrema ou sangue) ou sugestiva (também conhecida como conteúdo picante).
  • Marcas - detecta várias marcas dentro de uma imagem, incluindo a localização aproximada.
  • categorias - categoriza o conteúdo da imagem de acordo com uma taxonomia definida pela Foundry Tools.
  • Descrição - Descreve o conteúdo da imagem com uma frase completa em línguas suportadas.
  • Rostos - Detecta se rostos estão presentes. Se presente, gera coordenadas, gênero e idade.
  • Objetos - detecta vários objetos dentro de uma imagem, incluindo a localização aproximada.
  • Tags - Marca a imagem com uma lista detalhada de palavras relacionadas ao conteúdo da imagem.
Nomes de características visuais são sensíveis a maiúsculas e minúsculas. Tanto as características visuais de cor quanto de imageType foram obsoletas, mas você pode acessar essa funcionalidade por meio de uma habilidade personalizada. Consulte a documentação Azure Vision Image Analysis em quais recursos visuais são suportados com cada defaultLanguageCode.
details Um array de strings indicando quais detalhes específicos do domínio devolver. Tipos válidos de características visuais incluem:
  • Celebridades - Identifica celebridades se detectadas na imagem.
  • Pontos de referência - identifica pontos de referência se detectados na imagem.

Skill inputs

Input name Description
image Complex Type. Atualmente só funciona com o campo "/document/normalized_images", produzido pelo indexador de blob Azure quando imageAction está definido para um valor diferente de none.

Skill outputs

Output name Description
adult Output é um único objeto adulto de tipo complexo, composto por campos booleanos (isAdultContent, isGoryContent, isRacyContent) e pontuações do tipo duplo (adultScore, goreScore, racyScore).
brands A saída é um array de objetos de marca , onde o objeto é um tipo complexo composto por name (string) e uma confidence pontuação (double). Também retorna a rectangle com quatro coordenadas de caixa delimitadora (x, y, w, h, em pixels) indicando a posição dentro da imagem. Para o retângulo, x e y são o canto superior esquerdo. No canto inferior esquerdo é x, y+h. Canto superior direito é x+w, y. No canto inferior direito está x+w, y+h.
categories Output é um array de objetos categoria , onde cada objeto categoria é um tipo complexo composto por ( name string), score (double) e opcional detail que contém detalhes de celebridades ou pontos de referência. Veja a taxonomia das categorias para a lista completa dos nomes das categorias. Um detalhe é um tipo complexo aninhado. Um detalhe de celebridade consiste em nome, pontuação de confiança e caixa de delimitação facial. Um detalhe marco consiste em um nome e uma pontuação de confiança.
description Saída é um único objeto de descrição de tipo complexo, consistindo em listas de tags e caption (um array composto por Text (string) e confidence (duplo)).
faces Tipo complexo consistindo em age, gender, e faceBoundingBox com quatro coordenadas de caixa delimitadora (em pixels) indicando a posição dentro da imagem. As coordenadas são top, left, width, height.
objects A saída é um conjunto de objetos de características visuais. Cada objeto é de um tipo complexo, consistindo em object (string), confidence (double), rectangle (com quatro coordenadas de caixa delimitadora indicando a posição dentro da imagem) e a parent que contém um nome de objeto e confiança .
tags Output é um array de objetos imageTag , onde um objeto tag é um tipo complexo composto por name (string), hint (string) e confidence (double). A adição de uma dica é rara. Só é gerado se uma tag for ambígua. Por exemplo, uma imagem marcada como "curling" pode ter um toque de "esportes" para indicar melhor seu conteúdo.

Definição de habilidade de exemplo

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

Para objetos individuais (como adult e description), você pode estruturá-los no índice como um Collection(Edm.ComplexType) para retornar adult e description sair para todos eles. Para mais informações sobre mapeamento de saídas para campos de índice, veja Achatamento de 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 alvo pode ser um campo complexo ou uma coleção. 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 nos mapeamentos de campo de saída (propriedades aninhadas)

Você pode definir mapeamentos de campo de saída para propriedades de nível inferior, como apenas celebridades ou pontos de referência. Nesse caso, certifique-se de que seu esquema de índice tenha um campo contendo cada detalhe especificamente.

"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

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

Error Code Description
NotSupportedLanguage O idioma fornecido não é suportado.
InvalidImageUrl A URL da imagem está mal 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 está grande demais.
NotSupportedVisualFeature O tipo de recurso especificado não é válido.
NotSupportedImage Imagem sem suporte, por exemplo, pornografia infantil.
InvalidDetails Modelo específico de domínio não suportado.

Se você receber um erro semelhante ao "One or more skills are invalid. Details: Error in skill #<num>: Outputs are not supported by skill: Landmarks", verifique o caminho. Tanto celebridades quanto marcos são propriedades sob detail.

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

See also