다음을 통해 공유


Windows 앱 SDK AI 이미징 시작

Important

Windows 앱 SDK의 최신 실험 채널 릴리스에서 사용할 수 있습니다.

Windows 앱 SDK 실험 채널에는 개발 초기 단계의 API 및 기능이 포함되어 있습니다. 실험적 채널의 모든 API는 광범위한 수정 및 호환성이 손상되는 변경이 적용되며 언제든지 후속 릴리스에서 제거될 수 있습니다. 실험적 기능은 프로덕션 환경에서 사용할 수 없으며 이를 사용하는 앱은 Microsoft Store에 게시할 수 없습니다.

  • 이미징 기능은 중국에서 사용할 수 없습니다.
  • 패키지되지 않은 앱은 지원되지 않습니다.

이미징 기능은 다음 기능을 지원하는 AI(인공 지능)를 지원하는 일련의 API를 통해 Windows 앱 SDK에서 제공됩니다.

  • 이미지 슈퍼 해상도: 이미지 크기 조정 및 선명화
  • 이미지 설명: 이미지를 설명하는 텍스트 생성
  • 이미지 구분: 이미지 내의 개체 식별

API 세부 정보Windows 앱 SDK AI 이미징 기능에 대한API 참조를 참조하세요.

생성 AI API 콘텐츠 안전에 대해 알아보려면 콘텐츠 조정 세부 정보를 참조하세요.

Windows 앱 SDK GitHub 리포지토리에서 새 문제 만들거나(타이틀에 이미징 포함) 기존 문제응답하여 이러한 API 및 해당 기능에 대한 피드백을 제공합니다.

필수 조건

이미지 슈퍼 해상도로 무엇을 할 수 있나요?

Windows 앱 SDK의 이미지 슈퍼 해상도 API를 사용하면 이미지 선명화 및 크기 조정이 가능합니다.

크기 조정은 최대 8배로 제한됩니다. 배율 인수가 높을수록 아티팩트가 도입되고 이미지 정확도가 손상됩니다. 최종 너비 또는 높이가 원래 값의 8배보다 크면 예외가 throw됩니다.

다음 예제에서는 targetWidth 개체를 사용하여 기존 소프트웨어 비트맵 이미지(targetHeight)의 배율(softwareBitmap, ImageScaler)을 변경하고 이미지 선명도를 개선하는 방법을 보여 줍니다(이미지 크기를 조정하지 않고 선명도를 개선하기 위해 기존 이미지 너비 및 높이 지정).

  1. ImageScaler.IsAvailable 메서드를 호출한 다음 ImageScaler.MakeAvailableAsync 메서드가 성공적으로 반환되도록 대기하여 이미지 슈퍼 해상도 모델을 사용할 수 있는지 확인합니다.

  2. 이미지 슈퍼 해상도 모델을 사용할 수 있게 되면 참조할 ImageScaler 개체를 만듭니다.

  3. ScaleSoftwareBitmap 메서드를 사용하여 기존 이미지와 원하는 너비 및 높이를 모델에 전달하여 기존 이미지의 선명하고 크기가 조정된 버전을 가져옵니다.

using Microsoft.Windows.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);

이미지 설명으로 무엇을 할 수 있나요?

Important

이미지 설명은 현재 중국에서 사용할 수 없습니다.

Windows 앱 SDK의 이미지 설명 API는 이미지에 대한 다양한 유형의 텍스트 설명을 생성하는 기능을 제공합니다.

지원되는 텍스트 설명 유형은 다음과 같습니다.

  • 접근성 - 접근성 요구 사항이 있는 사용자를 위한 세부 정보가 포함된 긴 설명을 제공합니다.
  • 캡션 - 이미지 캡션에 적합한 간단한 설명을 제공합니다. 값이 지정되지 않은 경우 기본값입니다.
  • DetailedNarration - 긴 설명을 제공합니다.
  • OfficeCharts - 차트 및 다이어그램에 적합한 설명을 제공합니다.

이러한 API는 ML(Machine Learning) 모델을 사용하므로 텍스트가 이미지를 올바르게 설명하지 않는 경우에 가끔 오류가 발생할 수 있습니다. 따라서 다음 시나리오에서는 이러한 API를 이미지에 사용하지 않는 것이 좋습니다.

  • 이미지에 잠재적으로 민감한 콘텐츠와 부정확한 설명이 포함된 경우 플래그, 지도, 지구본, 문화 기호 또는 종교적 기호와 같이 논란의 여지가 있을 수 있습니다.
  • 의학적 조언이나 진단, 법적 콘텐츠 또는 재무 문서와 같은 정확한 설명이 중요한 경우

이미지에서 텍스트 설명 가져오기

이미지 설명 API는 유해한 사용으로부터 보호하기 위해 이미지, 원하는 텍스트 설명 유형(선택 사항) 및 사용하려는 콘텐츠 조정 수준(선택 사항)을 사용합니다.

다음 예제에서는 이미지에 대한 텍스트 설명을 가져오는 방법을 보여줍니다.

참고 항목

ImageBuffer 현재 지원되지 않으므로 이미지는 SoftwareBitmap 개체여야 합니다. 이 예제에서는 SoftwareBitmapImageBuffer변환하는 방법을 보여 줍니다.

  1. ImageDescriptionGenerator.IsAvailable 메서드를 호출한 다음 ImageDescriptionGenerator.MakeAvailableAsync 메서드가 성공적으로 반환되도록 대기하여 이미지 슈퍼 해상도 모델을 사용할 수 있는지 확인합니다.

  2. 이미지 슈퍼 해상도 모델을 사용할 수 있게 되면 참조할 ImageDescriptionGenerator 개체를 만듭니다.

  3. (선택 사항) ContentFilterOptions 개체를 만들고 원하는 값을 지정합니다. 기본값을 사용하도록 선택한 경우 null 개체를 전달할 수 있습니다.

  4. 원래 이미지, 기본 설정 설명 형식의 열거형(선택 사항) 및 LanguageModelResponse.Response 개체(선택 사항)를 사용하여 ImageDescriptionGenerator.DescribeAsync 메서드를 호출하여 이미지 설명(ContentFilterOptions)을 가져옵니다.

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

이미지 구분으로 무엇을 할 수 있나요?

이미지 구분을 사용하여 이미지의 특정 개체를 식별할 수 있습니다. 모델은 이미지와 "힌트" 개체를 모두 사용하고 식별된 개체의 마스크를 반환합니다.

힌트는 다음의 조합을 통해 제공할 수 있습니다.

  • 식별 대상에 속하는 점의 좌표입니다.
  • 식별 대상에 속하지 않는 점의 좌표입니다.
  • 식별 대상을 묶는 좌표 사각형입니다.

힌트가 많을수록 모델이 더 정확해질 수 있습니다. 부정확한 결과 또는 오류를 최소화하려면 다음 힌트 지침을 따르세요.

  • 부정확한 마스크를 생성할 수 있으므로 힌트에 여러 사각형을 사용하지 마세요.
  • 포함 지점이나 사각형 없이 제외 지점을 단독으로 사용하지 않습니다.
  • 오류가 반환되므로 지원되는 최대 32개의 좌표(점의 경우 1, 사각형의 경우 2)를 초과하여 지정하지 마세요.

반환된 마스크는 회색조-8 형식으로, 식별된 개체의 마스크 픽셀은 값이 255이며, 나머지 모든 픽셀은 값이 0입니다.

이미지 내의 개체 식별

다음 예제에서는 이미지 내에서 개체를 식별하는 방법을 보여 줍니다. 이 예제에서는 입력에 대한 소프트웨어 비트맵 개체(softwareBitmap)가 이미 있다고 가정합니다.

  1. IsAvailable 메서드를 호출하고 MakeAvailableAsync 메서드가 성공적으로 반환되도록 대기하여 이미지 구분 모델을 사용할 수 있는지 확인합니다.

  2. 이미지 구분 모델을 사용할 수 있게 되면 참조할 ImageObjectExtractor 개체를 만듭니다.

  3. 이미지를 ImageObjectExtractor.CreateWithSoftwareBitmapAsync전달합니다.

  4. ImageObjectExtractorHint 개체 만들기 다른 입력을 사용하여 힌트 개체를 만드는 다른 방법은 나중에 설명합니다.

  5. 최종 결과를 반환하는 GetSoftwareBitmapObjectMask 메서드를 사용하여 모델에 힌트를 제출합니다.

using Microsoft.Windows.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);

포함된 점과 제외된 점을 사용하여 힌트 지정

이 코드 조각은 포함된 점과 제외된 점을 모두 힌트로 사용하는 방법을 보여 줍니다.

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

사각형을 사용하여 힌트 지정

이 코드 조각은 직사각형(RectInt32는 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}
    }, 
    {},
    {}
);

책임 있는 AI

이러한 이미징 API는 개발자에게 안전하고 안전한 AI 환경을 사용하여 앱을 빌드하기 위한 강력하고 신뢰할 수 있는 모델을 제공합니다. 다음 단계의 조합을 사용하여 이러한 이미징 API가 신뢰할 수 있고 안전하며 책임감 있게 빌드되도록 했습니다. 앱에 AI 기능을 구현할 때는 Windows의 책임 있는 생성 AI 개발에 설명된 모범 사례를 검토할 것을 권장합니다.

  • 모델 품질을 철저히 테스트하고 평가하여 잠재적 위험을 식별하고 완화합니다.
  • 이미징 API 실험 릴리스의 순차적 배포 최종 실험적 릴리스에 따라 롤아웃은 서명된 앱으로 확장되어 로컬 모델 기능이 있는 애플리케이션에 맬웨어 검사가 적용되었는지 확인합니다.
  • 생성 AI 모델을 사용하는 API의 입력 및 AI 생성 출력 모두에서 유해한 콘텐츠를 식별하고 필터링하는 콘텐츠 조정을 위한 로컬 AI 모델을 제공합니다. 이 로컬 con텐트 모드ration 모델은 텍스트 조정을 위한 Azure AI 콘텐츠 안전 모델을 기반으로 하며 비슷한 성능을 제공합니다.

Important

콘텐츠 안전 시스템은 틀릴 수 없으며 가끔 오류가 발생할 수 있으므로 추가적인 RAI(책임 있는 AI) 도구와 사례를 통합하는 것이 좋습니다. 자세한 내용은 Windows의 책임 있는 생성 AI 개발을 참조 하세요.