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).
- 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.
- Jakmile je model pro super rozlišení obrázku k dispozici, vytvoříme objekt, který na něj odkazuje.
- 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
).
- 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.
- Jakmile je model segmentace obrázků k dispozici, vytvoříme objekt, který na něj bude odkazovat.
- 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).
- 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).
- 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}
},
{},
{}
);