Introdução à criação de imagens de IA no SDK de aplicativos Windows
Importante
Disponível no canal experimental mais recente versão do SDK de Aplicativos Windows.
O canal experimental do SDK de Aplicativos Windows inclui APIs e recursos em estágios iniciais de desenvolvimento. Todas as APIs no canal experimental estão sujeitas a extensas revisões e alterações disruptivas e podem ser removidas de versões subsequentes a qualquer momento. Os recursos experimentais não são suportados para uso em ambientes de produção e os aplicativos que os usam não podem ser publicados na Microsoft Store.
- Os recursos de Descrição da Imagem não estão disponíveis na China continental.
- Não há suporte para aplicativos autônomos.
Os recursos de imagem são fornecidos pelo SDK do Aplicativo Windows por meio de um conjunto de APIs, apoiadas por inteligência artificial (IA), que suportam os seguintes recursos:
- Super-Resolução de Imagem: ampliação e nitidez das imagens
- Descrição da imagem: produção de texto que descreve a imagem
- Segmentação de Imagens: identificação de objetos dentro de uma imagem
Para obter detalhes da API , consulte a referência da API para funcionalidades de imagem de IA no Windows App SDK .
Para obter detalhes de moderação de conteúdo, consulte Segurança de conteúdo com APIs de IA generativas.
Dica
Forneça comentários sobre essas APIs e suas funcionalidades criando um novo de Problema no repositório GitHub do SDK de Aplicativo Windows (inclua Imaging no título) ou respondendo a um problema existente.
Pré-requisitos
- Um PC Copilot+ da Qualcomm, Intel ou AMD.
- Atualmente, os PCs Copilot+ baseados em AMD não suportam a Super Resolução de Imagem.
- Arm64EC (Emulation Compatible) não é suportado atualmente.
- Windows 11 Insider Preview Build 26120.3073 (Canais Dev e Beta) ou posterior deve estar instalado no seu dispositivo.
O que posso fazer com a Super Resolução de Imagem?
As APIs de Superresolução de Imagem no SDK de Aplicativos Windows permitem a nitidez e o dimensionamento de imagens.
O dimensionamento é limitado a um fator máximo de 8x. Fatores de escala mais altos podem introduzir artefatos e comprometer a precisão da imagem. Se a largura ou a altura final for maior que oito vezes os seus valores originais, uma exceção será lançada.
O exemplo a seguir mostra como alterar a escala (targetWidth
, targetHeight
) de uma imagem bitmap de software existente (softwareBitmap
) e melhorar a nitidez da imagem (para melhorar a nitidez sem dimensionar a imagem, basta especificar a largura e a altura da imagem existente) usando um objeto ImageScaler
.
Verifique se o modelo de Super Resolução de Imagem está disponível chamando o método
ImageScaler.IsAvailable
e, em seguida, aguardando que o métodoImageScaler.MakeAvailableAsync
retorne com êxito.Quando o modelo de Super Resolução de Imagem estiver disponível, crie um objeto
ImageScaler
para fazer referência a ele.Obtenha uma versão nítida e dimensionada da imagem existente passando a imagem existente e a largura e altura desejadas para o modelo usando o método
ScaleSoftwareBitmap
.
using Microsoft.Graphics.Imaging;
using Microsoft.Windows.Management.Deployment;
using Windows.Graphics.Imaging;
if (!ImageScaler.IsAvailable())
{
var result = await ImageScaler.MakeAvailableAsync();
if (result.Status != PackageDeploymentStatus.CompletedSuccess)
{
throw result.ExtendedError;
}
}
ImageScaler imageScaler = await ImageScaler.CreateAsync();
SoftwareBitmap finalImage = imageScaler.ScaleSoftwareBitmap(softwareBitmap, targetWidth, targetHeight);
#include <winrt/Microsoft.Graphics.Imaging.h>
#include <winrt/Windows.Foundation.h>
#include <winrt/Windows.Graphics.Imaging.h>
using namespace winrt::Microsoft::Graphics::Imaging;
using namespace winrt::Windows::Foundation;
using namespace winrt::Windows::Graphics::Imaging;
if (!ImageScaler::IsAvailable())
{
winrt::PackageDeploymentResult result = ImageScaler::MakeAvailableAsync().get();
if (result.Status() != PackageDeploymentStatus::CompletedSuccess)
{
throw result.ExtendedError();
}
}
ImageScaler imageScaler = ImageScaler::CreateAsync().get();
SoftwareBitmap finalImage = imageScaler.ScaleSoftwareBitmap(softwareBitmap, targetWidth, targetHeight);
O que posso fazer com a Descrição da Imagem?
Importante
Descrição da imagem está atualmente indisponível na China continental.
As APIs de Descrição de Imagem no SDK de Aplicativos Windows fornecem a capacidade de gerar vários tipos de descrições de texto para uma imagem.
Os seguintes tipos de descrições de texto são suportados:
- Accessibility - Fornece uma longa descrição com detalhes destinados a utilizadores com necessidades de acessibilidade.
- Caption - Fornece uma breve descrição adequada para uma legenda de imagem. O padrão se nenhum valor for especificado.
- DetailedNarration - Fornece uma longa descrição.
- OfficeCharts - Fornece uma descrição adequada para gráficos e diagramas.
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.
Obter descrição de texto de uma imagem
A API de descrição de imagem usa uma imagem, o tipo de descrição de texto desejado (opcional) e o nível de moderação de conteúdo que você deseja empregar (opcional) para proteger contra uso prejudicial.
O exemplo a seguir mostra como obter uma descrição de texto para uma imagem.
Observação
A imagem deve ser um objeto ImageBuffer
, pois SoftwareBitmap
não é suportado no momento. Este exemplo demonstra como converter SoftwareBitmap
em ImageBuffer
.
Verifique se o modelo de Super Resolução de Imagem está disponível chamando o método
ImageDescriptionGenerator.IsAvailable
e, em seguida, aguardando que o métodoImageDescriptionGenerator.MakeAvailableAsync
retorne com êxito.Quando o modelo de Super Resolução de Imagem estiver disponível, crie um objeto
ImageDescriptionGenerator
para fazer referência a ele.(Opcional) Crie um objeto
ContentFilterOptions
e especifique seus valores preferidos. Se você optar por usar valores padrão, poderá passar um objeto nulo.Obtenha a descrição da imagem (
LanguageModelResponse.Response
) chamando o métodoImageDescriptionGenerator.DescribeAsync
com a imagem original, um enum para o tipo de descrição preferido (opcional) e o objetoContentFilterOptions
(opcional).
using Microsoft.Graphics.Imaging;
using Microsoft.Windows.Management.Deployment;
using Microsoft.Windows.AI.Generative;
using Microsoft.Windows.AI.ContentModeration;
using Windows.Storage.StorageFile;
using Windows.Storage.Streams;
using Windows.Graphics.Imaging;
if (!ImageDescriptionGenerator.IsAvailable())
{
var result = await ImageDescriptionGenerator.MakeAvailableAsync();
if (result.Status != PackageDeploymentStatus.CompletedSuccess)
{
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.ContentModeration.h>
#include <winrt/Microsoft.Windows.AI.Generative.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::ContentModeration;
using namespace winrt::Microsoft::Windows::AI::Generative;
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::IsAvailable())
{
winrt::PackageDeploymentResult result = ImageDescriptionGenerator::MakeAvailableAsync().get();
if (result.Status() != PackageDeploymentStatus::CompletedSuccess)
{
throw result.ExtendedError();
}
}
ImageDescriptionGenerator imageDescriptionGenerator = ImageDescriptionGenerator::CreateAsync().get();
// Convert already available softwareBitmap to ImageBuffer.
auto inputBuffer = ImageBuffer::CreateCopyFromBitmap(softwareBitmap);
// Create content moderation thresholds object.
ContentFilterOptions contentFilter{};
contentFilter.PromptMinSeverityLevelToBlock().ViolentContentSeverity(SeverityLevel::Medium);
contentFilter.ResponseMinSeverityLevelToBlock().ViolentContentSeverity(SeverityLevel::Medium);
// Get text description.
LanguageModelResponse languageModelResponse = imageDescriptionGenerator.DescribeAsync(inputImage, ImageDescriptionScenario::Caption, contentFilter).get();
string text = languageModelResponse.Response();
O que posso fazer com a Segmentação de Imagem?
A segmentação de imagem pode ser usada para identificar objetos específicos em uma imagem. O modelo considera tanto uma imagem quanto um objeto de "sugestões" e retorna uma máscara do objeto identificado.
As dicas podem ser fornecidas através de qualquer combinação do seguinte:
- Coordenadas para pontos que pertencem ao que você está identificando.
- Coordenadas para pontos que não pertencem ao que você está identificando.
- Um retângulo de coordenadas que inclui o que você está identificando.
Quanto mais dicas você fornecer, mais preciso o modelo pode ser. Siga estas diretrizes de dicas para minimizar resultados imprecisos ou erros.
- Evite usar vários retângulos numa pista, pois eles podem produzir uma máscara imprecisa.
- Evite usar exclusivamente pontos de exclusão sem incluir pontos ou um retângulo.
- Não especifique mais do que o máximo suportado de 32 coordenadas (1 para um ponto, 2 para um retângulo), pois isso retornará um erro.
A máscara retornada está no formato escala de cinza-8 com os pixels da máscara para o objeto identificado tendo um valor de 255 (todos os outros tendo um valor de 0).
Identificar um objeto dentro de uma imagem
Os exemplos a seguir mostram maneiras de identificar um objeto dentro de uma imagem. Os exemplos pressupõem que você já tenha um objeto de bitmap de software (softwareBitmap
) para a entrada.
Verifique se o modelo de segmentação de imagem está disponível chamando o método
IsAvailable
e aguardando que o métodoMakeAvailableAsync
retorne com êxito.Quando o modelo de segmentação de imagem estiver disponível, crie um objeto
ImageObjectExtractor
para fazer referência a ele.Passe a imagem para
ImageObjectExtractor.CreateWithSoftwareBitmapAsync
.Crie um
ImageObjectExtractorHint
objeto. Outras maneiras de criar um objeto de dica com entradas diferentes são demonstradas posteriormente.Envie a dica para o modelo usando o método
GetSoftwareBitmapObjectMask
, que retorna o resultado final.
using Microsoft.Graphics.Imaging;
using Microsoft.Windows.Management.Deployment;
using Windows.Graphics.Imaging;
if (!ImageObjectExtractor.IsAvailable())
{
var result = await ImageObjectExtractor.MakeAvailableAsync();
if (result.Status != PackageDeploymentStatus.CompletedSuccess)
{
throw result.ExtendedError;
}
}
ImageObjectExtractor imageObjectExtractor = await ImageObjectExtractor.CreateWithSoftwareBitmapAsync(softwareBitmap);
ImageObjectExtractorHint hint = new ImageObjectExtractorHint{
includeRects: null,
includePoints:
new List<PointInt32> { new PointInt32(306, 212),
new PointInt32(216, 336)},
excludePoints: null};
SoftwareBitmap finalImage = imageObjectExtractor.GetSoftwareBitmapObjectMask(hint);
#include <winrt/Microsoft.Graphics.Imaging.h>
#include <winrt/Windows.Graphics.Imaging.h>
#include <winrt/Windows.Foundation.h>
using namespace winrt::Microsoft::Graphics::Imaging;
using namespace winrt::Windows::Graphics::Imaging;
using namespace winrt::Windows::Foundation;
if (!ImageObjectExtractor::IsAvailable())
{
winrt::PackageDeploymentResult result = ImageObjectExtractor::MakeAvailableAsync().get();
if (result.Status() != PackageDeploymentStatus::CompletedSuccess)
{
throw result.ExtendedError();
}
}
ImageObjectExtractor imageObjectExtractor = ImageObjectExtractor::CreateWithSoftwareBitmapAsync(softwareBitmap).get();
ImageObjectExtractorHint hint(
{},
{
PointInt32{306, 212},
PointInt32{216, 336}
},
{}
);
SoftwareBitmap finalImage = imageObjectExtractor.GetSoftwareBitmapObjectMask(hint);
Especificar dicas com pontos incluídos e excluídos
Este trecho de código demonstra como usar pontos incluídos e excluídos como dicas.
ImageObjectExtractorHint hint(
includeRects: null,
includePoints:
new List<PointInt32> { new PointInt32(150, 90),
new PointInt32(216, 336),
new PointInt32(550, 330)},
excludePoints:
new List<PointInt32> { new PointInt32(306, 212) });
ImageObjectExtractorHint hint(
{},
{
PointInt32{150, 90},
PointInt32{216, 336},
PointInt32{550, 330}
},
{
PointInt32{306, 212}
}
);
Especificar dicas com retângulo
Este trecho de código demonstra como usar um retângulo (RectInt32 é X, Y, Width, Height
) como uma dica.
ImageObjectExtractorHint hint(
includeRects:
new List<RectInt32> {new RectInt32(370, 278, 285, 126)},
includePoints: null,
excludePoints: null );
ImageObjectExtractorHint hint(
{
RectInt32{370, 278, 285, 126}
},
{},
{}
);
IA responsável
Essas APIs de imagem fornecem aos desenvolvedores modelos poderosos e confiáveis para criar aplicativos com experiências de IA seguras e protegidas. Usamos uma combinação das etapas a seguir para garantir que essas APIs de criação de imagens sejam confiáveis, seguras e criadas de forma responsável. Recomendamos rever as práticas recomendadas descritas em Desenvolvimento de IA Generativa Responsável no Windows ao implementar recursos de IA em seu aplicativo.
- Testes e avaliação minuciosos da qualidade do modelo para identificar e mitigar riscos potenciais.
- Lançamento incremental de versões experimentais das APIs de imagem. Após a versão experimental final, a implantação será expandida para aplicativos assinados para garantir que as verificações de malware tenham sido aplicadas a aplicativos com recursos de modelo local.
- Forneça um modelo de IA local para moderação de conteúdo que identifique e filtre conteúdo prejudicial na entrada e na saída gerada por IA de quaisquer APIs que usem modelos de IA generativos. Este modelo de moderação de conteúdo local baseia-se no modelo de Segurança de Conteúdo do Azure AI para moderação de texto e oferece um desempenho semelhante.
Importante
Nenhum sistema de segurança de conteúdo é infalível e erros ocasionais podem ocorrer, por isso recomendamos a integração de ferramentas e práticas suplementares de IA Responsável (RAI). Para obter mais detalhes, consulte Desenvolvimento Responsável da IA Generativa no Windows.