Freigeben über


Erste Schritte mit KI-Imaging im Windows App SDK

Wichtig

Im neuesten experimentellen Kanal-Release für das Windows App SDK verfügbar.

Der experimentelle Kanal des Windows App SDK umfasst APIs und Features in frühen Entwicklungsphasen. Alle APIs im experimentellen Kanal unterliegen umfangreichen Überarbeitungen und Breaking Changes und können jederzeit aus nachfolgenden Versionen entfernt werden. Experimentelle Features werden nicht für die Verwendung in Produktionsumgebungen und Apps unterstützt, die sie verwenden, können nicht im Microsoft Store veröffentlicht werden.

  • Eigenständige Apps werden nicht unterstützt.

Bildbearbeitungsfunktionen werden vom Windows App SDK über eine Reihe von APIs bereitgestellt, die von künstlicher Intelligenz (AI) unterstützt werden und die folgenden Fähigkeiten ermöglichen:

  • Bild-Superauflösung: Skalieren und Schärfen von Bildern
  • Bildbeschreibung: Erstellen von Text, der das Bild beschreibt
  • Bildsegmentierung: Identifizieren von Objekten innerhalb eines Bilds

Weitere Informationen zu APIs finden Sie in der API-Referenz für KI-Bildverarbeitungsfunktionen im Windows App SDK.

Details zur Inhaltsmoderationfinden Sie unter Inhaltssicherheit mit generativen AI-APIs.

Tipp

Geben Sie Feedback zu diesen APIs und deren Funktionalität, indem Sie ein neues Problem im GitHub-Repository des Windows App SDK erstellen (einschließlich Imaging- im Titel) oder indem Sie auf ein vorhandenes Problemreagieren.

Voraussetzungen

Was kann ich mit der Bild-Superauflösung tun?

Die Bild-Superauflösungs-APIs im Windows App SDK ermöglichen bildschärfen und skalieren.

Die Skalierung ist auf einen maximalen Faktor von 8x beschränkt. Höhere Skalierungsfaktoren können Artefakte erzeugen und die Bildgenauigkeit beeinträchtigen. Wenn die endgültige Breite oder Höhe mehr als das Achtfache der ursprünglichen Werte beträgt, wird ein Ausnahmefehler ausgelöst.

Das folgende Beispiel zeigt, wie Sie die Skalierung (targetWidth, targetHeight) eines vorhandenen Software-Bitmapbilds (softwareBitmap) ändern und die Bildschärfe verbessern (um die Schärfe ohne Skalierung des Bilds zu verbessern, einfach die vorhandene Bildbreite und -höhe) mithilfe eines ImageScaler Objekts angeben.

  1. Stellen Sie sicher, dass das Image Super Resolution-Modell verfügbar ist, indem Sie die ImageScaler.IsAvailable-Methode aufrufen und dann darauf warten, dass die ImageScaler.MakeAvailableAsync Methode erfolgreich zurückgegeben wird.

  2. Nachdem das Modell für die Bild-Superauflösung verfügbar ist, erstellen Sie ein ImageScaler Objekt, um darauf zu verweisen.

  3. Rufen Sie eine geschärfete und skalierte Version des vorhandenen Bilds ab, indem Sie das vorhandene Bild und die gewünschte Breite und Höhe mithilfe der ScaleSoftwareBitmap-Methode an das Modell übergeben.

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

Was kann ich mit der Bildbeschreibung tun?

Wichtig

Bildbeschreibung ist derzeit in Festlandchina nicht verfügbar.

Die Bildbeschreibungs-APIs im Windows App SDK bieten die Möglichkeit, verschiedene Arten von Textbeschreibungen für ein Bild zu generieren.

Die folgenden Arten von Textbeschreibungen werden unterstützt:

  • Barrierefreiheit – Bietet eine lange Beschreibung mit Details, die für Benutzer mit speziellen Zugangsanforderungen vorgesehen sind.
  • Überschrift – Stellt eine kurze Beschreibung bereit, die für eine Bildüberschrift passend ist. Der Standardwert, wenn kein Wert angegeben wird.
  • DetailedNarration – Enthält eine lange Beschreibung.
  • OfficeCharts- – Stellt eine Beschreibung bereit, die für Diagramme und Schaubilder geeignet ist.

Da diese APIs Machine Learning (ML)-Modelle verwenden, können gelegentlich Fehler auftreten, bei denen der Text das Bild nicht richtig beschreibt. Daher wird die Verwendung dieser APIs für Bilder in den folgenden Szenarien nicht empfohlen:

  • Wenn Bilder potenziell sensible Inhalte zeigen und durch ungenaue Beschreibungen umstritten sein könnten, wie z. B. Flaggen, Karten, Globen, kulturelle Symbole oder religiöse Symbole.
  • Wenn genaue Beschreibungen wichtig sind, z. B. für medizinische Beratung oder Diagnose, rechtliche Inhalte oder Finanzdokumente.

Abrufen einer Textbeschreibung aus einem Bild

Die Bildbeschreibungs-API verwendet ein Bild, den gewünschten Textbeschreibungstyp (optional) und die Ebene der Inhaltsmoderation, die Sie verwenden möchten (optional), um vor schädlicher Verwendung zu schützen.

Das folgende Beispiel zeigt, wie Sie eine Textbeschreibung für ein Bild abrufen.

Hinweis

Das Bild muss ein ImageBuffer Objekt sein, da SoftwareBitmap zurzeit nicht unterstützt wird. In diesem Beispiel wird veranschaulicht, wie SoftwareBitmap in ImageBufferkonvertiert werden.

  1. Stellen Sie sicher, dass das Image Super Resolution-Modell verfügbar ist, indem Sie die ImageDescriptionGenerator.IsAvailable-Methode aufrufen und dann darauf warten, dass die ImageDescriptionGenerator.MakeAvailableAsync Methode erfolgreich zurückgegeben wird.

  2. Nachdem das Modell für die Bild-Superauflösung verfügbar ist, erstellen Sie ein ImageDescriptionGenerator Objekt, um darauf zu verweisen.

  3. (Optional) Erstellen Sie ein ContentFilterOptions-Objekt, und geben Sie Die bevorzugten Werte an. Wenn Sie sich für die Verwendung von Standardwerten entscheiden, können Sie ein NULL-Objekt übergeben.

  4. Rufen Sie die Bildbeschreibung (LanguageModelResponse.Response) ab, indem Sie die ImageDescriptionGenerator.DescribeAsync-Methode mit dem Originalbild, eine Enumeration für den bevorzugten Beschreibungstyp (optional) und das ContentFilterOptions-Objekt (optional) aufrufen.

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

Was kann ich mit der Bildsegmentierung tun?

Die Bildsegmentierung kann dazu verwendet werden, bestimmte Objekte in einem Bild zu identifizieren. Das Modell verwendet sowohl ein Bild als auch ein „hints“-Objekt und gibt eine Maske des identifizierten Objekts zurück.

Hinweise können durch eine beliebige Kombination der folgenden Punkte gegeben werden:

  • Koordinaten für Punkte, die zu dem Objekt gehören, das Sie identifizieren möchten.
  • Koordinaten für Punkte, die nicht zu dem Objekt gehören, das Sie identifizieren möchten.
  • Ein Koordinatenrechteck, das den zu identifizierenden Punkt umschließt.

Je mehr Hinweise Sie geben, desto präziser kann das Modell arbeiten. Befolgen Sie diese Hinweise, um ungenaue Ergebnisse oder Fehler zu minimieren.

  • Vermeiden Sie es, mehrere Rechtecke in einem Hinweis zu verwenden, da diese eine ungenaue Maske ergeben können.
  • Vermeiden Sie es, ausschließlich Ausschlusspunkte ohne Einschlusspunkte oder ein Rechteck zu verwenden.
  • Geben Sie nicht mehr als die unterstützte Höchstzahl von 32 Koordinaten an (1 für einen Punkt, 2 für ein Rechteck), da dies zu einem Fehler führt.

Die zurückgegebene Maske ist im Graustufen-8-Format mit den Pixeln der Maske für das identifizierte Objekt mit einem Wert von 255 (alle anderen mit dem Wert 0) dargestellt.

Identifizieren eines Objekts in einem Bild

Die folgenden Beispiele zeigen Möglichkeiten zum Identifizieren eines Objekts innerhalb eines Bilds. In den Beispielen wird davon ausgegangen, dass Sie bereits über ein Software-Bitmapobjekt (softwareBitmap) für die Eingabe verfügen.

  1. Stellen Sie sicher, dass das Bildsegmentierungsmodell verfügbar ist, indem Sie die IsAvailable-Methode aufrufen und darauf warten, dass die MakeAvailableAsync Methode erfolgreich zurückgegeben wird.

  2. Nachdem das Bildsegmentierungsmodell verfügbar ist, erstellen Sie ein ImageObjectExtractor Objekt, um darauf zu verweisen.

  3. Übergeben Sie das Bild an ImageObjectExtractor.CreateWithSoftwareBitmapAsync.

  4. Erstellen Sie ein ImageObjectExtractorHint-Objekt. Weitere Möglichkeiten zum Erstellen eines Hinweisobjekts mit unterschiedlichen Eingaben werden später veranschaulicht.

  5. Übermitteln Sie den Hinweis mithilfe der GetSoftwareBitmapObjectMask-Methode an das Modell, das das endgültige Ergebnis zurückgibt.

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

Hinweise mit eingeschlossenen und ausgeschlossenen Punkten angeben

Dieser Codeausschnitt veranschaulicht die Verwendung von eingeschlossenen und ausgeschlossenen Punkten als Hinweise.

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

Hinweise mit Rechteck angeben

Dieser Codeausschnitt veranschaulicht die Verwendung eines Rechtecks (RectInt32 ist X, Y, Width, Height) als Hinweis.

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

Verantwortungsvolle KI

Diese Imageerstellungs-APIs bieten Entwicklern leistungsstarke, vertrauenswürdige Modelle zum Erstellen von Apps mit sicheren, sicheren KI-Erfahrungen. Wir haben eine Kombination der folgenden Schritte verwendet, um sicherzustellen, dass diese Imageerstellungs-APIs vertrauenswürdig, sicher und verantwortungsbewusst erstellt sind. Es wird empfohlen, die in verantwortliche generative KI-Entwicklung unter Windows beschriebenen bewährten Methoden beim Implementieren von KI-Features in Ihrer App zu überprüfen.

  • Gründliche Tests und Bewertungen der Modellqualität, um potenzielle Risiken zu identifizieren und zu mindern.
  • Inkrementelles Rollout von experimentellen Bildverarbeitungs-API-Versionen. Nach der endgültigen experimentellen Version wird das Rollout auf signierte Apps erweitert, um sicherzustellen, dass Schadsoftwarescans auf Anwendungen mit lokalen Modellfunktionen angewendet wurden.
  • Stellen Sie ein lokales KI-Modell für die Inhaltsmoderation bereit, das schädliche Inhalte sowohl in der Eingabe als auch in der VON KI generierten Ausgabe aller APIs identifiziert und filtert, die generative KI-Modelle verwenden. Dieses lokale Inhaltsmoderationsmodell basiert auf dem Azure AI Content Safety Modell für die Textmoderation und bietet ähnliche Leistung.

Wichtig

Kein Sicherheitssystem für Inhalte ist unfehlbar, und gelegentlich können Fehler auftreten. Daher empfehlen wir die Integration zusätzlicher verantwortlicher KI-Tools und -Praktiken (Responsible AI). Weitere Informationen finden Sie unter Verantwortliche generative KI-Entwicklung auf Windows.