다음을 통해 공유


이미지 설명

중요합니다

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

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

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

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

이미지 설명 예제

다음 예제에서는 지정된 설명 유형(선택 사항) 및 콘텐츠 조정 수준(선택 사항)을 기반으로 이미지에 대한 텍스트 설명을 가져오는 방법을 보여 줍니다.

비고

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

  1. GetReadyState 메서드를 호출한 다음 EnsureReadyAsync 메서드가 성공적으로 반환되도록 대기하여 이미지 설명 모델을 사용할 수 있는지 확인합니다.

  2. 이미지 설명 모델을 사용할 수 있게 되면 ImageDescriptionGenerator 개체를 만들어 참조합니다.

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

  4. 원래 이미지를 지정하는 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();

    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(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(inputBuffer, ImageDescriptionKind::BriefDescription, contentFilter).get();
string text = response.Description();

참고하십시오