Sdílet prostřednictvím


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

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.

  1. 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í metody ImageScaler.MakeAvailableAsync.

  2. Jakmile je model super rozlišení obrazu k dispozici, vytvořte objekt ImageScaler pro jeho odkazování.

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

  1. 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í metody ImageDescriptionGenerator.MakeAvailableAsync.

  2. Jakmile je model super rozlišení obrazu k dispozici, vytvořte objekt ImageDescriptionGenerator pro jeho odkazování.

  3. (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.

  4. Získejte popis obrázku (LanguageModelResponse.Response) zavoláním metody ImageDescriptionGenerator.DescribeAsync s původním obrázkem, výčtem pro preferovaný typ popisu (volitelné) a objekt ContentFilterOptions (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).

  1. Ujistěte se, že je model segmentace obrázků dostupný volá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řte objekt ImageObjectExtractor, který na něj odkazuje.

  3. Předejte obrázek ImageObjectExtractor.CreateWithSoftwareBitmapAsync.

  4. Vytvořte objekt ImageObjectExtractorHint. Další způsoby vytvoření objektu nápovědy s různými vstupy jsou demonstrována později.

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