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

Importante

Questa funzionalità non è ancora disponibile. È previsto che venga fornito in una prossima versione sperimentale del canale di SDK per app di Windows.

Il canale sperimentale SDK per app di Windows 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. Non sono supportate per l'uso in ambienti di produzione e le app che usano funzionalità sperimentali non possono essere pubblicate in Microsoft Store.

Le funzionalità di creazione dell'immagine saranno supportate dal SDK per app di Windows tramite un set di API basate sull'intelligenza artificiale (AI) supportate sia per la scalabilità che per la nitidezza delle immagini (risoluzione con super risoluzione immagini) e per identificare gli oggetti all'interno di un'immagine (segmentazione di immagini).

Per informazioni dettagliate sull'API, vedere Riferimento API per le funzionalità di creazione di immagini basate su intelligenza artificiale nella SDK per app di Windows.

Suggerimento

Fornire commenti e suggerimenti su queste API e sulle relative funzionalità creando un nuovo problema nel repository GitHub SDK per app di Windows. (Assicurarsi di includere Imaging nel titolo!)

Prerequisiti

  • PC CoPilot+

    Nota

    I PC CoPilot+ basati su AMD non supportano la risoluzione super-immagine.

Cosa è possibile fare con la risoluzione SDK per app di Windows e risoluzione con super risoluzione immagini?

Usare le nuove funzionalità di risoluzione superiore delle immagini di intelligenza artificiale nelle SDK per app di Windows per affinare le immagini e affinare le immagini durante il ridimensionamento.

Nota

Il ridimensionamento viene ridimensionato fino a un fattore massimo di 8 volte (i fattori di scala superiore 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.

Aumentare la nitidezza di un'immagine

Questo esempio mostra come modificare la scala (, targetWidth) di un'immagine bitmap software esistente (targetHeightsoftwareBitmap) e migliorarne la nitidezza (se si vuole migliorare la nitidezza senza ridimensionare l'immagine, specificare la larghezza e l'altezza dell'immagine originale).

  1. Prima di tutto, si garantisce che il modello image super resolution sia disponibile chiamando il metodo IsAvailable e attendendo che il metodo MakeAvailableAsync venga restituito correttamente.
  2. Dopo aver reso disponibile il modello image super resolution, viene creato un oggetto per farvi riferimento.
  3. Si ottiene quindi l'immagine finale inviando l'immagine originale e la larghezza e l'altezza dell'immagine finale al modello usando il metodo ScaleSoftwareBitmap.
using Microsft.Windows.Imaging;
using Windows.Graphics.Imaging;

if (!ImageScaler.IsAvailable())
{
    var result = ImageScaler.MakeAvailableAsync();
    if (result.Status != PackageDeploymentStatus.CompletedSuccess)
    {
        throw result.ExtendedError;
    }
}

var imageScaler = await ImageScaler.CreateAsync();
var finalImage = imageScaler.ScaleSoftwareBitmap(softwareBitmap, targetWidth, targetHeight);
#include "winrt/Microsoft.Graphics.Imaging.h" 
#include "winrt/Windows.Graphics.Imaging.h" 
using namespace winrt::Windows::Graphics::Imaging; 
using namespace winrt::Microsoft::Graphics::Imaging; 

if (!ImageScaler::IsAvailable()) 
{ 
    auto result = ImageScaler::MakeAvailableAsync(); 
    if (result.Status() != AsyncStatus::Completed) 
    { 
        throw result.ErrorCode(); 
    } 
}

ImageScaler imageScaler = ImageScaler::CreateAsync().get(); 
ImageBuffer buffer = imageScaler.ScaleSoftwareBitmap(softwareBitmap, targetWidth, targetHeight); 

Cosa posso fare con la segmentazione di SDK per app di Windows e immagine?

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. Tuttavia, seguire queste linee guida per evitare risultati o errori non accurati.

  • 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 grigioscale-8. I pixel dell'oggetto identificato all'interno della maschera sono 255 (il resto è 0 senza pixel che contengano alcun valore tra).

Identificare un oggetto all'interno di un'immagine

Gli esempi seguenti illustrano i vari modi in cui è possibile identificare un oggetto all'interno di un'immagine. Si supponga di avere già un oggetto bitmap software (softwareBitmap) per l'input.

  1. Prima di tutto, assicurarsi che il modello di segmentazione dell'immagine sia disponibile chiamando il metodo IsAvailable e attendendo che il metodo MakeAvailableAsync restituisca correttamente.
  2. Quando il modello di segmentazione immagine è disponibile, viene creato un oggetto per farvi riferimento.
  3. Successivamente, creiamo una classe ImageObjectExtractor passando l'immagine a ImageObjectExtractor.CreateWithImageBufferAsync (o CreateWithSoftwareBitmapAsync a seconda del tipo di immagine).
  4. Verrà quindi creato un oggetto ImageObjectExtractorHint (verranno illustrati altri modi per creare un oggetto hint con input diversi più avanti in questo argomento).
  5. Infine, si invia l'hint al modello usando il metodo GetSoftwareBitmapObjectMask, che restituisce il risultato finale.
using Microsft.Windows.Imaging;
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(
    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" 
using namespace winrt::Windows::Graphics::Imaging; 
using namespace winrt::Microsoft::Graphics::Imaging; 

if (!ImageObjectExtractor::IsAvailable()) 
{ 
    auto result = ImageObjectExtractor::MakeAvailableAsync(); 
    if (result.Status() != AsyncStatus::Completed) 
    { 
        throw result.ErrorCode(); 
    } 
}

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

In questo frammento di codice viene illustrato 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

In questo frammento di codice viene illustrato 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}
    }, 
    {},
    {}
);

Risorse aggiuntive