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
- Egy Copilot+ PC a Qualcomm, az Intel vagy az AMD kínálatából.
- Az AMD-alapú Copilot+ számítógépek jelenleg nem támogatják a kép szuperfelbontást.
- Az Arm64EC (Emulation Compatible) jelenleg nem támogatott.
- Windows 11 Insider Preview Build 26120.3073 -at (fejlesztői és bétacsatornák) vagy újabb verziót kell telepíteni az eszközre.
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.
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 aImageScaler.MakeAvailableAsync
metódus sikeresen visszatérjen.Amint a Képszuperfelbontási modell elérhetővé válik, hozzon létre egy
ImageScaler
objektumot, hogy hivatkozhasson rá.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 SoftwareBitmap
ImageBuffer
.
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 aImageDescriptionGenerator.MakeAvailableAsync
metódus sikeresen visszatérjen.Amint a Képszuperfelbontási modell elérhetővé válik, hozzon létre egy
ImageDescriptionGenerator
objektumot, hogy hivatkozhasson rá.(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.Kérje le a kép leírását (
LanguageModelResponse.Response
) aImageDescriptionGenerator.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 aContentFilterOptions
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.
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 aMakeAvailableAsync
metódus sikeres visszatérésére várva.Ha a képszegmentálási modell elérhetővé válik, hozzon létre egy
ImageObjectExtractor
objektumot, amely hivatkozni szeretne rá.Adja át a képet
ImageObjectExtractor.CreateWithSoftwareBitmapAsync
.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.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.