Freigeben über


Bildobjektextraktion

Mithilfe des Bildobjektextraktionsmoduls können Sie bestimmte Objekte in einem Bild identifizieren. Das Modell verwendet sowohl ein Bild als auch ein „hints“-Objekt und gibt eine Maske des identifizierten Objekts zurück.

Api-Details finden Sie in der API-Referenz für KI-Imageerstellungsfeatures.

Details zur Inhaltsmoderation finden Sie unter Inhaltssicherheit mit generativen AI-APIs.

Von Bedeutung

Paketmanifestanforderungen: Um Windows AI-Imageerstellungs-APIs zu verwenden, muss Ihre App als MSIX-Paket mit der systemAIModels in Ihrer Package.appxmanifestApp deklarierten Funktion verpackt werden. Stellen Sie außerdem sicher, dass das Attribut Ihres Manifests MaxVersionTested auf eine aktuelle Windows-Version festgelegt ist (z. B. 10.0.26226.0 oder höher), um die Windows AI-Features richtig zu unterstützen. Die Verwendung älterer Werte kann beim Laden des Modells zu Fehlern "Nicht durch App deklariert" führen.

<Dependencies>
  <TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.17763.0" MaxVersionTested="10.0.26226.0" />
  <TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.17763.0" MaxVersionTested="10.0.26226.0" />
</Dependencies>

Bereitstellen von Hinweisen

Sie können Hinweise über eine beliebige Kombination der folgenden Optionen bereitstellen:

  • 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 die Verwendung mehrerer Rechtecke in einem Hinweis, da dies zu einer ungenauen Maske führen kann.
  • 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 und die Pixel der Maske für das identifizierte Objekt haben den Wert 255, während alle anderen Pixel den Wert 0 haben.

Image Object Extractor (Beispiel)

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 Image Object Extractor-Modell verfügbar ist, indem Sie die GetReadyState-Methode aufrufen und darauf warten, dass die EnsureReadyAsync-Methode erfolgreich zurückgegeben wird.

  2. Nachdem das Image Object Extractor-Modell verfügbar ist, erstellen Sie ein ImageObjectExtractor-Objekt , um darauf zu verweisen.

  3. Übergeben Sie das Bild an 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.AI;
using Microsoft.Windows.Management.Deployment;
using Windows.Graphics.Imaging;

if (ImageObjectExtractor.GetReadyState() == AIFeatureReadyState.NotReady) 
{
    var result = await ImageObjectExtractor.EnsureReadyAsync();
    if (result.Status != AIFeatureReadyResultState.Success)
    {
        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/Microsoft.Windows.AI.Imaging.h>
#include <winrt/Windows.Graphics.Imaging.h>
#include <winrt/Windows.Foundation.h>
using namespace winrt::Microsoft::Graphics::Imaging; 
using namespace winrt::Microsoft::Windows::AI.Imaging;
using namespace winrt::Windows::Graphics::Imaging; 
using namespace winrt::Windows::Foundation;

if (ImageObjectExtractor::GetReadyState() == AIFeatureReadyState::NotReady)
{
    auto loadResult = ImageObjectExtractor::EnsureReadyAsync().get();

    if (loadResult.Status() != AIFeatureReadyResultState::Success)
    {
        throw winrt::hresult_error(loadResult.ExtendedError());
    }
}

ImageObjectExtractor imageObjectExtractor = ImageObjectExtractor::CreateWithSoftwareBitmapAsync(softwareBitmap).get();

ImageObjectExtractorHint hint(
    {},
    {
        Windows::Graphics::PointInt32{306, 212},        
        Windows::Graphics::PointInt32{216, 336}
    },
    {}
);

Windows::Graphics::Imaging::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}
    }, 
    {},
    {}
);

Siehe auch