Kom igång med AI-avbildning i Windows App SDK
Viktig
Tillgänglig i den senaste experimentella kanalen version av Windows App SDK.
Windows App SDK:s experimentella kanal innehåller API:er och funktioner i tidiga utvecklingsstadier. Alla API i den experimentella kanalen är föremål för omfattande revisioner och betydande ändringar och kan när som helst tas bort från efterföljande versioner. Experimentella funktioner stöds inte för användning i produktionsmiljöer och appar som använder dem kan inte publiceras till Microsoft Store.
- Bildbeskrivningsfunktioner är inte tillgängliga i Kina.
- Fristående appar stöds inte.
Avbildningsfunktioner tillhandahålls av Windows App SDK via en uppsättning API:er som stöds av artificiell intelligens (AI) som stöder följande funktioner:
- Bild superupplösning: skalning och skärpa bilder
- Bildbeskrivning: skapa text som beskriver bilden
- bildsegmentering: identifiera objekt i en bild
Information om APIhittas i API-referens för AI-bildfunktioner i Windows App SDK.
Information om innehållsmodereringfinns i Innehållssäkerhet med generativa AI-API:er.
Tips
Ge feedback om dessa API:er och deras funktioner genom att skapa ett nytt problem i GitHub-lagringsplatsen för Windows App SDK (inkludera Imaging- i rubriken) eller genom att svara på ett befintligt problem.
Förutsättningar
- En Copilot+ PC från Qualcomm, Intel eller AMD.
- AMD-baserade Copilot+-datorer stöder för närvarande inte Image Super Resolution.
- Arm64EC (emuleringskompatibel) stöds inte för närvarande.
- Windows 11 Insider Preview Build 26120.3073 (Dev- och Beta-kanaler) eller senare måste installeras på enheten.
Vad kan jag göra med superupplösning för bilder?
API:er för bildsuperupplösning i Windows App SDK möjliggör bildvässning och skalning.
Skalning är begränsad till en maximal faktor på 8x. Högre skalningsfaktorer kan introducera artefakter och kompromettera bildnoggrannhet. Om antingen den slutliga bredden eller höjden är mer än åtta gånger deras ursprungliga värden genereras ett undantag.
I följande exempel visas hur du ändrar skalan (targetWidth
, targetHeight
) för en befintlig bitmappsbild (softwareBitmap
) och förbättrar bildskärpa (för att förbättra skärpan utan att skala bilden anger du bara den befintliga bildbredden och höjden) med hjälp av ett ImageScaler
objekt.
Kontrollera att modellen Image Super Resolution är tillgänglig genom att anropa metoden
ImageScaler.IsAvailable
och sedan vänta på att metodenImageScaler.MakeAvailableAsync
ska returneras.När modellen Image Super Resolution är tillgänglig skapar du ett
ImageScaler
objekt som refererar till den.Hämta en skarp och skalad version av den befintliga avbildningen genom att skicka den befintliga bilden och önskad bredd och höjd till modellen med hjälp av metoden
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);
Vad kan jag göra med bildbeskrivning?
Viktig
Bildbeskrivning är för närvarande inte tillgänglig i Kina.
API:erna för bildbeskrivning i Windows App SDK ger möjlighet att generera olika typer av textbeskrivningar för en bild.
Följande typer av textbeskrivningar stöds:
- Hjälpmedel – Ger en lång beskrivning med information som är avsedd för användare med hjälpmedelsbehov.
- Caption – Ger en kort beskrivning som är lämplig för en bildtext. Standardvärdet om inget värde har angetts.
- DetailedNarration – Innehåller en lång beskrivning.
- OfficeCharts – Innehåller en beskrivning som är lämplig för diagram och grafer.
Eftersom dessa API:er använder Maskininlärningsmodeller (ML) kan tillfälliga fel uppstå där texten inte beskriver bilden korrekt. Därför rekommenderar vi inte att du använder dessa API:er för bilder i följande scenarier:
- Om bilderna innehåller potentiellt känsligt innehåll och felaktiga beskrivningar kan vara kontroversiella, till exempel flaggor, kartor, glober, kulturella symboler eller religiösa symboler.
- När korrekta beskrivningar är kritiska, till exempel för medicinsk rådgivning eller diagnos, juridiskt innehåll eller finansiella dokument.
Hämta textbeskrivning från en bild
API:et för bildbeskrivning tar en bild, önskad textbeskrivningstyp (valfritt) och den nivå av innehållsmoderering som du vill använda (valfritt) för att skydda mot skadlig användning.
I följande exempel visas hur du hämtar en textbeskrivning för en bild.
Not
Bilden måste vara ett ImageBuffer
objekt eftersom SoftwareBitmap
för närvarande inte stöds. Det här exemplet visar hur du konverterar SoftwareBitmap
till ImageBuffer
.
Kontrollera att modellen Image Super Resolution är tillgänglig genom att anropa metoden
ImageDescriptionGenerator.IsAvailable
och sedan vänta på att metodenImageDescriptionGenerator.MakeAvailableAsync
ska returneras.När modellen Image Super Resolution är tillgänglig skapar du ett
ImageDescriptionGenerator
objekt som refererar till den.(Valfritt) Skapa ett
ContentFilterOptions
objekt och ange önskade värden. Om du väljer att använda standardvärden kan du skicka in ett null-objekt.Hämta bildbeskrivningen (
LanguageModelResponse.Response
) genom att anropa metodenImageDescriptionGenerator.DescribeAsync
med den ursprungliga bilden, en uppräkning för önskad beskrivningstyp (valfritt) ochContentFilterOptions
-objektet (valfritt).
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();
Vad kan jag göra med bildsegmentering?
Bildsegmentering kan användas för att identifiera specifika objekt i en bild. Modellen tar både en bild och ett "ledtrådar"-objekt och returnerar en mask över det identifierade objektet.
Tips kan ges genom valfri kombination av följande:
- Koordinater för punkter som tillhör det du identifierar.
- Koordinater för punkter som inte tillhör det du identifierar.
- En koordinatrektangel som omger det du identifierar.
Ju fler tips du ger, desto mer exakt kan modellen vara. Följ dessa riktlinjer för tips för att minimera felaktiga resultat eller fel.
- Undvik att använda flera rektanglar i ett tips eftersom de kan skapa en felaktig mask.
- Undvik att uteslutande använda exkluderingspunkter utan att inkludera punkter eller en rektangel.
- Ange inte mer än maximalt 32 koordinater (1 för en punkt, 2 för en rektangel) eftersom detta returnerar ett fel.
Den returnerade masken är i gråskala-8-format med maskens bildpunkter för det identifierade objektet med värdet 255 (alla andra har värdet 0).
Identifiera ett objekt i en bild
I följande exempel visas olika sätt att identifiera ett objekt i en bild. Exemplen förutsätter att du redan har ett bitmappsobjekt (softwareBitmap
) för indata.
Kontrollera att bildsegmenteringsmodellen är tillgänglig genom att anropa metoden
IsAvailable
och vänta på att metodenMakeAvailableAsync
framgångsrikt slutförs.När bildsegmenteringsmodellen är tillgänglig skapar du ett
ImageObjectExtractor
objekt som refererar till den.Skicka bilden till
ImageObjectExtractor.CreateWithSoftwareBitmapAsync
.Skapa ett
ImageObjectExtractorHint
objekt. Andra sätt att skapa ett tipsobjekt med olika indata visas senare.Skicka tipset till modellen med hjälp av metoden
GetSoftwareBitmapObjectMask
, som returnerar slutresultatet.
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);
Ange tips med inkluderade och exkluderade punkter
Det här kodfragmentet visar hur du använder både inkluderade och exkluderade punkter som tips.
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}
}
);
Ange tips med rektangel
Det här kodfragmentet visar hur du använder en rektangel (RectInt32 är X, Y, Width, Height
) som ett tips.
ImageObjectExtractorHint hint(
includeRects:
new List<RectInt32> {new RectInt32(370, 278, 285, 126)},
includePoints: null,
excludePoints: null );
ImageObjectExtractorHint hint(
{
RectInt32{370, 278, 285, 126}
},
{},
{}
);
Ansvarsfull AI
Dessa bild-API:er ger utvecklare kraftfulla, tillförlitliga modeller för att skapa appar med säkra och säkra AI-upplevelser. Vi har använt en kombination av följande steg för att säkerställa att dessa bild-API:er är tillförlitliga, säkra och byggda på ett ansvarsfullt sätt. Vi rekommenderar att du granskar de metodtips som beskrivs i Ansvarsfull generativ AI-utveckling i Windows när du implementerar AI-funktioner i din app.
- Noggrann testning och utvärdering av modellkvaliteten för att identifiera och minimera potentiella risker.
- Stegvis lansering av experimentella utgåvor av bild-API:et. Efter den slutliga experimentella versionen utökas distributionen till signerade appar för att säkerställa att skanningar av skadlig kod har tillämpats på program med lokala modellfunktioner.
- Ange en lokal AI-modell för innehållsmoderering som identifierar och filtrerar skadligt innehåll i både indata och AI-genererade utdata för alla API:er som använder generativa AI-modeller. Den här lokala innehållsmodereringsmodellen baseras på Azure AI Content Safety- modell för textmoderering och ger liknande prestanda.
Viktig
Inget system för innehållssäkerhet är ofelbart och ibland kan fel uppstå, så vi rekommenderar att du integrerar ytterligare verktyg och metoder för ansvarsfull AI (RAI). Mer information finns i Ansvarsfull generativ AI-utveckling i Windows.