次の方法で共有


Windows アプリ SDKでの AI イメージングの概要

重要

Windows App SDK の最新の実検的チャネル リリースで使用できます。

Windows App SDK の実験用チャネルには、開発の初期段階の API と機能が含まれています。 実験用チャネル内のすべての API は、広範な変更と破壊的変更の対象となり、今後のリリースからいつでも削除される可能性があります。 実検段階の機能は運用環境での使用はサポートされておらず、それらを使用するアプリは Microsoft Store に公開できません。

  • イメージング機能は中国では利用できません。
  • パッケージ化されていないアプリはサポートされていません。

イメージング機能は、AI を活用した API によって提供され、Windows App SDK により次の機能が利用可能になります。

  • 画像の超解像: 画像のスケーリングと鮮明化
  • 画像の説明文生成: 画像を説明するテキストの生成
  • 画像のセグメント化: 画像内のオブジェクトの識別

API の詳細については、「Windows App SDK の AI イメージング機能に関する API リファレンス」を参照してください。

コンテンツ モデレーションの詳細については、「生成 AI API を使用したコンテンツの安全性」を参照してください。

ヒント

これらの API とその機能に関するフィードバックをご提供ください。これには、Windows App SDK GitHub リポジトリで新しい問題を作成する (タイトルに Imaging を含める) 方法と、既存の問題に返信する方法があります。

前提条件

画像の超解像でできること

Windows App SDK の画像超解像 API により、画像の鮮明化やスケーリングが可能になります。

スケーリングは最大 8 倍に制限されます。 拡大倍率を上げるとアーティファクトが生じ、画像の正確さが損なわれる可能性があります。 最終的な幅または高さが元の値の 8 倍を超える場合は、例外がスローされます。

次の例は、ImageScalerオブジェクトを使用して、既存のソフトウェア ビットマップ イメージ (softwareBitmap) のスケール (targetWidthtargetHeight) を変更し、シャープネスを向上させる方法を示しています (イメージのスケールを変更せずにシャープネスのみを向上させる場合は、既存のイメージの幅と高さを指定します)。

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

画像の説明文生成でできること

重要

現在、画像説明は中国で利用できません。

Windows App SDK の画像の説明 API は、画像に対するさまざまな種類のテキスト説明を生成できます。

次の種類のテキスト説明がサポートされています。

  • アクセシビリティ - アクセシビリティのニーズを持つユーザー向けの詳細な説明を提供します。
  • キャプション - 画像のキャプションに適した簡単な説明を提供します。 指定がない場合は、既定値が使用されます。
  • DetailedNarration - 詳細な説明を提供します。
  • OfficeCharts - グラフや図に適した説明を提供します。

これらの API は Machine Learning (ML) モデルを使用するため、テキストが画像を正しく説明していない場合、エラーが発生することがあります。 そのため、以下のシナリオにおける画像には、これらの API の使用はお勧めできません。

  • 画像にセンシティブな内容 (国旗、地図、地球儀、文化的シンボル、宗教的シンボルなど) が含まれる場合。不正確な説明により、論争を招く可能性があります。
  • 医療に関するアドバイスや診断、法的コンテンツ、財務文書など、正確な説明が不可欠な場合。

画像からテキスト説明を取得する

画像説明 API は、画像、必要なテキストの説明の種類 (省略可能)、有害な使用から保護するために使用するコンテンツ モデレーションのレベル (省略可能) を受け取ります。

次の例は、画像のテキスト説明を取得する方法を示しています。

Note

画像は 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 モデルを使用できます。 このローカル コンテンツ モデレーション モデルは、テキスト モデレーション用の Azure AI Content Safety モデル に基づいており、同様のパフォーマンスを発揮します。

重要

コンテンツの安全性システムは完璧ではなく、エラーが発生することがありますので、補助的な責任あるAI (RAI)ツールと実践を統合することをお勧めします。 詳細については、「Windows での責任ある生成 AI 開発」をご覧ください。