Windows アプリ SDKでの AI イメージングの概要
重要
この機能はまだ使用できません。 Windows アプリ SDKの今後の体験チャネルリリースで出荷される予定です。
Windows アプリ SDK の実験的チャネルには、開発の初期段階にある API と機能が含まれています。 実験用チャネル内のすべての API は、広範な変更と破壊的変更の対象となり、今後のリリースからいつでも削除される可能性があります。 これらは運用環境での使用ではサポートされていません。また、実験的機能を使用するアプリを Microsoft Store に公開することはできません。
イメージング機能は、画像のスケーリングとシャープ化 (画像のスーパー解像度) と画像内のオブジェクトの識別 (画像のセグメント化) の両方が可能な一連の人工知能 (AI) に基づく API を通じて、Windows アプリ SDKによってサポートされます。
API の詳細については、Windows アプリ SDKの AI ベースのイメージング機能のAPI リファレンスを参照してください。
ヒント
Windows アプリ SDK GitHub リポジトリに新しい Issue を作成して、これらの API とその機能に関するフィードバックを提供します。 (タイトルに Imaging を含めるようにしてください!)
前提条件
- CoPilot+ PC
Note
AMD ベースの CoPilot+ PC では、イメージのスーパー解像度はサポートされていません。
Windows アプリ SDKと画像のスーパー解像度で何ができますか?
Windows アプリ SDKの新しい AI Image Super Resolution 機能を使用して、イメージをシャープにし、イメージをスケーリングしながら鮮明にします。
Note
スケーリングは最大 8 倍に縮小されます (スケール ファクターが高いほど、アーティファクトが発生し、画像の精度が損なわれる可能性があります)。 最終的な幅または高さが元の値の 8 倍を超える場合は、例外がスローされます。
画像の鮮明度を上げる
この例では、既存のソフトウェア ビットマップ イメージ (targetWidth
) のスケール (targetHeight
、softwareBitmap
) を変更し、そのシャープネスを向上させる方法を示します (イメージを拡大縮小せずにシャープネスを向上させる場合は、元のイメージの幅と高さを指定します)。
- 最初に、IsAvailable メソッドを呼び出し、MakeAvailableAsync メソッドが正常に返されるのを待って、Image Super Resolution モデルを使用できることを確認します。
- イメージスーパー解像度モデルが使用可能になったら、それを参照するオブジェクトを作成します。
- 次に、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 は 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}
},
{},
{}
);