Megosztás a következőn keresztül:


Az AI-képalkotás első lépései a Windows App SDK-ban

Fontos

Elérhető a Windows App SDK legújabb kísérleti csatornáján kiadásában.

A Windows App SDK kísérleti csatornája api-kat és funkciókat tartalmaz a fejlesztés korai szakaszában. A kísérleti csatornán található összes API-ra kiterjedt változatok és kompatibilitástörő változások vonatkoznak, és bármikor eltávolíthatók a későbbi kiadásokból. A kísérleti funkciók nem használhatók éles környezetben, és az őket használó alkalmazások nem tehetők közzé a Microsoft Store-ban.

  • A képleírási funkciók nem érhetők el a szárazföldi Kínában.
  • Az önálló alkalmazások nem támogatottak.

A képalkotó funkciókat a Windows App SDK biztosítják mesterséges intelligencia (AI) által támogatott API-k segítségével, amelyek a következő képességeket támogatják:

  • Képszuper-felbontás: képek skálázása és élesítése
  • kép leírása: a képet leíró szöveg létrehozása
  • képszegmentálási: a képen belüli objektumok azonosítása

A API részleteit lásd a Windows App SDK AI képalkotó funkcióinakAPI referenciadokumentációjában.

A tartalommoderálási részletekérdekében lásd: Tartalombiztonság generatív AI API-kkal.

Borravaló

Küldjön visszajelzést ezekről az API-król és funkcióikról egy új probléma létrehozásával a Windows App SDK GitHub-adattárban (a címben szerepeljen Képalkotó), vagy válaszoljon egy meglévő problémára.

Előfeltételek

Mit tehetek a kép szuperfelbontásával?

A Windows App SDK képfelbontási API-i lehetővé teszik a képélesítést és a skálázást.

A skálázás legfeljebb 8-szoros lehet. A nagyobb skálázási tényezők hibákat okozhatnak, és ronthatják a kép minőségét. Ha a végső szélesség vagy magasság nagyobb, mint 8x az eredeti értékük, a rendszer kivételt fog kivenni.

Az alábbi példa bemutatja, hogyan módosíthatja egy meglévő szoftveres bitkép (targetWidth) méretezését (targetHeight, softwareBitmap) és hogyan javíthatja a kép élességét (a kép skálázása nélkül, egyszerűen megadhatja a meglévő képszélességet és magasságot) egy ImageScaler objektum használatával.

  1. Győződjön meg arról, hogy a képfelbontási modell elérhető a ImageScaler.IsAvailable metódus meghívásával, majd várja meg, hogy a ImageScaler.MakeAvailableAsync metódus sikeresen visszatérjen.

  2. Amint a Képszuperfelbontási modell elérhetővé válik, hozzon létre egy ImageScaler objektumot, hogy hivatkozhasson rá.

  3. A meglévő kép élezett és skálázott verzióját úgy szerezheti meg, hogy a meglévő képet és a kívánt szélességet és magasságot a ScaleSoftwareBitmap metódussal a modellhez adja át.

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

Mit lehet tenni a képleírással?

Fontos

A kép leírása jelenleg nem érhető el a szárazföldi Kínában.

A Windows App SDK Rendszerkép-leírás API-jai különböző típusú szöveges leírásokat hozhatnak létre a képekhez.

A következő típusú szöveges leírások támogatottak:

  • Kisegítő lehetőségek – Hosszú leírást nyújt az akadálymentességi igényekkel rendelkező felhasználók számára.
  • Felirat – Képaláíráshoz alkalmas rövid leírást tartalmaz. Az alapértelmezett érték, ha nincs megadva érték.
  • DetailedNarration – Hosszú leírást tartalmaz.
  • OfficeCharts – Diagramokhoz és ábrákhoz alkalmas leírást nyújt.

Mivel ezek az API-k Machine Learning-modelleket használnak, időnként hibák léphetnek fel, ha a szöveg nem írja le helyesen a képet. Ezért nem javasoljuk, hogy ezeket az API-kat képekhez használja a következő forgatókönyvekben:

  • Ha a képek potenciálisan bizalmas tartalmat tartalmaznak, és a pontatlan leírások ellentmondásosak lehetnek, például zászlók, térképek, földgömbök, kulturális szimbólumok vagy vallási szimbólumok.
  • Ha a pontos leírások kritikusak, például orvosi tanácsadáshoz vagy diagnózishoz, jogi tartalomhoz vagy pénzügyi dokumentumokhoz.

Szövegleírás lekérése képről

A Kép leírása API egy képet, a kívánt szövegleírás-típust (nem kötelező) és a tartalommoderálás szintjét veszi igénybe (nem kötelező) a káros használat elleni védelem érdekében.

Az alábbi példa bemutatja, hogyan kérhet le szöveges leírást egy képhez.

Jegyzet

A képnek ImageBuffer objektumnak kell lennie, mivel SoftwareBitmap jelenleg nem támogatott. Ez a példa bemutatja, hogyan konvertálhat SoftwareBitmapImageBuffer.

  1. Győződjön meg arról, hogy a képfelbontási modell elérhető a ImageDescriptionGenerator.IsAvailable metódus meghívásával, majd várja meg, hogy a ImageDescriptionGenerator.MakeAvailableAsync metódus sikeresen visszatérjen.

  2. Amint a Képszuperfelbontási modell elérhetővé válik, hozzon létre egy ImageDescriptionGenerator objektumot, hogy hivatkozhasson rá.

  3. (Nem kötelező) Hozzon létre egy ContentFilterOptions objektumot, és adja meg az előnyben részesített értékeket. Ha az alapértelmezett értékeket választja, null értékű objektumot adhat át.

  4. Kérje le a kép leírását (LanguageModelResponse.Response) a ImageDescriptionGenerator.DescribeAsync metódus meghívásával az eredeti képpel, egy számmal az előnyben részesített leírási típushoz (nem kötelező) és a ContentFilterOptions objektumhoz (nem kötelező).

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

Mit tehetek a képszegmentálással?

A képszegmentálás a képek adott objektumainak azonosítására használható. A modell egy képet és egy "tippeket" tartalmazó objektumot is használ, és visszaadja az azonosított objektum maszkját.

A tippek az alábbiak bármelyikével megadhatóak:

  • Azoknak a pontoknak a koordinátái, amelyeket azonosítani próbál.
  • Olyan pontok koordinátái, amelyek nem tartoznak az ön által azonosított pontokhoz.
  • Egy koordináta téglalap, amely magában foglalja az ön által azonosított elemet.

Minél több tippet ad meg, annál pontosabb lehet a modell. A pontatlan eredmények és hibák minimalizálása érdekében kövesse ezeket a tippeket.

  • Ne használjon több téglalapot egy tippben, mert pontatlan maszkot hozhat létre.
  • Ne használjon kizáró pontokat kizárólag pontok vagy téglalapok nélkül.
  • Ne adjon meg többet, mint a támogatott legfeljebb 32 koordinátát (1 pont, téglalap esetén 2), mert ez hibát ad vissza.

A visszaadott maszk szürkeárnyalatos-8 formátumú, és az azonosított objektum maszkjának képpontjai 255-ös értékkel rendelkeznek (minden másnak 0 az értéke).

Objektum azonosítása egy képen belül

Az alábbi példák egy objektum képen belüli azonosításának módjait mutatják be. A példák feltételezik, hogy már rendelkezik szoftveres bitképobjektummal (softwareBitmap) a bemenethez.

  1. Győződjön meg arról, hogy a képszegmentálási modell elérhető a IsAvailable metódus meghívásával és a MakeAvailableAsync metódus sikeres visszatérésére várva.

  2. Ha a képszegmentálási modell elérhetővé válik, hozzon létre egy ImageObjectExtractor objektumot, amely hivatkozni szeretne rá.

  3. Adja át a képet ImageObjectExtractor.CreateWithSoftwareBitmapAsync.

  4. Hozzon létre egy ImageObjectExtractorHint objektumot. A különböző bemenetekkel rendelkező tippobjektumok létrehozásának egyéb módjait később bemutatjuk.

  5. Küldje el a tippet a modellnek a GetSoftwareBitmapObjectMask metódussal, amely a végeredményt adja vissza.

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

Tippek megadása belefoglalt és kizárt szempontokkal

Ez a kódrészlet bemutatja, hogyan használható mind a belefoglalt, mind a kizárt pontok tippként.

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

Tippek megadása téglalappal

Ez a kódrészlet bemutatja, hogyan használható egy téglalap (a RectInt32 X, Y, Width, Height) tippként.

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

Felelős MI

Ezek a képalkotó API-k hatékony, megbízható modelleket biztosítanak a fejlesztőknek az alkalmazások biztonságos, biztonságos AI-élményben való létrehozásához. Az alábbi lépések kombinációjával biztosítjuk, hogy ezek a képalkotó API-k megbízhatóak, biztonságosak és felelősségteljesen legyenek felépítve. Javasoljuk, hogy a mesterséges intelligencia funkcióinak alkalmazása során tekintse át a Windows rendszerhez kapcsolódó, a Felelős Generatív AI-fejlesztés című dokumentumban leírt ajánlott eljárásokat.

  • A modell minőségének alapos tesztelése és kiértékelése a lehetséges kockázatok azonosítása és csökkentése érdekében.
  • Fokozatos bevezetés a képalkotó API kísérleti verzióiból. A végleges kísérleti kiadást követően a bevezetés az aláírt alkalmazásokra bővül, így biztosítva, hogy a kártevővizsgálatok a helyi modell képességeivel rendelkező alkalmazásokra legyenek alkalmazva.
  • Adjon meg egy helyi AI-modellt a tartalommoderáláshoz, amely azonosítja és szűri a káros tartalmakat a generatív AI-modelleket használó API-k bemenetében és AI által generált kimenetében is. Ez a helyi tartalommoderálási modell a szövegmoderálás Azure AI Content Safety modellen alapul, és hasonló teljesítményt nyújt.

Fontos

A tartalombiztonsági rendszer nem tévedhetetlen, és esetenként előfordulhatnak hibák, ezért javasoljuk, hogy integrálja a kiegészítő Felelős MI (RAI) eszközöket és gyakorlatokat. További részletekért lásd: Felelős Generatív AI-fejlesztés Windowsrendszeren.