Windows 앱 SDK AI 이미징 시작
Important
이 기능은 아직 사용할 수 없습니다. 그것은 Windows 앱 SDK 곧 실험 채널 릴리스에서 제공 될 것으로 예상된다.
Windows 앱 SDK 실험 채널에는 개발 초기 단계의 API 및 기능이 포함됩니다. 실험적 채널의 모든 API는 광범위한 수정 및 호환성이 손상되는 변경이 적용되며 언제든지 후속 릴리스에서 제거될 수 있습니다. 프로덕션 환경에서는 사용할 수 없으며 실험적 기능을 사용하는 앱은 Microsoft Store에 게시할 수 없습니다.
이미징 기능은 이미지의 크기를 조정하고 선명하게 할 수 있을 뿐만 아니라 이미지 내의 개체를 식별할 수 있는 AI(인공 지능) 지원 API 집합을 통해 Windows 앱 SDK 지원됩니다(이미지 구분).
API 세부 정보는 Windows 앱 SDK AI 지원 이미징 기능에 대한 API 참조를 참조하세요.
팁
Windows 앱 SDK GitHub 리포지토리에서 새 문제를 만들어 이러한 API 및 해당 기능에 대한 피드백을 제공합니다. (제목에 이미징을 포함해야 합니다.)
필수 조건
-
CoPilot+ PC
참고 항목
AMD 기반 CoPilot+ PC는 이미지 슈퍼 해상도를 지원하지 않습니다.
Windows 앱 SDK 및 이미지 슈퍼 해상도로 무엇을 할 수 있나요?
Windows 앱 SDK 새로운 AI 이미지 슈퍼 해상도 기능을 사용하여 이미지를 선명하게 하고 이미지를 선명하게 하여 크기를 조정합니다.
참고 항목
크기 조정은 최대 8배로 조정됩니다(배율 인수가 높을수록 아티팩트가 도입되고 이미지 정확도가 손상될 수 있음). 최종 너비 또는 높이가 원래 값의 8배보다 크면 예외가 throw됩니다.
이미지의 선명도 향상
이 예제에서는 기존 소프트웨어 비트맵 이미지의 배율(targetWidth
targetHeight
, softwareBitmap
)을 변경하고 선명도를 개선하는 방법을 보여 줍니다(이미지 크기를 조정하지 않고 선명도를 높이려면 원래 이미지 너비 및 높이 지정).
- 먼저 IsAvailable 메서드를 호출하고 MakeAvailableAsync 메서드가 성공적으로 반환되도록 대기하여 이미지 슈퍼 해상도 모델을 사용할 수 있는지 확인합니다.
- 이미지 슈퍼 해상도 모델을 사용할 수 있게 되면 참조할 개체를 만듭니다.
- 그런 다음 ScaleSoftwareBitmap 메서드를 사용하여 최종 이미지의 원본 이미지와 대상 너비 및 높이를 모델에 제출하여 최종 이미지를 가져옵니다.
using Microsft.Windows.Imaging;
using Windows.Graphics.Imaging;
if (!ImageScaler.IsAvailable())
{
var result = ImageScaler.MakeAvailableAsync();
if (result.Status != PackageDeploymentStatus.CompletedSuccess)
{
throw result.ExtendedError;
}
}
var imageScaler = await ImageScaler.CreateAsync();
var finalImage = imageScaler.ScaleSoftwareBitmap(softwareBitmap, targetWidth, targetHeight);
#include "winrt/Microsoft.Graphics.Imaging.h"
#include "winrt/Windows.Graphics.Imaging.h"
using namespace winrt::Windows::Graphics::Imaging;
using namespace winrt::Microsoft::Graphics::Imaging;
if (!ImageScaler::IsAvailable())
{
auto result = ImageScaler::MakeAvailableAsync();
if (result.Status() != AsyncStatus::Completed)
{
throw result.ErrorCode();
}
}
ImageScaler imageScaler = ImageScaler::CreateAsync().get();
ImageBuffer buffer = imageScaler.ScaleSoftwareBitmap(softwareBitmap, targetWidth, targetHeight);
Windows 앱 SDK 및 이미지 구분으로 무엇을 할 수 있나요?
이미지 구분을 사용하여 이미지의 특정 개체를 식별할 수 있습니다. 모델은 이미지와 "힌트" 개체를 모두 사용하고 식별된 개체의 마스크를 반환합니다.
힌트는 다음의 조합을 통해 제공할 수 있습니다.
- 식별 대상에 속하는 점의 좌표입니다.
- 식별 대상에 속하지 않는 점의 좌표입니다.
- 식별 대상을 묶는 좌표 사각형입니다.
힌트가 많을수록 모델이 더 정확해질 수 있습니다. 그러나 부정확한 결과 또는 오류를 방지하려면 다음 힌트 지침을 따릅니다.
- 부정확한 마스크를 생성할 수 있으므로 힌트에 여러 사각형을 사용하지 마세요.
- 포함 지점이나 사각형 없이 제외 지점을 단독으로 사용하지 않습니다.
- 오류가 반환되므로 지원되는 최대 32개의 좌표(점의 경우 1, 사각형의 경우 2)를 초과하여 지정하지 마세요.
반환된 마스크는 회색조-8 형식입니다. 마스크 내에서 식별된 개체의 픽셀은 255입니다(나머지는 0이고 그 사이에 값을 보유하는 픽셀이 없음).
이미지 내의 개체 식별
다음 예제에서는 이미지 내에서 개체를 식별할 수 있는 다양한 방법을 보여 줍니다. 입력에 대한 소프트웨어 비트맵 개체(softwareBitmap
)가 이미 있다고 가정합니다.
- 먼저 IsAvailable 메서드를 호출하고 MakeAvailableAsync 메서드가 성공적으로 반환되도록 대기하여 이미지 구분 모델을 사용할 수 있는지 확인합니다.
- 이미지 구분 모델을 사용할 수 있게 되면 이를 참조할 개체를 만듭니다.
- 다음으로 ImageObjectExtractor.CreateWithImageBufferAsync(또는 이미지 형식에 따라 CreateWithSoftwareBitmapAsync)에 이미지를 전달하여 ImageObjectExtractor 클래스를 만듭니다.
- 그런 다음 ImageObjectExtractorHint 개체를 만듭니다(이 항목의 뒷부분에서 다른 입력을 사용하여 힌트 개체를 만드는 다른 방법을 보여 줍니다).
- 마지막으로 최종 결과를 반환하는 GetSoftwareBitmapObjectMask 메서드를 사용하여 모델에 힌트를 제출합니다.
using Microsft.Windows.Imaging;
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(
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"
using namespace winrt::Windows::Graphics::Imaging;
using namespace winrt::Microsoft::Graphics::Imaging;
if (!ImageObjectExtractor::IsAvailable())
{
auto result = ImageObjectExtractor::MakeAvailableAsync();
if (result.Status() != AsyncStatus::Completed)
{
throw result.ErrorCode();
}
}
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 is 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}
},
{},
{}
);