Partager via


Prise en main de l’imagerie IA dans le Kit de développement logiciel (SDK) d’application Windows

Conseil

Fournissez des commentaires sur ces API et leurs fonctionnalités en créant un nouveau problème dans le dépôt GitHub du SDK d’application Windows. (Assurez-vous d’inclure l’imagerie dans le titre !)

Les fonctionnalités d’imagerie seront prises en charge par le SDK d’application Windows par le biais d’un ensemble d’API d’intelligence artificielle (IA) qui peuvent mettre à l’échelle et aiguiser des images (Résolution super d’image) et identifier des objets au sein d’une image (segmentation d’image).

Pour plus d’informations sur l’API, consultez la référence d’API pour les fonctionnalités d’imagerie basées sur l’IA dans le Kit de développement logiciel (SDK) d’application Windows.

Important

Cette fonctionnalité n’est pas encore disponible. Il devrait être fourni dans une prochaine version de canal expérimental du Kit de développement logiciel (SDK) d’application Windows.

Le canal expérimental du SDK d’application Windows comprend des API et des fonctionnalités qui en sont aux premières phases de développement. Toutes les API du canal expérimental font l’objet de révisions approfondies et de changements cassants et peuvent être supprimées des versions ultérieures à tout moment. Elles ne sont pas prises en charge dans les environnements de production et les applications qui utilisent des fonctionnalités expérimentales ne peuvent pas être publiées dans Microsoft Store.

Prérequis

  • PC CoPilot+.

    Remarque

    Les PC CoPilot+ basés sur AMD ne prennent pas en charge la super résolution d’images.

Que puis-je faire avec le Kit de développement logiciel (SDK) d’application Windows et la super résolution d’images ?

Utilisez les nouvelles fonctionnalités IA Image Super Resolution dans le Kit de développement logiciel (SDK) d’application Windows pour affiner les images et les affiner lors de leur mise à l’échelle.

Remarque

La mise à l’échelle est limitée à un facteur maximal de 8x (des facteurs d’échelle plus élevés peuvent introduire des artefacts et compromettre la précision de l’image). Si la largeur ou la hauteur finale est supérieure à 8x leurs valeurs d’origine, une exception est levée.

Augmenter la netteté d’une image

Cet exemple montre comment modifier l’échelle (targetWidth, targetHeight) d’une image bitmap logicielle existante (softwareBitmap) et améliorer sa netteté (si vous souhaitez améliorer la netteté sans mettre à l’échelle l’image, spécifiez la largeur et la hauteur de l’image d’origine).

  1. Tout d’abord, nous nous assurons que le modèle Image Super Resolution est disponible en appelant la méthode IsAvailable et en attendant que la méthode MakeAvailableAsync retourne correctement.
  2. Une fois le modèle De super résolution d’images disponible, nous créons un objet pour le référencer.
  3. Nous obtenons ensuite l’image finale en envoyant l’image d’origine et la largeur et la hauteur ciblées de l’image finale au modèle à l’aide de la méthode ScaleSoftwareBitmap.
using Microsft.Windows.Imaging;
using Windows.Graphics.Imaging;

if (!ImageScaler.IsAvailable())
{
    var result = ImageScaler.MakeAvailableAsync();
    if (result.Status != PackageDeploymentStatus.CompletedSuccess)
    {
        throw result.ExtendedError;
    }
}

var imageScaler = await ImageScaler.CreateAsync();
var finalImage = imageScaler.ScaleSoftwareBitmap(softwareBitmap, targetWidth, targetHeight);
#include "winrt/Microsoft.Graphics.Imaging.h" 
#include "winrt/Windows.Graphics.Imaging.h" 
using namespace winrt::Windows::Graphics::Imaging; 
using namespace winrt::Microsoft::Graphics::Imaging; 

if (!ImageScaler::IsAvailable()) 
{ 
    auto result = ImageScaler::MakeAvailableAsync(); 
    if (result.Status() != AsyncStatus::Completed) 
    { 
        throw result.ErrorCode(); 
    } 
}

ImageScaler imageScaler = ImageScaler::CreateAsync().get(); 
ImageBuffer buffer = imageScaler.ScaleSoftwareBitmap(softwareBitmap, targetWidth, targetHeight); 

Que puis-je faire avec le Kit de développement logiciel (SDK) d’application Windows et la segmentation d’images ?

La segmentation d’image peut être utilisée pour identifier des objets spécifiques dans une image. Le modèle prend à la fois une image et un objet « hints » et retourne un masque de l’objet identifié.

Les indicateurs peuvent être fournis via n’importe quelle combinaison des éléments suivants :

  • Coordonnées pour les points qui appartiennent à ce que vous identifiez.
  • Coordonnées pour les points qui n’appartiennent pas à ce que vous identifiez.
  • Rectangle de coordonnées qui entoure ce que vous identifiez.

Plus vous fournissez d’indicateurs, plus le modèle peut être précis. Toutefois, suivez ces instructions pour éviter des résultats ou des erreurs incorrects.

  • Évitez d’utiliser plusieurs rectangles dans un indicateur, car ils peuvent produire un masque incorrect.
  • Évitez d’utiliser des points d’exclusion exclusivement sans inclure de points ou de rectangle.
  • Ne spécifiez pas plus que le maximum pris en charge de 32 coordonnées (1 pour un point, 2 pour un rectangle), car cela renvoie une erreur.

Le masque retourné est au format grisscale-8. Les pixels de l’objet identifié dans le masque sont 255 (le reste est 0 sans pixels contenant des valeurs entre).

Identifier un objet dans une image

Les exemples suivants montrent les différentes façons d’identifier un objet dans une image. Nous partons du principe que vous disposez déjà d’un objet bitmap logiciel (softwareBitmap) pour l’entrée.

  1. Tout d’abord, nous nous assurons que le modèle de segmentation d’image est disponible en appelant la méthode IsAvailable et en attendant que la méthode MakeAvailableAsync retourne correctement.
  2. Une fois le modèle de segmentation d’image disponible, nous créons un objet pour le référencer.
  3. Ensuite, nous créons une classe ImageObjectExtractor en transmettant l’image à ImageObjectExtractor.CreateWithImageBufferAsync (ou CreateWithSoftwareBitmapAsync en fonction de votre type d’image).
  4. Ensuite, nous allons créer un objet ImageObjectExtractorHint (nous montrons d’autres façons de créer un objet d’indicateur avec différentes entrées plus loin dans cette rubrique).
  5. Enfin, nous envoyons l’indicateur au modèle à l’aide de la méthode GetSoftwareBitmapObjectMask, qui retourne le résultat final.
using Microsft.Windows.Imaging;
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(
    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" 
using namespace winrt::Windows::Graphics::Imaging; 
using namespace winrt::Microsoft::Graphics::Imaging; 

if (!ImageObjectExtractor::IsAvailable()) 
{ 
    auto result = ImageObjectExtractor::MakeAvailableAsync(); 
    if (result.Status() != AsyncStatus::Completed) 
    { 
        throw result.ErrorCode(); 
    } 
}

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

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

SoftwareBitmap finalImage = imageObjectExtractor.GetSoftwareBitmapObjectMask(hint);

Spécifier des indicateurs avec des points inclus et exclus

Dans cet extrait de code, nous montrons comment utiliser des points inclus et exclus comme 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écifier des indicateurs avec rectangle

Dans cet extrait de code, nous montrons 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}
    }, 
    {},
    {}
);

Ressources supplémentaires