Habilidade cognitiva de Análise de Imagem

A habilidade Análise de Imagem extrai um rico conjunto 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 de referência. Este artigo é a documentação de referência para a habilidade Análise de Imagem. Consulte Extrair texto e informações de imagens para obter instruções de uso.

Essa habilidade usa os modelos de aprendizado de máquina fornecidos pelo Azure AI Vision nos serviços de IA do Azure. A Análise de Imagem funciona em imagens que cumprem os requisitos seguintes:

  • A imagem deve ser apresentada em formato JPEG, PNG, GIF ou BMP
  • O tamanho do ficheiro da imagem tem de ser inferior a 4 megabytes (MB)
  • As dimensões da imagem têm de ser superiores a 50 x 50 píxeis

Esta habilidade é implementada usando a AI Image Analysis API versão 3.2. Se sua solução exigir a chamada de 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 Web.

Nota

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

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

@odata.type

Microsoft.Skills.Vision.ImageAnalysisSkill

Parâmetros de habilidade

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

Nome do parâmetro Description
defaultLanguageCode Uma cadeia de caracteres que indica o idioma a ser retornado. O serviço retorna resultados de reconhecimento em um idioma especificado. Se esse parâmetro não for especificado, o valor padrão será "en".

Os idiomas suportados 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, há um atraso esperado antes que eles sejam totalmente integrados a essa habilidade.
visualFeatures Uma matriz de cadeias de caracteres indicando os tipos de recursos visuais a serem retornados. Os tipos de recursos visuais válidos incluem:
  • adulto - deteta se a imagem é pornográfica (retrata nudez ou um ato sexual), sangrenta (retrata extrema violência ou sangue) ou sugestiva (também conhecida como conteúdo racista).
  • marcas - deteta várias marcas dentro de uma imagem, incluindo a localização aproximada.
  • categories - 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 suportados.
  • faces - deteta se os rostos estão presentes. Se presente, gera coordenadas, sexo e idade.
  • objetos - deteta 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.
Os nomes dos recursos visuais diferenciam maiúsculas de minúsculas. Os recursos visuais color e imageType foram preteridos, mas você pode acessar essa funcionalidade por meio de uma habilidade personalizada. Consulte a documentação do Azure AI Vision Image Analysis sobre quais recursos visuais são suportados com cada defaultLanguageCode.
details Uma matriz de cadeias de caracteres que indica quais detalhes específicos do domínio devem ser retornados. Os tipos de recursos visuais válidos incluem:
  • celebridades - identifica celebridades se detetadas na imagem.
  • Pontos de referência - Identifica pontos de referência se detetados na imagem.

Contributos para as competências

Nome de entrada Description
image Tipo complexo. Atualmente, só funciona com o campo "/document/normalized_images", produzido pelo indexador de blob do Azure quando imageAction definido como um valor diferente de none.

Resultados em termos de competências

Nome da saída Description
adult A saída é um único objeto adulto de um tipo complexo, consistindo de campos booleanos (isAdultContent, isGoryContent, isRacyContent) e pontuações de tipo duplo (adultScore, goreScoreracyScore, ).
brands Output é uma matriz de objetos de marca , onde o objeto é um tipo complexo que consiste em name (string) e uma confidence pontuação (double). Ele também retorna um 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 o canto superior esquerdo. A parte inferior esquerda é x, y+h. O canto superior direito é x+w, y. No canto inferior direito está x+w, y+h.
categories Output é uma matriz de objetos de categoria, onde cada objeto de categoria é um tipo complexo que consiste em um name (string), score (double) e opcional detail que contém detalhes de celebridade ou ponto de referência. Consulte a taxonomia de categorias para obter a lista completa de nomes de categorias. Um detalhe é um tipo complexo aninhado. Um detalhe de celebridade consiste em um nome, pontuação de confiança e caixa delimitadora de rosto. Um detalhe histórico consiste em um nome e uma pontuação de confiança.
description Output é um único objeto de descrição de um tipo complexo, consistindo em listas de tags e caption (uma matriz que consiste em Text (string) e confidence (double)).
faces Tipo complexo que consiste ageem , gendere faceBoundingBox tem 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 feição visual. Cada objeto é um tipo complexo, consistindo em (string), confidence (double), rectangle (com quatro coordenadas de caixa delimitadora indicando posicionamento dentro da imagem) e um parent que contém um nome de object objeto e confiança.
tags Output é uma matriz de objetos imageTag , onde um objeto tag é um tipo complexo que consiste em name (string), hint (string) e confidence (double). A adição de uma dica é rara. Ele só é gerado se uma tag for ambígua. Por exemplo, uma imagem marcada como "curling" pode ter uma dica de "esportes" para indicar melhor seu conteúdo.

Definição de habilidade de amostra

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

Para objetos individuais (como adult e description), você pode estruturá-los no índice como um Collection(Edm.ComplexType) retorno adult e description saída para todos eles. Para obter mais informações sobre como mapear saídas para campos de índice, consulte Nivelando 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
                }
            ]
        }
    ]
}

Exemplo de mapeamento de campo de saída

O campo de destino 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, 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 seguintes casos de erro, nenhum elemento é extraído.

Código de Erro Description
NotSupportedLanguage O idioma fornecido não é suportado.
InvalidImageUrl O URL da imagem está mal formatado 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 específico de domínio sem suporte.

Se você receber o 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 as celebridades como os pontos de referência são propriedades sob detail.

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

Consulte também