Condividi tramite


Introduzione all'imaging di intelligenza artificiale nel SDK per app di Windows

Importante

Disponibile nell'ultimo rilascio del canale sperimentale di Windows App SDK.

Il canale sperimentale di Windows App SDK include API e funzionalità nelle fasi iniziali dello sviluppo. Tutte le API nel canale sperimentale sono soggette a revisioni estese e modifiche di rilievo e possono essere rimosse dalle versioni successive in qualsiasi momento. Le funzionalità sperimentali non sono supportate per l'uso in ambienti di produzione e le app che le usano non possono essere pubblicate in Microsoft Store.

  • Le funzionalità Descrizione immagine non sono disponibili in Cina continentale.
  • Le app autonome non sono supportate.

Le funzionalità di creazione dell'immagine sono fornite dal Windows App SDK tramite un set di API, supportate dall'intelligenza artificiale ,che supportano le funzionalità seguenti:

  • Super-risoluzione delle immagini: ridimensionamento e nitidezza delle immagini
  • Descrizione immagine: produzione di testo che descrive l'immagine
  • segmentazione di immagini: identificazione di oggetti all'interno di un'immagine

Per dettagli sull'API , vedere il riferimento API per le funzionalità di imaging con IA nel Windows App SDK.

Per informazioni dettagliate sulla moderazione del contenuto , vedere Sicurezza dei contenuti con le API di intelligenza artificiale generativa.

Suggerimento

Invia commenti e suggerimenti su queste API e le loro funzionalità creando una nuova segnalazione nel repository GitHub di Windows App SDK (includere Imaging nel titolo) o rispondendo a una segnalazione esistente.

Prerequisiti

  • Un Copilot+ PC da Qualcomm, Intel o AMD.
    • I PC Copilot+ basati su AMD attualmente non supportano la Super Risoluzione delle Immagini.
    • Arm64EC (compatibile con emulazione) non è attualmente supportato.
  • Windows 11 Insider Preview Build 26120.3073 (Dev and Beta Channels) o versione successiva devono essere installati sul tuo dispositivo.

Cosa posso fare con la Super Risoluzione dell'Immagine?

Le API di super-risoluzione delle immagini nel Windows App SDK consentono la nitidezza e il ridimensionamento delle immagini.

Il ridimensionamento è limitato a un fattore massimo di 8 volte. I fattori di scala più elevati possono introdurre artefatti e compromettere l'accuratezza dell'immagine. Se la larghezza finale o l'altezza è maggiore di 8 volte i valori originali, verrà generata un'eccezione.

L'esempio seguente illustra come modificare la scala (targetWidth, targetHeight) di un'immagine bitmap software esistente (softwareBitmap) e migliorare la nitidezza dell'immagine (per migliorare la nitidezza senza ridimensionare l'immagine, specificare semplicemente la larghezza e l'altezza dell'immagine esistenti) usando un oggetto ImageScaler.

  1. Verificare che il modello image super resolution sia disponibile chiamando il metodo ImageScaler.IsAvailable e quindi aspettando che il metodo ImageScaler.MakeAvailableAsync venga restituito correttamente.

  2. Una volta disponibile il modello di super risoluzione delle immagini, creare un oggetto ImageScaler per farvi riferimento.

  3. Ottenere una versione nitida e ridimensionata dell'immagine esistente passando l'immagine esistente e la larghezza e l'altezza desiderate al modello usando il metodo 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);

Cosa posso fare con la descrizione dell'immagine?

Importante

La descrizione dell'immagine non è attualmente disponibile in Cina continentale.

Le API Descrizione immagine in Windows App SDK offrono la possibilità di generare vari tipi di descrizioni di testo per un'immagine.

Sono supportati i tipi di descrizioni di testo seguenti:

  • Accessibilità - Fornisce una descrizione lunga con i dettagli destinati agli utenti con esigenze di accessibilità.
  • Caption : fornisce una breve descrizione adatta per una didascalia di un'immagine. Valore predefinito se non viene specificato alcun valore.
  • DetailedNarration: fornisce una descrizione lunga.
  • OfficeCharts: fornisce una descrizione adatta per grafici e diagrammi.

Poiché queste API usano modelli di Machine Learning (ML), possono verificarsi errori occasionali in cui il testo non descrive correttamente l'immagine. Pertanto, non è consigliabile usare queste API per le immagini negli scenari seguenti:

  • Dove le immagini contengono contenuti potenzialmente sensibili e descrizioni imprecise potrebbero essere controverse, ad esempio bandiere, mappe, globo, simboli culturali o simboli religiosi.
  • Quando le descrizioni accurate sono critiche, ad esempio per consulenza medica o diagnosi, contenuto legale o documenti finanziari.

Ottenere una descrizione di testo da un'immagine

L'API Descrizione immagine accetta un'immagine, il tipo di descrizione del testo desiderato (facoltativo) e il livello di moderazione del contenuto che si vuole usare (facoltativo) per proteggersi dall'uso dannoso.

Nell'esempio seguente viene illustrato come ottenere una descrizione di testo per un'immagine.

Nota

L'immagine deve essere un oggetto ImageBuffer perché SoftwareBitmap non è attualmente supportato. In questo esempio viene illustrato come convertire SoftwareBitmap in ImageBuffer.

  1. Verificare che il modello image super resolution sia disponibile chiamando il metodo ImageDescriptionGenerator.IsAvailable e quindi aspettando che il metodo ImageDescriptionGenerator.MakeAvailableAsync venga restituito correttamente.

  2. Una volta disponibile il modello di super risoluzione delle immagini, creare un oggetto ImageDescriptionGenerator per farvi riferimento.

  3. (Facoltativo) Creare un oggetto ContentFilterOptions e specificare i valori preferiti. Se si sceglie di usare i valori predefiniti, è possibile passare un oggetto Null.

  4. Ottenere la descrizione dell'immagine (LanguageModelResponse.Response) chiamando il metodo ImageDescriptionGenerator.DescribeAsync con l'immagine originale, un'enumerazione per il tipo di descrizione preferito (facoltativo) e l'oggetto ContentFilterOptions (facoltativo).

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();

Cosa posso fare con la segmentazione delle immagini?

La segmentazione dell'immagine può essere usata per identificare oggetti specifici in un'immagine. Il modello accetta sia un'immagine che un oggetto "hint" e restituisce una maschera dell'oggetto identificato.

Gli hint possono essere forniti tramite qualsiasi combinazione dei seguenti elementi:

  • Coordinate per i punti che appartengono a ciò che si sta identificando.
  • Coordinate per i punti che non appartengono a ciò che si sta identificando.
  • Rettangolo di coordinate che racchiude ciò che si sta identificando.

Maggiore è il numero di suggerimenti forniti, maggiore è la precisione del modello. Seguire queste linee guida sui suggerimenti per ridurre al minimo i risultati o gli errori inaccurati.

  • Evitare di usare più rettangoli in un suggerimento perché possono produrre una maschera imprecisa.
  • Evitare di usare punti di esclusione esclusivamente senza includere punti o un rettangolo.
  • Non specificare più del massimo supportato di 32 coordinate (1 per un punto, 2 per un rettangolo) perché verrà restituito un errore.

La maschera restituita è in formato grigio-8 con i pixel della maschera per l'oggetto identificato con un valore pari a 255 (tutti gli altri hanno un valore pari a 0).

Identificare un oggetto all'interno di un'immagine

Negli esempi seguenti vengono illustrati i modi per identificare un oggetto all'interno di un'immagine. Gli esempi presuppongono che sia già presente un oggetto bitmap software (softwareBitmap) per l'input.

  1. Verificare che il modello di segmentazione dell'immagine sia disponibile chiamando il metodo IsAvailable e attendendo che il metodo MakeAvailableAsync venga restituito correttamente.

  2. Quando il modello di segmentazione immagine è disponibile, creare un oggetto ImageObjectExtractor per farvi riferimento.

  3. Passare l'immagine a ImageObjectExtractor.CreateWithSoftwareBitmapAsync.

  4. Creare un oggetto ImageObjectExtractorHint. Altri modi per creare un oggetto hint con input diversi vengono illustrati in un secondo momento.

  5. Inviare l'hint al modello usando il metodo GetSoftwareBitmapObjectMask, che restituisce il risultato finale.

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);

Specificare hint con punti inclusi ed esclusi

Questo frammento di codice illustra come usare punti inclusi ed esclusi come hint.

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}
    }
);

Specificare hint con rettangolo

Questo frammento di codice illustra come usare un rettangolo (RectInt32 è X, Y, Width, Height) come hint.

ImageObjectExtractorHint hint(
    includeRects: 
        new List<RectInt32> {new RectInt32(370, 278, 285, 126)},
    includePoints: null,
    excludePoints: null ); 
ImageObjectExtractorHint hint(
    { 
        RectInt32{370, 278, 285, 126}
    }, 
    {},
    {}
);

Intelligenza artificiale responsabile

Queste API di creazione di immagini offrono agli sviluppatori modelli potenti e affidabili per la creazione di app con esperienze di intelligenza artificiale sicure e sicure. È stata usata una combinazione dei passaggi seguenti per garantire che queste API di imaging siano affidabili, sicure e create in modo responsabile. È consigliabile esaminare le procedure consigliate descritte in Sviluppo di intelligenza artificiale generativa responsabile in Windows quando si implementano le funzionalità di intelligenza artificiale nell'app.

  • Test approfonditi e valutazione della qualità del modello per identificare e mitigare i potenziali rischi.
  • Implementazione incrementale delle versioni sperimentali dell'API di creazione di immagini. Dopo la versione sperimentale finale, l'implementazione si espanderà alle app firmate per assicurarsi che le analisi malware siano state applicate alle applicazioni con funzionalità del modello locale.
  • Fornire un modello di intelligenza artificiale locale per la moderazione del contenuto che identifica e filtra contenuto dannoso sia nell'output generato dall'input che nell'output generato dall'intelligenza artificiale di tutte le API che usano modelli di intelligenza artificiale generativi. Questo modello di con modalità tenda ration locale si basa sul modello Azure AI Content Safety per la moderazione del testo e offre prestazioni simili.

Importante

Nessun sistema di sicurezza dei contenuti è infallibile e possono verificarsi errori occasionali, pertanto è consigliabile integrare strumenti e procedure supplementari di intelligenza artificiale responsabile (RAI). Per altri dettagli, vedere Sviluppo di intelligenza artificiale generativa responsabile in Windows.