Partilhar via


Descrição da imagem

Importante

Descrição da imagem está atualmente indisponível na China.

Pode usar as APIs de Descrição de Imagens para gerar vários tipos de descrições de texto para uma imagem.

Para obter detalhes da API, consulte API ref for AI imaging features.

Para obter detalhes sobre moderação de conteúdo, consulte Segurança de conteúdo com APIs de IA generativas.

Importante

Requisitos de manifesto do pacote: para usar APIs de criação de imagens do Windows AI, seu aplicativo deve ser empacotado como um pacote MSIX com o recurso declarado systemAIModels no .Package.appxmanifest Além disso, assegure-se de que o atributo do MaxVersionTested manifesto esteja definido como uma versão recente do Windows (por exemplo, 10.0.26226.0 ou posterior) para suportar adequadamente os recursos de IA do Windows. O uso de valores mais antigos pode causar erros "Não declarado pelo aplicativo" ao carregar o modelo.

<Dependencies>
  <TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.17763.0" MaxVersionTested="10.0.26226.0" />
  <TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.17763.0" MaxVersionTested="10.0.26226.0" />
</Dependencies>

Tipos de descrição

Os seguintes tipos de descrições de texto são suportados:

  • Breve - Fornece uma descrição adequada para gráficos e diagramas.
  • Detalhado - Fornece uma longa descrição.
  • Diagrama - Fornece uma breve descrição adequada para uma legenda de imagem. O padrão se nenhum valor for especificado.
  • Acessível - Fornece uma longa descrição com detalhes destinados a usuários com necessidades de acessibilidade.

Limitações

Como essas APIs usam modelos de Machine Learning (ML), erros ocasionais podem ocorrer quando o texto não descreve a imagem corretamente. Portanto, não recomendamos o uso dessas APIs para imagens nos seguintes cenários:

  • Quando as imagens contêm conteúdo potencialmente sensível e descrições imprecisas podem ser controversas, como bandeiras, mapas, globos, símbolos culturais ou símbolos religiosos.
  • Quando descrições precisas são críticas, como para aconselhamento médico ou diagnóstico, conteúdo legal ou documentos financeiros.

Exemplo de descrição da imagem

O exemplo a seguir mostra como obter uma descrição de texto para uma imagem com base no tipo de descrição especificado (opcional) e no nível de moderação de conteúdo (opcional).

Observação

A imagem deve ser um objeto ImageBuffer como SoftwareBitmap não é suportado atualmente (este exemplo demonstra como converter SoftwareBitmap para ImageBuffer).

  1. Assegure que o modelo de Descrição de Imagem está disponível chamando o método GetReadyState e depois aguardando que o método EnsureReadyAsync retorne com sucesso.

  2. Assim que o modelo de Descrição da Imagem estiver disponível, crie um objeto ImageDescriptionGenerator para o referenciar.

  3. (Opcional) Crie um objeto ContentFilterOptions e especifique seus valores preferidos. Se você optar por usar valores padrão, poderá passar um objeto nulo.

  4. Obtenha a descrição da imagem (LanguageModelResponse.Response) chamando o método DescribeAsync especificando a imagem original, o ImageDescriptionKind (um valor opcional para o tipo de descrição preferido) e o objeto ContentFilterOptions (opcional).

using Microsoft.Graphics.Imaging;
using Microsoft.Windows.Management.Deployment;  
using Microsoft.Windows.AI;
using Microsoft.Windows.AI.ContentModeration;
using Windows.Storage.StorageFile;  
using Windows.Storage.Streams;  
using Windows.Graphics.Imaging;

if (ImageDescriptionGenerator.GetReadyState() == AIFeatureReadyState.NotReady) 
{
    var result = await ImageDescriptionGenerator.EnsureReadyAsync();
    if (result.Status != AIFeatureReadyResultState.Success)
    {
        throw result.ExtendedError;
    }
}

ImageDescriptionGenerator imageDescriptionGenerator = await ImageDescriptionGenerator.CreateAsync();

// Convert already available softwareBitmap to ImageBuffer.
ImageBuffer inputImage = ImageBuffer.CreateCopyFromBitmap(softwareBitmap);  

// Create content moderation thresholds object.
ContentFilterOptions filterOptions = new ContentFilterOptions();
filterOptions.PromptMinSeverityLevelToBlock.ViolentContentSeverity = SeverityLevel.Medium;
filterOptions.ResponseMinSeverityLevelToBlock.ViolentContentSeverity = SeverityLevel.Medium;

// Get text description.
LanguageModelResponse languageModelResponse = await imageDescriptionGenerator.DescribeAsync(inputImage, ImageDescriptionScenario.Caption, filterOptions);
string response = languageModelResponse.Response;

#include <winrt/Microsoft.Graphics.Imaging.h>
#include <winrt/Microsoft.Windows.AI.Imaging.h>
#include <winrt/Microsoft.Windows.AI.ContentSafety.h>
#include <winrt/Microsoft.Windows.AI.h>
#include <winrt/Windows.Foundation.h>
#include <winrt/Windows.Graphics.Imaging.h> 
#include <winrt/Windows.Storage.Streams.h>
#include <winrt/Windows.Storage.StorageFile.h>

using namespace winrt::Microsoft::Graphics::Imaging; 
using namespace winrt::Microsoft::Windows::AI;
using namespace winrt::Microsoft::Windows::AI::ContentSafety; 
using namespace winrt::Microsoft::Windows::AI::Imaging; 
using namespace winrt::Windows::Foundation; 
using namespace winrt::Windows::Graphics::Imaging;
using namespace winrt::Windows::Storage::Streams;
using namespace winrt::Windows::Storage::StorageFile;    

if (ImageDescriptionGenerator::GetReadyState() == AIFeatureReadyState::NotReady)
{
    auto loadResult = ImageDescriptionGenerator::EnsureReadyAsync().get();

    if (loadResult.Status() != AIFeatureReadyResultState::Success)
    {
        throw winrt::hresult_error(loadResult.ExtendedError());
    }
}

ImageDescriptionGenerator imageDescriptionGenerator = 
    ImageDescriptionGenerator::CreateAsync().get();

// Convert already available softwareBitmap to ImageBuffer.
auto inputBuffer = Microsoft::Graphics::Imaging::ImageBuffer::CreateForSoftwareBitmap(softwareBitmap);

// Create content moderation thresholds object.

ContentFilterOptions contentFilter{};
contentFilter.PromptMaxAllowedSeverityLevel().Violent(SeverityLevel::Medium);
contentFilter.ResponseMaxAllowedSeverityLevel().Violent(SeverityLevel::Medium);

// Get text description.
auto response = imageDescriptionGenerator.DescribeAsync(inputBuffer, ImageDescriptionKind::BriefDescription, contentFilter).get();
string text = response.Description();

Consulte também