Partager via


Extracteur d’objets image

Vous pouvez utiliser l’extracteur d’objets image pour identifier des objets spécifiques dans une image. Le modèle prend une image et un objet « indice » et renvoie un masque de l'objet identifié.

Pour plus d’informations sur l’API, consultez la référence d’API pour les fonctionnalités d’imagerie IA.

Pour plus de détails sur la modération du contenu, voir Sécurité du contenu avec les API d’IA générative.

Important

Conditions requises pour le manifeste de package : pour utiliser les API d’imagerie Windows AI, votre application doit être empaquetée en tant que package MSIX avec la systemAIModels fonctionnalité déclarée dans votre Package.appxmanifest. En outre, vérifiez que l’attribut de MaxVersionTested votre manifeste est défini sur une version récente de Windows (par exemple, 10.0.26226.0 ou ultérieure) pour prendre correctement en charge les fonctionnalités d’IA Windows. L’utilisation de valeurs antérieures peut entraîner des erreurs « Non déclarées par application » lors du chargement du modèle.

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

Fourniture d’indicateurs

Vous pouvez fournir des conseils via n’importe quelle combinaison des éléments suivants :

  • Des coordonnées de points qui font partie de ce que vous voulez identifier.
  • Des coordonnées de points qui ne font pas partie de ce que vous voulez identifier.
  • Un rectangle de coordonnées qui entoure ce que vous voulez identifier.

Plus vous fournissez d’indices, plus le modèle sera précis. Suivez ces consignes d'indications pour minimiser les résultats inexacts ou les erreurs.

  • Évitez d’utiliser plusieurs rectangles dans un même indice, au risque que le masque créé ne perde en précision.
  • Évitez d’utiliser uniquement des points d'exclusion, sans aucun point d'inclusion ni rectangle.
  • Le nombre maximum de coordonnées prises en charge est de 32, à raison de 1 coordonnée pour un point et 2 pour un rectangle. Au-delà, un message d'erreur apparaît.

Le masque retourné est au format grisscale-8 avec les pixels du masque pour l’objet identifié ayant une valeur de 255 (toutes les autres ayant la valeur 0).

Exemple d’extracteur d’objet image

Les exemples suivants montrent comment identifier un objet dans une image. Les exemples supposent que vous disposez déjà d’un objet bitmap logiciel (softwareBitmap) pour l’entrée.

  1. Vérifiez que le modèle Extracteur d’objet image est disponible en appelant la méthode GetReadyState et en attendant que la méthode EnsureReadyAsync retourne correctement.

  2. Une fois le modèle Extracteur d’objet Image disponible, créez un objet ImageObjectExtractor pour le référencer.

  3. Passez l’image à CreateWithSoftwareBitmapAsync.

  4. Créez un objet ImageObjectExtractorHint . D’autres façons de créer un objet hint avec différentes entrées sont illustrées ultérieurement.

  5. Envoyez l’indicateur au modèle à l’aide de la méthode GetSoftwareBitmapObjectMask , qui retourne le résultat final.

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

Spécifiez des indices, sous forme de points inclus et de points exclus

Cet extrait de code montre comment utiliser des points inclus et exclus en tant qu’indicateurs.

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

Spécifiez des indices sous forme de rectangle

Cet extrait de code montre comment utiliser un rectangle (RectInt32 est X, Y, Width, Height) comme indicateur.

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

Voir aussi