Začněte s AI Imaging ve Windows App SDK
Důležitý
K dispozici v nejnovějším vydání experimentálního kanálového systému Windows App SDK.
Experimentální kanál sady Windows App SDK 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í. Experimentální funkce nejsou podporovány pro použití v produkčních prostředích a aplikacích, které je používají, nelze publikovat do Microsoft Storu.
- Funkce Popis obrázku nejsou k dispozici v pevninské Číně.
- Samostatné aplikace se nepodporují.
Funkce pro zpracování obrazu poskytuje sada Windows App SDK pomocí rozhraní API podporovaných umělou inteligencí (AI), která zajišťují následující schopnosti:
- Zvýšení rozlišení obrázku: škálování a zvýraznění obrázků
- popis obrázku: vytváření textu, který popisuje obrázek
- Segmentace obrazu: identifikace objektů v obraze
Podrobnosti rozhraní APInajdete v tématu referenční informace k rozhraní API pro funkce vytváření obrázků AI vsady Windows App SDK.
Podrobnosti o moderování obsahu najdete v tématu Bezpečnost obsahu pomocí rozhraní API pro generování umělé inteligence.
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 (včetně image v názvu) nebo reagováním na existující problém.
Požadavky
- Počítač Copilot+ od Qualcommu, Intelu nebo AMD.
- Počítače Copilot+ založené na technologii AMD v současné době nepodporují super rozlišení obrázku.
- Arm64EC (Emulation Compatible) se v současné době nepodporuje.
- Windows 11 Insider Preview Build 26120.3073 (vývojové a beta kanály) nebo novější musí být na vašem zařízení nainstalován.
Co můžu dělat s obrázkem ve vysokém rozlišení?
Rozhraní API pro superrozlišení obrázků v sadě Windows App SDK umožňují ostření a škálování obrázků.
Škálování je omezené 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.
Následující příklad ukazuje, jak změnit měřítko (targetWidth
, targetHeight
) existujícího softwarového rastrového obrázku (softwareBitmap
) a zlepšit ostrost obrázku (zlepšit ostrost bez škálování obrázku, jednoduše zadat existující šířku a výšku obrázku) pomocí objektu ImageScaler
.
Ujistěte se, že je model rozlišení obrázku dostupný voláním metody
ImageScaler.IsAvailable
a následným čekáním na úspěšné vrácení metodyImageScaler.MakeAvailableAsync
.Jakmile je model super rozlišení obrazu k dispozici, vytvořte objekt
ImageScaler
pro jeho odkazování.Získejte zaostřenou a škálovanou verzi existujícího obrázku předáním existujícího obrázku a požadované šířky a výšky modelu pomocí metody
ScaleSoftwareBitmap
.
using Microsoft.Graphics.Imaging;
using Microsoft.Windows.Management.Deployment;
using Windows.Graphics.Imaging;
if (!ImageScaler.IsAvailable())
{
var result = await ImageScaler.MakeAvailableAsync();
if (result.Status != PackageDeploymentStatus.CompletedSuccess)
{
throw result.ExtendedError;
}
}
ImageScaler imageScaler = await ImageScaler.CreateAsync();
SoftwareBitmap finalImage = imageScaler.ScaleSoftwareBitmap(softwareBitmap, targetWidth, targetHeight);
#include <winrt/Microsoft.Graphics.Imaging.h>
#include <winrt/Windows.Foundation.h>
#include <winrt/Windows.Graphics.Imaging.h>
using namespace winrt::Microsoft::Graphics::Imaging;
using namespace winrt::Windows::Foundation;
using namespace winrt::Windows::Graphics::Imaging;
if (!ImageScaler::IsAvailable())
{
winrt::PackageDeploymentResult result = ImageScaler::MakeAvailableAsync().get();
if (result.Status() != PackageDeploymentStatus::CompletedSuccess)
{
throw result.ExtendedError();
}
}
ImageScaler imageScaler = ImageScaler::CreateAsync().get();
SoftwareBitmap finalImage = imageScaler.ScaleSoftwareBitmap(softwareBitmap, targetWidth, targetHeight);
Co můžu dělat s popisem obrázku?
Důležitý
Popis obrázku je momentálně nedostupný v pevninské Číně.
Rozhraní API popisu obrázku v sadě Windows App SDK poskytují možnost generovat různé typy textových popisů obrázku.
Podporují se následující typy textových popisů:
- Přístupnost – poskytuje dlouhý popis s podrobnostmi určenými pro uživatele s potřebami v oblasti přístupnosti.
- titulek – poskytuje krátký popis vhodný pro titulek obrázku. Výchozí hodnota, pokud není zadána žádná hodnota.
- PodrobnéVyprávění – poskytuje dlouhý popis.
- OfficeCharts – poskytuje popis vhodný pro grafy a diagramy.
Vzhledem k tomu, že tato rozhraní API používají modely strojového učení (ML), mohou občas dojít k chybám, kdy text nepopisuje obrázek správně. Proto nedoporučujeme používat tato rozhraní API pro obrázky v následujících scénářích:
- Pokud obrázky obsahují potenciálně citlivý obsah a nepřesné popisy, mohou být problematické, jako jsou vlajky, mapy, glóbusy, kulturní symboly nebo náboženské symboly.
- Pokud jsou přesné popisy kritické, například pro lékařské poradenství nebo diagnostiku, právní obsah nebo finanční dokumenty.
Získání textového popisu z obrázku
Rozhraní API pro popis obrázku přebírá obrázek, požadovaný typ popisu textu (volitelné) a úroveň moderování obsahu, kterou chcete použít (volitelné) k ochraně před škodlivým použitím.
Následující příklad ukazuje, jak získat textový popis obrázku.
Poznámka
Obrázek musí být objekt ImageBuffer
, protože SoftwareBitmap
se v současné době nepodporuje. Tento příklad ukazuje, jak převést SoftwareBitmap
na ImageBuffer
.
Ujistěte se, že je model rozlišení obrázku dostupný voláním metody
ImageDescriptionGenerator.IsAvailable
a následným čekáním na úspěšné vrácení metodyImageDescriptionGenerator.MakeAvailableAsync
.Jakmile je model super rozlišení obrazu k dispozici, vytvořte objekt
ImageDescriptionGenerator
pro jeho odkazování.(Volitelné) Vytvořte objekt
ContentFilterOptions
a zadejte upřednostňované hodnoty. Pokud se rozhodnete použít výchozí hodnoty, můžete předat objekt null.Získejte popis obrázku (
LanguageModelResponse.Response
) zavoláním metodyImageDescriptionGenerator.DescribeAsync
s původním obrázkem, výčtem pro preferovaný typ popisu (volitelné) a objektContentFilterOptions
(volitelné).
using Microsoft.Graphics.Imaging;
using Microsoft.Windows.Management.Deployment;
using Microsoft.Windows.AI.Generative;
using Microsoft.Windows.AI.ContentModeration;
using Windows.Storage.StorageFile;
using Windows.Storage.Streams;
using Windows.Graphics.Imaging;
if (!ImageDescriptionGenerator.IsAvailable())
{
var result = await ImageDescriptionGenerator.MakeAvailableAsync();
if (result.Status != PackageDeploymentStatus.CompletedSuccess)
{
throw result.ExtendedError;
}
}
ImageDescriptionGenerator imageDescriptionGenerator = await ImageDescriptionGenerator.CreateAsync();
// Convert already available softwareBitmap to ImageBuffer.
ImageBuffer inputImage = ImageBuffer.CreateCopyFromBitmap(softwareBitmap);
// Create content moderation thresholds object.
ContentFilterOptions filterOptions = new ContentFilterOptions();
filterOptions.PromptMinSeverityLevelToBlock.ViolentContentSeverity = SeverityLevel.Medium;
filterOptions.ResponseMinSeverityLevelToBlock.ViolentContentSeverity = SeverityLevel.Medium;
// Get text description.
LanguageModelResponse languageModelResponse = await imageDescriptionGenerator.DescribeAsync(inputImage, ImageDescriptionScenario.Caption, filterOptions);
string response = languageModelResponse.Response;
#include <winrt/Microsoft.Graphics.Imaging.h>
#include <winrt/Microsoft.Windows.AI.ContentModeration.h>
#include <winrt/Microsoft.Windows.AI.Generative.h>
#include <winrt/Windows.Foundation.h>
#include <winrt/Windows.Graphics.Imaging.h>
#include <winrt/Windows.Storage.Streams.h>
#include <winrt/Windows.Storage.StorageFile.h>
using namespace winrt::Microsoft::Graphics::Imaging;
using namespace winrt::Microsoft::Windows::AI::ContentModeration;
using namespace winrt::Microsoft::Windows::AI::Generative;
using namespace winrt::Windows::Foundation;
using namespace winrt::Windows::Graphics::Imaging;
using namespace winrt::Windows::Storage::Streams;
using namespace winrt::Windows::Storage::StorageFile;
if (!ImageDescriptionGenerator::IsAvailable())
{
winrt::PackageDeploymentResult result = ImageDescriptionGenerator::MakeAvailableAsync().get();
if (result.Status() != PackageDeploymentStatus::CompletedSuccess)
{
throw result.ExtendedError();
}
}
ImageDescriptionGenerator imageDescriptionGenerator = ImageDescriptionGenerator::CreateAsync().get();
// Convert already available softwareBitmap to ImageBuffer.
auto inputBuffer = ImageBuffer::CreateCopyFromBitmap(softwareBitmap);
// Create content moderation thresholds object.
ContentFilterOptions contentFilter{};
contentFilter.PromptMinSeverityLevelToBlock().ViolentContentSeverity(SeverityLevel::Medium);
contentFilter.ResponseMinSeverityLevelToBlock().ViolentContentSeverity(SeverityLevel::Medium);
// Get text description.
LanguageModelResponse languageModelResponse = imageDescriptionGenerator.DescribeAsync(inputImage, ImageDescriptionScenario::Caption, contentFilter).get();
string text = languageModelResponse.Response();
Co můžu dělat se segmentací obrázků?
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 chcete minimalizovat nepřesné výsledky nebo chyby, 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 stupních šedi-8 a pixely identifikovaného objektu mají hodnotu 255 (všechny ostatní mají hodnotu 0).
Identifikace objektu v rámci obrázku
Následující příklady ukazují způsoby identifikace objektu v obrázku. V příkladech se předpokládá, že pro vstup již máte objekt rastrového obrázku softwaru (softwareBitmap
).
Ujistěte se, že je model segmentace obrázků dostupný voláním metody
IsAvailable
a čekáním na úspěšné vrácení metodyMakeAvailableAsync
.Jakmile je model segmentace obrázků k dispozici, vytvořte objekt
ImageObjectExtractor
, který na něj odkazuje.Předejte obrázek
ImageObjectExtractor.CreateWithSoftwareBitmapAsync
.Vytvořte objekt
ImageObjectExtractorHint
. Další způsoby vytvoření objektu nápovědy s různými vstupy jsou demonstrována později.Pomocí metody
GetSoftwareBitmapObjectMask
odešlete nápovědu k modelu, který vrátí konečný výsledek.
using Microsoft.Graphics.Imaging;
using Microsoft.Windows.Management.Deployment;
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 = 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/Windows.Graphics.Imaging.h>
#include <winrt/Windows.Foundation.h>
using namespace winrt::Microsoft::Graphics::Imaging;
using namespace winrt::Windows::Graphics::Imaging;
using namespace winrt::Windows::Foundation;
if (!ImageObjectExtractor::IsAvailable())
{
winrt::PackageDeploymentResult result = ImageObjectExtractor::MakeAvailableAsync().get();
if (result.Status() != PackageDeploymentStatus::CompletedSuccess)
{
throw result.ExtendedError();
}
}
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
Tento fragment kódu ukazuje, 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
Tento fragment kódu ukazuje, 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}
},
{},
{}
);
Zodpovědná AI
Tato rozhraní API pro vytváření obrázků poskytují vývojářům výkonné a důvěryhodné modely pro vytváření aplikací se bezpečnými a zabezpečenými prostředími AI. Pomocí kombinace následujících kroků jsme zajistili, že tato rozhraní API pro vytváření imisí jsou důvěryhodná, zabezpečená a zodpovědně sestavená. Při implementaci funkcí AI ve vaší aplikaci doporučujeme projít si osvědčené postupy popsané v zodpovědném vývoji umělé inteligence ve Windows.
- Důkladné testování a vyhodnocení kvality modelu za účelem identifikace a zmírnění potenciálních rizik.
- Přírůstkové zavedení experimentálních verzí rozhraní API pro zpracování obrazu. Po posledním experimentálním vydání se zavedení rozšíří na podepsané aplikace, aby se zajistilo, že se na aplikace s možnostmi místního modelu použijí kontroly malwaru.
- Poskytněte místní model AI pro moderování obsahu, který identifikuje a filtruje škodlivý obsah ve vstupním i VYgenerovaném výstupu všech rozhraní API, která používají generující modely AI. Tento místní model moderování obsahu je založený na modelu Azure AI Content Safety pro moderování textu a poskytuje podobný výkon.
Důležitý
Žádný systém bezpečnosti obsahu není neomylný a může docházet k občasným chybám, proto doporučujeme integrovat doplňkové nástroje a postupy z oblasti zodpovědné umělé inteligence (RAI). Další podrobnosti najdete v tématu Zodpovědný vývoj generativní umělé inteligence ve Windows.