Sdílet prostřednictvím


Začněte s AI Imaging ve Windows App SDK

Důležitý

Tato funkce ještě není k dispozici. Očekává se, že bude dodáno v nadcházejícím experimentálním vydání kanálu sady Windows App SDK.

Sada Windows App SDK experimentální kanál zahrnuje rozhraní API a funkce v počátečních fázích vývoje. Všechna rozhraní API v experimentálním kanálu podléhají rozsáhlým revizem a zásadním změnám a je možné je kdykoli odebrat z následujících verzí. Nejsou podporovány pro použití v produkčních prostředích a aplikace, které používají experimentální funkce, nelze publikovat do Microsoft Storu.

Funkce pro vytváření obrázků budou podporovány Windows App SDK prostřednictvím sady rozhraní API využívajících umělou inteligenci (AI), která můžou škálovat i zostřit obrázky (rozlišení obrázku) a také identifikovat objekty v rámci obrázku (segmentace obrázků).

Podrobnosti o rozhraní API najdete v tématu reference API pro obrazové funkce založené na umělé inteligenci v sadě Windows App SDK.

Spropitné

Poskytněte zpětnou vazbu k těmto rozhraním API a jejich funkcím vytvořením nového problému v úložišti GitHub sady Windows App SDK. (Nezapomeňte do názvu zahrnout Imaging!)

Požadavky

  • Počítače CoPilot+

    Poznámka

    Počítače CoPilot+ založené na AMD nepodporují Super Resolution pro zpracování obrazu.

Co lze dělat se sadou Windows App SDK a super rozlišením obrazu?

Pomocí nových funkcí AI Image Super Resolution v sadě Windows App SDK můžete obrázky zostřit a současně je škálovat.

Poznámka

Škálování se limtuje na maximální faktor 8x (vyšší faktory škálování můžou zavádět artefakty a ohrozit přesnost obrázků). Pokud je konečná šířka nebo výška větší než osmkrát jejich původní hodnoty, vyvolá se výjimka.

Zvýšení ostrosti obrázku

Tento příklad ukazuje, jak změnit měřítko (targetWidth, targetHeight) existujícího softwarového rastrového obrázku (softwareBitmap) a zlepšit jeho ostrost (pokud chcete zlepšit ostrost bez škálování obrázku, zadejte původní šířku a výšku obrázku).

  1. Nejprve zajistíme dostupnost modelu super rozlišení obrázku voláním metody IsAvailable a čekáním na úspěšné vrácení metody MakeAvailableAsync.
  2. Jakmile je model pro super rozlišení obrázku k dispozici, vytvoříme objekt, který na něj odkazuje.
  3. Finální obrázek pak získáme odesláním původního obrázku a cílové šířky a výšky konečného obrázku do modelu pomocí metody 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); 

Co mohu dělat se sadou Windows App SDK a segmentací obrazů?

Segmentace obrázků se dá použít k identifikaci konkrétních objektů na obrázku. Model zpracuje jak obrázek, tak i objekt "nápovědy" a vrátí masku identifikovaného objektu.

Nápovědy lze poskytnout libovolnou kombinací následujících:

  • Souřadnice bodů, které patří k tomu, co identifikujete.
  • Souřadnice bodů, které nepatří do toho, co identifikujete.
  • Souřadnicový obdélník, který zahrnuje to, co identifikujete.

Čím více tipů zadáte, tím přesnější může být model. Pokud se ale chcete vyhnout nepřesným výsledkům nebo chybám, postupujte podle těchto pokynů.

  • Vyhněte se použití více obdélníků v nápovědě, protože mohou vytvořit nepřesnou masku.
  • Vyhněte se použití vyloučení bodů výhradně bez zahrnutí bodů nebo obdélníku.
  • Nezadávejte více než podporované maximum 32 souřadnic (1 pro bod, 2 pro obdélník), protože to vrátí chybu.

Vrácená maska je ve formátu osmi bitových odstínů šedi. Pixely identifikovaného objektu v masce jsou 255 (zbytek je 0 bez pixelů, které neobsahují žádné hodnoty mezi).

Identifikace objektu v rámci obrázku

Následující příklady ukazují různé způsoby, jak identifikovat objekt v rámci obrázku. Předpokládáme, že pro vstup již máte softwarový rastrový objekt (softwareBitmap).

  1. Nejprve zajistíme, že model segmentace obrázků je k dispozici zavoláním metody IsAvailable a čekáním na úspěšné vrácení metody MakeAvailableAsync.
  2. Jakmile je model segmentace obrázků k dispozici, vytvoříme objekt, který na něj bude odkazovat.
  3. Dále vytvoříme třídu ImageObjectExtractor předáním obrázku do ImageObjectExtractor.CreateWithImageBufferAsync (nebo CreateWithSoftwareBitmapAsync v závislosti na typu obrázku).
  4. Pak vytvoříme Objekt ImageObjectExtractorHint (ukážeme další způsoby, jak vytvořit objekt nápovědy s různými vstupy dále v tomto tématu).
  5. Nakonec odešleme nápovědu k modelu pomocí GetSoftwareBitmapObjectMask metoda, která vrátí konečný výsledek.
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);

Určete nápovědy se zahrnutými a vyloučenými body

V tomto fragmentu kódu si ukážeme, jak jako nápovědu použít zahrnuté i vyloučené body.

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

Zadejte nápovědy obdélníkem

V tomto fragmentu kódu předvedeme, jak jako nápovědu použít obdélník (RectInt32 je X, Y, Width, Height).

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

Další zdroje informací