Delen via


Aan de slag met AI-imaging in de Windows App SDK

Belangrijk

Beschikbaar in het nieuwste experimenteel kanaal release van de Windows App SDK.

Het experimentele kanaal van de Windows App SDK bevat API's en functies in een vroeg stadium van ontwikkeling. Alle API's in het experimentele kanaal zijn onderhevig aan uitgebreide revisies en ingrijpende veranderingen en kunnen te allen tijde uit volgende releases worden verwijderd. Experimentele functies worden niet ondersteund voor gebruik in productieomgevingen en apps die deze gebruiken, kunnen niet worden gepubliceerd naar de Microsoft Store.

  • Functies voor beschrijving van afbeeldingen zijn niet beschikbaar op het vasteland van China.
  • Zelfstandige apps worden niet ondersteund.

Imaging-functies worden geleverd door de Windows App SDK via een set API's, ondersteund door kunstmatige intelligentie (AI), die ondersteuning bieden voor de volgende mogelijkheden:

  • Superresolutie van afbeeldingen: afbeeldingen schalen en verscherpen
  • Beschrijving van afbeelding: tekst produceren die de afbeelding beschrijft
  • afbeeldingssegmentatie: objecten in een afbeelding identificeren

Zie API-ref voor AI imaging-functies in de Windows App SDKvoor API-details.

Zie voor moderatie van inhoud details, Inhoudsveiligheid met generatieve AI-API's.

Tip

Geef feedback over deze API's en hun functionaliteit door een nieuw probleem te maken in de GitHub-opslagplaats van de Windows App SDK (inclusief Imaging in de titel) of door te reageren op een bestaand probleem.

Voorwaarden

Wat kan ik doen met Image Super Resolution?

Met de API's voor superresolutie van afbeeldingen in de Windows App SDK kunnen afbeeldingen worden scherper en geschaald.

Het schalen is beperkt tot een maximale factor van 8x. Hogere schaalfactoren kunnen artefacten introduceren en de nauwkeurigheid van afbeeldingen in gevaar brengen. Als de uiteindelijke breedte of hoogte groter is dan 8x de oorspronkelijke waarden, wordt er een uitzondering gegenereerd.

In het volgende voorbeeld ziet u hoe u de schaal (targetWidth, targetHeight) van een bestaande software bitmapafbeelding (softwareBitmap) kunt wijzigen en de scherpte van de afbeelding kunt verbeteren (om de scherpte te verbeteren zonder de afbeelding te schalen, geeft u de bestaande afbeeldingsbreedte en -hoogte op) met behulp van een ImageScaler-object.

  1. Zorg ervoor dat het afbeeldingssuperresolutiemodel beschikbaar is door de ImageScaler.IsAvailable methode aan te roepen en vervolgens te wachten tot de ImageScaler.MakeAvailableAsync methode is geretourneerd.

  2. Zodra het Image Super Resolution-model beschikbaar is, maakt u een ImageScaler-object om ernaar te verwijzen.

  3. Haal een verscherpte en geschaalde versie van de bestaande afbeelding op door de bestaande afbeelding en de gewenste breedte en hoogte door te geven aan het model met behulp van de methode 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);

Wat kan ik doen met Afbeeldingsbeschrijving?

Belangrijk

Afbeeldingsomschrijving is momenteel niet beschikbaar op het vasteland van China.

De BESCHRIJVINGs-API's voor afbeeldingen in de Windows App SDK bieden de mogelijkheid om verschillende typen tekstbeschrijvingen voor een afbeelding te genereren.

De volgende typen tekstbeschrijvingen worden ondersteund:

  • Toegankelijkheid : biedt een lange beschrijving met details die zijn bedoeld voor gebruikers met toegankelijkheidsbehoeften.
  • Bijschrift - Het biedt een korte beschrijving die geschikt is voor een bijschrift bij een afbeelding. De standaardwaarde als er geen waarde is opgegeven.
  • DetailedNarration - Biedt een lange beschrijving.
  • OfficeCharts - Biedt een beschrijving die geschikt is voor grafieken en diagrammen.

Omdat deze API's machine learning-modellen (ML) gebruiken, kunnen er af en toe fouten optreden waarbij de tekst de afbeelding niet correct beschrijft. Daarom raden we het gebruik van deze API's niet aan voor afbeeldingen in de volgende scenario's:

  • Wanneer de afbeeldingen mogelijk gevoelige inhoud en onjuiste beschrijvingen bevatten, kunnen controversieel zijn, zoals vlaggen, kaarten, wereldbollen, culturele symbolen of religieuze symbolen.
  • Wanneer nauwkeurige beschrijvingen kritiek zijn, zoals voor medisch advies of diagnose, juridische inhoud of financiële documenten.

Tekstbeschrijving ophalen uit een afbeelding

De Beschrijvings-API voor afbeeldingen maakt gebruik van een afbeelding, het gewenste type tekstbeschrijving (optioneel) en het niveau van inhoudsbeheer dat u wilt gebruiken (optioneel) om te beschermen tegen schadelijk gebruik.

In het volgende voorbeeld ziet u hoe u een tekstbeschrijving voor een afbeelding kunt ophalen.

Notitie

De afbeelding moet een ImageBuffer object zijn, omdat SoftwareBitmap momenteel niet wordt ondersteund. In dit voorbeeld ziet u hoe u SoftwareBitmap converteert naar ImageBuffer.

  1. Zorg ervoor dat het afbeeldingssuperresolutiemodel beschikbaar is door de ImageDescriptionGenerator.IsAvailable methode aan te roepen en vervolgens te wachten tot de ImageDescriptionGenerator.MakeAvailableAsync methode is geretourneerd.

  2. Zodra het Image Super Resolution-model beschikbaar is, maakt u een ImageDescriptionGenerator-object om ernaar te verwijzen.

  3. (Optioneel) Maak een ContentFilterOptions-object en geef de gewenste waarden op. Als u ervoor kiest om standaardwaarden te gebruiken, kunt u een null-object doorgeven.

  4. Haal de beschrijving van de afbeelding (LanguageModelResponse.Response) op door de methode ImageDescriptionGenerator.DescribeAsync aan te roepen met de oorspronkelijke afbeelding, een opsomming voor het gewenste beschrijvingstype (optioneel) en het ContentFilterOptions-object (optioneel).

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

Wat kan ik doen met afbeeldingssegmentatie?

Afbeeldingssegmentatie kan worden gebruikt om specifieke objecten in een afbeelding te identificeren. Het model neemt zowel een afbeelding als een hints-object en geeft een masker van het geïdentificeerde object terug.

Hints kunnen worden verstrekt via elke combinatie van het volgende:

  • Coördinaten voor punten die horen bij wat u identificeert.
  • Coördinaten voor punten die niet horen bij wat u identificeert.
  • Een coördinaatrechthoek die insluit wat u identificeert.

Hoe meer hints u opgeeft, hoe nauwkeuriger het model kan zijn. Volg deze hintrichtlijnen om onjuiste resultaten of fouten te minimaliseren.

  • Vermijd het gebruik van meerdere rechthoeken in een hint, omdat ze een onnauwkeurig masker kunnen produceren.
  • Vermijd het gebruik van uitsluitend uitsluitingspunten zonder inclusiepunten of een rechthoek.
  • Geef niet meer op dan het ondersteunde maximum van 32 coördinaten (1 voor een punt, 2 voor een rechthoek), omdat hiermee een fout wordt geretourneerd.

Het geretourneerde masker heeft een grijswaarden-8-indeling waarbij de pixels van het masker voor het geïdentificeerde object een waarde van 255 hebben (alle andere pixels hebben een waarde van 0).

Een object in een afbeelding identificeren

In de volgende voorbeelden ziet u manieren om een object in een afbeelding te identificeren. In de voorbeelden wordt ervan uitgegaan dat u al een software bitmapobject (softwareBitmap) voor de invoer hebt.

  1. Zorg ervoor dat het afbeeldingssegmentatiemodel beschikbaar is door de methode IsAvailable aan te roepen en te wachten tot de MakeAvailableAsync methode is geretourneerd.

  2. Zodra het model afbeeldingssegmentatie beschikbaar is, maakt u een ImageObjectExtractor-object om ernaar te verwijzen.

  3. Geef de afbeelding door aan ImageObjectExtractor.CreateWithSoftwareBitmapAsync.

  4. Maak een ImageObjectExtractorHint object. Andere manieren om een hintobject met verschillende invoer te maken, worden later gedemonstreerd.

  5. Verzend de hint naar het model met behulp van de methode GetSoftwareBitmapObjectMask, waarmee het uiteindelijke resultaat wordt geretourneerd.

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

Hints opgeven met opgenomen en uitgesloten punten

Dit codefragment laat zien hoe u zowel opgenomen als uitgesloten punten gebruikt als hints.

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

Hints opgeven met rechthoek

Dit codefragment laat zien hoe u een rechthoek (RectInt32 is X, Y, Width, Height) gebruikt als hint.

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

Verantwoorde AI

Deze imaging-API's bieden ontwikkelaars krachtige, betrouwbare modellen voor het bouwen van apps met veilige, beveiligde AI-ervaringen. We hebben een combinatie van de volgende stappen gebruikt om ervoor te zorgen dat deze imaging-API's betrouwbaar, veilig en op verantwoorde wijze zijn gebouwd. We raden u aan de beste praktijken te bekijken die beschreven staan in Responsible Generatieve AI-ontwikkeling op Windows bij het implementeren van AI-functies in uw app.

  • Grondig testen en evalueren van de modelkwaliteit om potentiële risico's te identificeren en te beperken.
  • Incrementele uitrol van experimentele releases van de API voor beeldverwerking. Na de laatste experimentele release wordt de implementatie uitgebreid naar ondertekende apps om ervoor te zorgen dat malwarescans zijn toegepast op toepassingen met lokale modelmogelijkheden.
  • Geef een lokaal AI-model op voor inhoudsbeheer waarmee schadelijke inhoud wordt geïdentificeerd en gefilterd in zowel de invoer- als door AI gegenereerde uitvoer van API's die gebruikmaken van generatieve AI-modellen. Dit lokale model voor inhoudsbeheer is gebaseerd op het Azure AI Content Safety model voor tekstbeheer en biedt vergelijkbare prestaties.

Belangrijk

Geen inhoudsveiligheidssysteem is onfeilbaar en er kunnen incidentele fouten optreden, dus we raden u aan aanvullende responsible AI-tools en praktijken te integreren. Zie Verantwoordelijke Generatieve AI-ontwikkeling op Windowsvoor meer informatie.