Udostępnij za pośrednictwem


Wprowadzenie do tworzenia obrazów sztucznej inteligencji w zestawie SDK aplikacji systemu Windows

Ważny

Dostępne w najnowszej wersji eksperymentalnego kanału zestawu SDK aplikacji systemu Windows.

Eksperymentalny kanał zestawu SDK aplikacji systemu Windows obejmuje interfejsy API i funkcje we wczesnych etapach programowania. Wszystkie interfejsy API w kanale eksperymentalnym podlegają rozbudowanym poprawkom i zmianom powodujących niezgodność i mogą zostać usunięte z kolejnych wersji w dowolnym momencie. Funkcje eksperymentalne nie są obsługiwane w środowiskach produkcyjnych i aplikacjach, które ich używają, nie mogą być publikowane w sklepie Microsoft Store.

  • Funkcje opisu obrazu nie są dostępne w Chinach kontynentalnych.
  • Aplikacje samodzielne nie są obsługiwane.

Funkcje tworzenia obrazów są udostępniane przez zestaw SDK aplikacji systemu Windows za pomocą zestawu interfejsów API wspieranych przez sztuczną inteligencję (AI), które obsługują następujące możliwości:

  • Super rozdzielczość obrazu: skalowanie i wyostrzanie obrazów
  • opis obrazu: tworzenie tekstu opisującego obraz
  • Segmentacja obrazów: identyfikowanie obiektów na obrazie

Aby uzyskać szczegółowe informacje o interfejsie API , zobacz dokumentację API dotyczącą funkcji tworzenia obrazów AI w zestawie Windows App SDK.

Aby uzyskać szczegółowe informacje na temat moderowania treści , zobacz Bezpieczeństwo treści z generatywnymi interfejsami API AI.

Napiwek

Prześlij opinię na temat tego interfejsu API i jego funkcji, tworząc nowe zgłoszenie w repozytorium GitHub Windows App SDK (uwzględniając Imaging w tytule) lub odpowiadając na istniejące zgłoszenie.

Warunki wstępne

Co mogę zrobić z super-rozdzielczością obrazu?

API superrozdzielczości obrazów w Windows App SDK umożliwiają wyostrzanie i skalowanie obrazów.

Skalowanie jest ograniczone do maksymalnego współczynnika 8x. Wyższe czynniki skalowania mogą wprowadzać artefakty i naruszyć dokładność obrazu. Jeśli ostateczna szerokość lub wysokość jest większa niż 8x ich oryginalnych wartości, zostanie zgłoszony wyjątek.

W poniższym przykładzie pokazano, jak zmienić skalę (targetWidth, targetHeight) istniejącego obrazu mapy bitowej oprogramowania (softwareBitmap) i poprawić ostrość obrazu (aby poprawić ostrość bez skalowania obrazu, po prostu określić istniejącą szerokość i wysokość obrazu) przy użyciu obiektu ImageScaler.

  1. Upewnij się, że model super rozdzielczości obrazu jest dostępny, wywołując metodę ImageScaler.IsAvailable, a następnie czekając, aż metoda ImageScaler.MakeAvailableAsync zakończy się pomyślnie.

  2. Po udostępnieniu modelu Super resolution obrazu utwórz obiekt ImageScaler, aby się do niego odwoływać.

  3. Pobierz wyostrzoną i skalowaną wersję istniejącego obrazu, przekazując istniejący obraz oraz żądaną szerokość i wysokość do modelu przy użyciu 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 mogę zrobić z opisem obrazu?

Ważny

Opis obrazu jest obecnie niedostępny w Chinach kontynentalnych.

Interfejsy API opisu obrazu w zestawie SDK aplikacji systemu Windows umożliwiają generowanie różnych typów opisów tekstu dla obrazu.

Obsługiwane są następujące typy opisów tekstu:

  • ułatwienia dostępu — zawiera długi opis ze szczegółami przeznaczonymi dla użytkowników wymagających ułatwień dostępu.
  • Caption — zawiera krótki opis odpowiadający podpisowi obrazu. Wartość domyślna, jeśli nie określono żadnej wartości.
  • DetailedNarration — zawiera długi opis.
  • OfficeCharts — zawiera opis odpowiedni dla wykresów i diagramów.

Ponieważ te interfejsy API używają modeli uczenia maszynowego (ML), sporadyczne błędy mogą wystąpić, gdy tekst nie opisuje poprawnie obrazu. W związku z tym nie zalecamy używania tych interfejsów API dla obrazów w następujących scenariuszach:

  • Gdzie obrazy zawierają potencjalnie wrażliwą zawartość i niedokładne opisy mogą być kontrowersyjne, takie jak flagi, mapy, globy, symbole kulturowe lub symbole religijne.
  • Dokładne opisy mają krytyczne znaczenie, na przykład w przypadku porad medycznych lub diagnostyki, treści prawnych lub dokumentów finansowych.

Pobieranie opisu tekstu z obrazu

Interfejs API opisu obrazu przyjmuje obraz, żądany typ opisu tekstu (opcjonalnie) oraz poziom moderowania zawartości, który ma zostać użyty (opcjonalnie), aby chronić się przed szkodliwym użyciem.

W poniższym przykładzie pokazano, jak uzyskać opis tekstu dla obrazu.

Notatka

Obraz musi być obiektem ImageBuffer, ponieważ SoftwareBitmap nie jest obecnie obsługiwany. W tym przykładzie pokazano, jak przekonwertować SoftwareBitmap na ImageBuffer.

  1. Upewnij się, że model super rozdzielczości obrazu jest dostępny, wywołując metodę ImageDescriptionGenerator.IsAvailable, a następnie czekając, aż metoda ImageDescriptionGenerator.MakeAvailableAsync zakończy się pomyślnie.

  2. Po udostępnieniu modelu Super resolution obrazu utwórz obiekt ImageDescriptionGenerator, aby się do niego odwoływać.

  3. (Opcjonalnie) Utwórz obiekt ContentFilterOptions i określ preferowane wartości. Jeśli zdecydujesz się używać wartości domyślnych, możesz przekazać obiekt o wartości null.

  4. Pobierz opis obrazu (LanguageModelResponse.Response), wywołując metodę ImageDescriptionGenerator.DescribeAsync z oryginalnym obrazem, opcjonalnym enumem określającym preferowany typ opisu, i obiektem ContentFilterOptions (opcjonalnie).

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 mogę zrobić za pomocą segmentacji obrazów?

Segmentacja obrazów może służyć do identyfikowania określonych obiektów na obrazie. Model przyjmuje zarówno obraz, jak i obiekt podpowiedzi i zwraca maskę zidentyfikowanego obiektu.

Wskazówki można przekazać za pomocą dowolnej kombinacji następujących elementów:

  • Współrzędne punktów, które należą do tego, co identyfikujesz.
  • Współrzędne punktów, które nie należą do tego, co identyfikujesz.
  • Prostokąt współrzędnych, który otacza to, co identyfikujesz.

Tym więcej wskazówek, tym bardziej precyzyjny może być model. Postępuj zgodnie z tymi wskazówkami, aby zminimalizować niedokładne wyniki lub błędy.

  • Unikaj używania wielu prostokątów we wskazówce, ponieważ mogą one tworzyć niedokładne maski.
  • Unikaj używania wyłącznie punktów wykluczania bez dołączania punktów lub prostokąta.
  • Nie podawaj więcej niż obsługiwane maksymalnie 32 współrzędne (1 dla punktu, 2 dla prostokąta), ponieważ to spowoduje wystąpienie błędu.

Zwrócona maska jest w formacie skali szarości 8-bitowej, gdzie piksele maski dla zidentyfikowanego obiektu mają wartość 255 (wszystkie inne mają wartość 0).

Identyfikowanie obiektu na obrazie

W poniższych przykładach pokazano sposoby identyfikowania obiektu na obrazie. W przykładach przyjęto założenie, że masz już obiekt mapy bitowej oprogramowania (softwareBitmap) dla danych wejściowych.

  1. Upewnij się, że model segmentacji obrazów jest dostępny, wywołując metodę IsAvailable i czekając na pomyślne zakończenie działania metody MakeAvailableAsync.

  2. Po udostępnieniu modelu segmentacji obrazów utwórz obiekt ImageObjectExtractor, aby się do niego odwoływać.

  3. Przekaż obraz do ImageObjectExtractor.CreateWithSoftwareBitmapAsync.

  4. Utwórz ImageObjectExtractorHint obiekt. Inne sposoby tworzenia obiektu wskazówek z różnymi danymi wejściowymi są pokazane później.

  5. Prześlij wskazówkę do modelu przy użyciu metody GetSoftwareBitmapObjectMask, która zwraca wynik końcowy.

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

Określanie wskazówek z dołączonymi i wykluczonymi punktami

Ten fragment kodu pokazuje, jak używać uwzględnionych i wykluczonych punktów jako wskazówek.

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

Określ wskazówki za pomocą prostokąta

Ten fragment kodu pokazuje, jak używać prostokąta (rectInt32 jest X, Y, Width, Height) jako wskazówkę.

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

Odpowiedzialne używanie sztucznej inteligencji

Te interfejsy API do tworzenia obrazów zapewniają deweloperom zaawansowane, godne zaufania modele do budowania aplikacji z bezpiecznym i pewnym działaniem AI. Użyliśmy kombinacji poniższych kroków, aby upewnić się, że te interfejsy API obrazowania są wiarygodne, bezpieczne i tworzone odpowiedzialnie. Zalecamy zapoznanie się z najlepszymi praktykami opisanymi w odpowiedzialnym rozwojem sztucznej inteligencji dla systemu Windows podczas implementowania funkcji sztucznej inteligencji w aplikacji.

  • Dokładne testowanie i ocena jakości modelu w celu zidentyfikowania i ograniczenia potencjalnych zagrożeń.
  • Sukcesywne wdrażanie eksperymentalnych wersji interfejsu API obrazowania. Po ostatecznej wersji eksperymentalnej wdrożenie zostanie rozwinięte do podpisanych aplikacji, aby upewnić się, że skanowanie złośliwego oprogramowania zostało zastosowane do aplikacji z lokalnymi możliwościami modelu.
  • Podaj lokalny model sztucznej inteligencji dla moderowania zawartości, który identyfikuje i filtruje szkodliwą zawartość zarówno w danych wejściowych, jak i wygenerowanych przez sztuczną inteligencję danych wyjściowych wszystkich interfejsów API korzystających z modeli generowania sztucznej inteligencji. Ten lokalny model moderowania zawartości jest oparty na modelu bezpieczeństwa zawartości usługi Azure AI moderowania tekstu i zapewnia podobną wydajność.

Ważny

Nie ma nieosiągalnego systemu bezpieczeństwa zawartości i mogą wystąpić sporadyczne błędy, dlatego zalecamy zintegrowanie dodatkowych narzędzi i praktyk dotyczących odpowiedzialnej sztucznej inteligencji (RAI). Aby uzyskać więcej informacji, zobacz Odpowiedzialne tworzenie sztucznej inteligencji w systemie Windows.