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
As fontes de dados com suporte para OCR e análise de imagem são blobs no Armazenamento de Blobs do Azure e no ADLS (Azure Data Lake Storage) Gen2 e conteúdo de imagem no OneLake. As imagens podem ser arquivos independentes ou imagens incorporadas em um PDF ou outros arquivos.
Essa habilidade é implementada usando a API AI Image Analysis 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.
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”. As linguagens com suporte incluem um subconjunto de linguagens 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 ela seja totalmente integrada 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:
defaultLanguageCode . |
details |
Uma matriz de cadeias de caracteres que indica qual domínio específico de detalhes retornar. Tipos de recurso válido visuais:
|
Entradas de habilidades
Nome de entrada | Descrição |
---|---|
image |
Tipo complexo. Atualmente 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
}
]