Windows AI API에서 지원하는 AI 이미징 기능을 사용하면 다음 기능을 사용할 수 있습니다.
- 이미지 수퍼 해상도: 이미지 크기 조정 및 선명화
- 이미지 설명: 이미지를 설명하는 텍스트 생성
- 이미지 구분: 이미지 내의 개체 식별
- 이미지 전경 추출: 입력 이미지의 전경 추출
- 개체 지우기: 이미지에서 개체 제거
API 세부 정보는AI 이미징 기능에 대한 API 참조를 참조하세요.
콘텐츠 조정 세부 정보는생성 AI API를 사용한 콘텐츠 안전성을 참조하세요.
중요
패키지 매니페스트 요구 사항: Windows AI 이미징 API를 사용하려면 앱이 선언된 systemAIModels기능을 사용하여 MSIX 패키지로 Package.appxmanifest 패키지되어야 합니다. 또한 매니페스트의 MaxVersionTested 특성이 Windows AI 기능을 제대로 지원하도록 최신 Windows 버전(예: 10.0.26226.0 이상)으로 설정되어 있는지 확인합니다. 이전 값을 사용하면 모델을 로드할 때 "앱에서 선언되지 않음" 오류가 발생할 수 있습니다.
<Dependencies>
<TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.17763.0" MaxVersionTested="10.0.26226.0" />
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.17763.0" MaxVersionTested="10.0.26226.0" />
</Dependencies>
이미지 슈퍼 해상도로 무엇을 할 수 있나요?
이미지 슈퍼 해상도 API를 사용하면 이미지 선명도 및 크기 조정이 가능합니다.
배율 인수가 높을수록 아티팩트가 도입되고 이미지 정확도가 손상될 수 있으므로 크기 조정은 최대 8배로 제한됩니다. 최종 너비 또는 높이가 원래 값의 8배보다 크면 예외가 발생합니다.
이미지 슈퍼 해상도 예제
다음 예제에서는 기존 소프트웨어 비트맵 이미지targetWidth의 배율(targetHeight, softwareBitmap)을 변경하고 개체를 사용하여 ImageScaler 이미지 선명도를 개선하는 방법을 보여 줍니다(이미지 크기를 조정하지 않고 선명도를 개선하기 위해 기존 이미지 너비와 높이를 지정하기만 하면 됩니다).
GetReadyState 메서드를 호출한 다음 EnsureReadyAsync 메서드가 성공적으로 반환되도록 대기하여 이미지 슈퍼 해상도 모델을 사용할 수 있는지 확인합니다.
이미지 슈퍼 해상도 모델을 사용할 수 있게 되면 ImageScaler 개체를 만들어 참조합니다.
ScaleSoftwareBitmap 메서드를 사용하여 기존 이미지와 원하는 너비 및 높이를 모델에 전달하여 기존 이미지의 선명하고 크기가 조정된 버전을 가져옵니다.
using Microsoft.Graphics.Imaging;
using Microsoft.Windows.Management.Deployment;
using Microsoft.Windows.AI;
using Windows.Graphics.Imaging;
if (ImageScaler.GetReadyState() == AIFeatureReadyState.NotReady)
{
var result = await ImageScaler.EnsureReadyAsync();
if (result.Status != AIFeatureReadyResultState.Success)
{
throw result.ExtendedError;
}
}
ImageScaler imageScaler = await ImageScaler.CreateAsync();
SoftwareBitmap finalImage = imageScaler.ScaleSoftwareBitmap(softwareBitmap, targetWidth, targetHeight);
#include <winrt/Microsoft.Graphics.Imaging.h>
#include <winrt/Microsoft.Windows.AI.h>
#include <winrt/Windows.Foundation.h>
#include <winrt/Windows.Graphics.Imaging.h>
using namespace winrt::Microsoft::Graphics::Imaging;
using namespace winrt::Microsoft::Windows::AI;
using namespace winrt::Windows::Foundation;
using namespace winrt::Windows::Graphics::Imaging;
if (ImageScaler::GetReadyState() == AIFeatureReadyState::NotReady)
{
auto loadResult = ImageScaler::EnsureReadyAsync().get();
if (loadResult.Status() != AIFeatureReadyResultState::Success)
{
throw winrt::hresult_error(loadResult.ExtendedError());
}
}
int targetWidth = 100;
int targetHeight = 100;
ImageScaler imageScaler = ImageScaler::CreateAsync().get();
Windows::Graphics::Imaging::SoftwareBitmap finalImage =
imageScaler.ScaleSoftwareBitmap(softwareBitmap, targetWidth, targetHeight);
이미지 설명으로 무엇을 할 수 있나요?
중요
이미지 설명은 현재 중국에서 사용할 수 없습니다.
이미지 설명 API는 이미지에 대한 다양한 유형의 텍스트 설명을 생성하는 기능을 제공합니다.
지원되는 텍스트 설명 유형은 다음과 같습니다.
- 간략한 - 차트 및 다이어그램에 적합한 설명을 제공합니다.
- 상세 - 자세한 설명을 제공합니다.
- 다이어그램 - 이미지 캡션에 적합한 간단한 설명을 제공합니다. 값이 지정되지 않은 경우 기본값입니다.
- 접근성 - 접근성 요구 사항이 있는 사용자를 위한 세부 정보가 포함된 긴 설명을 제공합니다.
이러한 API는 ML(Machine Learning) 모델을 사용하므로 텍스트가 이미지를 올바르게 설명하지 않는 경우에 가끔 오류가 발생할 수 있습니다. 따라서 다음 시나리오에서는 이러한 API를 이미지에 사용하지 않는 것이 좋습니다.
- 이미지에 잠재적으로 민감한 콘텐츠와 부정확한 설명이 포함된 경우 플래그, 지도, 지구본, 문화 기호 또는 종교적 기호와 같이 논란의 여지가 있을 수 있습니다.
- 의학적 조언이나 진단, 법적 콘텐츠 또는 재무 문서와 같은 정확한 설명이 중요한 경우
이미지 설명 예제
다음 예제에서는 지정된 설명 유형(선택 사항) 및 콘텐츠 조정 수준(선택 사항)을 기반으로 이미지에 대한 텍스트 설명을 가져오는 방법을 보여 줍니다.
참고
SoftwareBitmap이 현재 지원되지 않으므로 이미지는 ImageBuffer 개체여야 합니다(이 예제에서는 SoftwareBitmap을 ImageBuffer로 변환하는 방법을 보여 줍니다).
GetReadyState 메서드를 호출한 다음 EnsureReadyAsync 메서드가 성공적으로 반환되도록 대기하여 이미지 슈퍼 해상도 모델을 사용할 수 있는지 확인합니다.
이미지 슈퍼 해상도 모델을 사용할 수 있게 되면 ImageDescriptionGenerator 개체를 만들어 참조합니다.
(선택 사항) ContentFilterOptions 개체를 만들고 원하는 값을 지정합니다. 기본값을 사용하도록 선택한 경우 null 개체를 전달할 수 있습니다.
원래 이미지를 지정하는 DescribeAsync 메서드, ImageDescriptionKind(기본 설명 형식의 선택적 값) 및 ContentFilterOptions 개체(선택 사항)를 호출하여 이미지 설명(LanguageModelResponse.Response)을 가져옵니다.
using Microsoft.Graphics.Imaging;
using Microsoft.Windows.Management.Deployment;
using Microsoft.Windows.AI;
using Microsoft.Windows.AI.ContentModeration;
using Windows.Storage.StorageFile;
using Windows.Storage.Streams;
using Windows.Graphics.Imaging;
if (ImageDescriptionGenerator.GetReadyState() == AIFeatureReadyState.NotReady)
{
var result = await ImageDescriptionGenerator.EnsureReadyAsync();
if (result.Status != AIFeatureReadyResultState.Success)
{
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.Imaging.h>
#include <winrt/Microsoft.Windows.AI.ContentSafety.h>
#include <winrt/Microsoft.Windows.AI.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;
using namespace winrt::Microsoft::Windows::AI::ContentSafety;
using namespace winrt::Microsoft::Windows::AI::Imaging;
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::GetReadyState() == AIFeatureReadyState::NotReady)
{
auto loadResult = ImageDescriptionGenerator::EnsureReadyAsync().get();
auto loadResult = ImageScaler::EnsureReadyAsync().get();
if (loadResult.Status() != AIFeatureReadyResultState::Success)
{
throw winrt::hresult_error(loadResult.ExtendedError());
}
}
ImageDescriptionGenerator imageDescriptionGenerator =
ImageDescriptionGenerator::CreateAsync().get();
// Convert already available softwareBitmap to ImageBuffer.
auto inputBuffer = Microsoft::Graphics::Imaging::ImageBuffer::CreateForSoftwareBitmap(bitmap); (softwareBitmap);
// Create content moderation thresholds object.
ContentFilterOptions contentFilter{};
contentFilter.PromptMaxAllowedSeverityLevel().Violent(SeverityLevel::Medium);
contentFilter.ResponseMaxAllowedSeverityLevel().Violent(SeverityLevel::Medium);
// Get text description.
auto response = imageDescriptionGenerator.DescribeAsync(inputImage, ImageDescriptionKind::BriefDescription, contentFilter).get();
string text = response.Description();
이미지 구분으로 무엇을 할 수 있나요?
이미지 구분을 사용하여 이미지의 특정 개체를 식별할 수 있습니다. 이 모델은 이미지와 "힌트" 개체를 모두 사용하여 식별된 개체의 마스크를 반환합니다.
힌트는 다음의 조합을 통해 제공할 수 있습니다.
- 식별 대상에 속하는 점의 좌표입니다.
- 식별 대상에 속하지 않는 점의 좌표입니다.
- 식별 대상을 묶는 좌표 사각형입니다.
힌트가 많을수록 모델이 더 정확해질 수 있습니다. 부정확한 결과 또는 오류를 최소화하려면 다음 힌트 지침을 따르세요.
- 부정확한 마스크를 생성할 수 있으므로 힌트에 여러 사각형을 사용하지 마세요.
- 제외 지점만 단독으로 사용하지 말고, 포함 지점이나 사각형을 함께 사용하십시오.
- 오류가 반환되므로 지원되는 최대 32개의 좌표(점의 경우 1, 사각형의 경우 2)를 초과하여 지정하지 마세요.
반환된 마스크는 회색조-8 형식으로, 식별된 개체의 마스크 픽셀은 값이 255이며, 나머지 모든 픽셀은 값이 0입니다.
이미지 구분 예제
다음 예제에서는 이미지 내에서 개체를 식별하는 방법을 보여 줍니다. 이 예제에서는 입력에 대한 소프트웨어 비트맵 개체(softwareBitmap)가 이미 있다고 가정합니다.
GetReadyState 메서드를 호출하고 EnsureReadyAsync 메서드가 성공적으로 반환되도록 대기하여 이미지 구분 모델을 사용할 수 있는지 확인합니다.
이미지 구분 모델을 사용할 수 있게 되면 ImageObjectExtractor 개체를 만들어 참조합니다.
ImageObjectExtractorHint 개체를 만듭니다. 다른 입력을 사용하여 힌트 개체를 만드는 다른 방법은 나중에 설명합니다.
최종 결과를 반환하는 GetSoftwareBitmapObjectMask 메서드를 사용하여 모델에 힌트를 제출합니다.
using Microsoft.Graphics.Imaging;
using Microsoft.Windows.AI;
using Microsoft.Windows.Management.Deployment;
using Windows.Graphics.Imaging;
if (ImageObjectExtractor::GetReadyState() == AIFeatureReadyState.NotReady)
{
var result = await ImageObjectExtractor.EnsureReadyAsync();
if (result.Status != AIFeatureReadyResultState.Success)
{
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/Microsoft.Windows.AI.Imaging.h>
#include <winrt/Windows.Graphics.Imaging.h>
#include <winrt/Windows.Foundation.h>
using namespace winrt::Microsoft::Graphics::Imaging;
using namespace winrt::Microsoft::Windows::AI.Imaging;
using namespace winrt::Windows::Graphics::Imaging;
using namespace winrt::Windows::Foundation;
if (ImageObjectExtractor::GetReadyState() == AIFeatureReadyState::NotReady)
{
auto loadResult = ImageObjectExtractor::EnsureReadyAsync().get();
if (loadResult.Status() != AIFeatureReadyResultState::Success)
{
throw winrt::hresult_error(loadResult.ExtendedError());
}
}
ImageObjectExtractor imageObjectExtractor = ImageObjectExtractor::CreateWithSoftwareBitmapAsync(softwareBitmap).get();
ImageObjectExtractorHint hint(
{},
{
Windows::Graphics::PointInt32{306, 212},
Windows::Graphics::PointInt32{216, 336}
},
{}
);
Windows::Graphics::Imaging::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}
},
{},
{}
);
이미지 전경 추출기로 무엇을 할 수 있나요?
ImageForegroundExtractor를 사용하여 입력 이미지의 전경을 분할하고 배경 제거 및 스티커 생성과 같은 기능을 사용하도록 설정합니다.
반환된 마스크는 그레이스케일 8 형식입니다. 픽셀 값 범위는 0에서 255까지입니다. 여기서 0은 배경 픽셀을 나타내고, 255는 전경 픽셀을 나타내고, 중간 값은 전경과 배경 픽셀의 혼합을 나타냅니다.
비트맵 이미지에서 마스크 생성
- GetReadyState를 호출하고 EnsureReadyAsync가 성공적으로 완료되어 ImageForegroundExtractor 개체가 준비되었는지 확인합니다.
- 모델이 준비되면 CreateAsync 를 호출하여 ImageForegroundExtractor 개체를 인스턴스화합니다.
- 입력 이미지를 사용하여 GetMaskFromSoftwareBitmap 을 호출하여 포그라운드 마스크를 생성합니다.
using Microsoft.Windows.AI.Imaging;
using Microsoft.Windows.AI;
if (ImageForegroundExtractor.GetReadyState() == AIFeatureReadyState.NotReady)
{
var result = await ImageForegroundExtractor.EnsureReadyAsync();
if (result.Status != AIFeatureReadyResultState.Success)
{
throw result.ExtendedError;
}
}
var model = await ImageForegroundExtractor.CreateAsync();
// Insert your own softwareBitmap here.
var foregroundMask = model.GetMaskFromSoftwareBitmap(softwareBitmap);
#include <winrt/Microsoft.Graphics.Imaging.h>
#include <winrt/Microsoft.Windows.AI.Imaging.h>
#include <winrt/Windows.Graphics.Imaging.h>
#include <winrt/Windows.Foundation.h>
using namespace winrt::Microsoft::Graphics::Imaging;
using namespace winrt::Microsoft::Windows::AI.Imaging;
using namespace winrt::Windows::Graphics::Imaging;
using namespace winrt::Windows::Foundation;
if (ImageForegroundExtractor::GetReadyState() == AIFeatureReadyState::NotReady)
{
auto loadResult = ImageForegroundExtractor::EnsureReadyAsync().get();
if (loadResult.Status() != AIFeatureReadyResultState::Success)
{
throw winrt::hresult_error(loadResult.ExtendedError());
}
}
auto model = co_await ImageForegroundExtractor::CreateAsync();
// Insert your own softwareBitmap here.
auto foregroundMask = model.GetMaskFromSoftwareBitmap(softwareBitmap);
개체 지우기로 무엇을 할 수 있나요?
개체 지우기를 사용하여 이미지에서 개체를 제거할 수 있습니다. 모델은 제거할 개체를 나타내는 이미지와 회색조 마스크를 모두 사용하고, 이미지에서 마스킹된 영역을 지우고, 지운 영역을 이미지 배경으로 바꿉니다.
개체 지우기 예제
다음 예제에서는 이미지에서 개체를 제거하는 방법을 보여줍니다. 이 예제에서는 이미지와 마스크 모두에 대한 소프트웨어 비트맵 개체(softwareBitmap)가 이미 있다고 가정합니다. 마스크는 제거할 영역의 각 픽셀이 255로 설정되고 다른 모든 픽셀이 0으로 설정된 Gray8 형식이어야 합니다.
- GetReadyState 메서드를 호출하고 EnsureReadyAsync 메서드가 성공적으로 반환되도록 대기하여 이미지 구분 모델을 사용할 수 있는지 확인합니다.
- 개체 지우기 모델을 사용할 수 있게 되면 ImageObjectRemover 개체를 만들어 참조합니다.
- 마지막으로 최종 결과를 반환하는 RemoveFromSoftwareBitmap 메서드를 사용하여 이미지와 마스크를 모델에 제출합니다.
using Microsoft.Graphics.Imaging;
using Microsoft.Windows.AI;
using Microsoft.Windows.Management.Deployment;
using Windows.Graphics.Imaging;
if (ImageObjectRemover::GetReadyState() == AIFeatureReadyState.NotReady)
{
var result = await ImageObjectRemover.EnsureReadyAsync();
if (result.Status != AIFeatureReadyResultState.Success)
{
throw result.ExtendedError;
}
}
ImageObjectRemover imageObjectRemover = await ImageObjectRemover.CreateAsync();
SoftwareBitmap finalImage = imageObjectRemover.RemoveFromSoftwareBitmap(imageBitmap, maskBitmap); // Insert your own imagebitmap and maskbitmap
#include <winrt/Microsoft.Graphics.Imaging.h>
#include <winrt/Microsoft.Windows.AI.Imaging.h>
#include <winrt/Windows.Graphics.Imaging.h>
#include <winrt/Windows.Foundation.h>
using namespace winrt::Microsoft::Graphics::Imaging;
using namespace winrt::Microsoft::Windows::AI.Imaging;
using namespace winrt::Windows::Graphics::Imaging;
using namespace winrt::Windows::Foundation;
if (ImageObjectRemover::GetReadyState() == AIFeatureReadyState::NotReady)
{
auto loadResult = ImageObjectRemover::EnsureReadyAsync().get();
if (loadResult.Status() != AIFeatureReadyResultState::Success)
{
throw winrt::hresult_error(loadResult.ExtendedError());
}
}
ImageObjectRemover imageObjectRemover = ImageObjectRemover::CreateAsync().get();
// Insert your own imagebitmap and maskbitmap
Windows::Graphics::Imaging::SoftwareBitmap buffer =
imageObjectRemover.RemoveFromSoftwareBitmap(imageBitmap, maskBitmap);
책임 있는 AI
다음 단계의 조합을 사용하여 이러한 이미징 API가 신뢰할 수 있고 안전하며 책임감 있게 빌드되도록 했습니다. 앱에서 AI 기능을 구현할 때 Windows의 책임 있는 생성 AI 개발에 설명된 모범 사례를 검토하는 것이 좋습니다.