Image Object Extractor を使用して、イメージ内の特定のオブジェクトを識別できます。 モデルは、画像と "ヒント" オブジェクトの両方を受け取り、識別されたオブジェクトのマスクを返します。
API の詳細については、AI イメージング機能の API リファレンスを参照してください。
コンテンツ モデレーションの詳細については、「生成 AI API を使用したコンテンツの安全性」を参照してください。
Important
パッケージ マニフェストの要件: Windows AI イメージング API を使用するには、systemAIModelsで宣言されたPackage.appxmanifest機能を備えた MSIX パッケージとしてアプリをパッケージ化する必要があります。 さらに、マニフェストの MaxVersionTested 属性が最新の Windows バージョン ( 10.0.26226.0 以降など) に設定されていることを確認して、Windows AI 機能を適切にサポートします。 古い値を使用すると、モデルの読み込み時に "アプリによって宣言されていません" エラーが発生する可能性があります。
<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>
ヒントの提供
ヒントは、次の任意の組み合わせで提供できます。
- 識別対象に属するポイントの座標。
- 識別対象に属さないポイントの座標。
- 識別対象を囲む座標四角形。
提供するヒントが多いほど、モデルの精度が高くなります。 不正確な結果やエラーを最小限に抑えるには、次のヒントのガイドラインに従ってください。
- ヒントで複数の四角形を使用しないでください。不正確なマスクが生成される可能性があります。
- 包含ポイントまたは四角形を使用せずに、除外ポイントのみを使用することは避けてください。
- サポートされている最大 32 の座標 (ポイントの場合は 1、四角形の場合は 2) を超える座標を指定しないでください。この数を超えると、エラーが返されます。
返されるマスクはグレースケール 8 形式で、識別されたオブジェクトのマスクのピクセルの値は 255 です (その他の値はすべて 0)。
Image オブジェクト抽出の例
次の例は、画像内のオブジェクトを識別する方法を示しています。 この例では、入力用のソフトウェア ビットマップ オブジェクト (softwareBitmap) が既にあることを前提としています。
GetReadyState メソッドを呼び出し、EnsureReadyAsync メソッドが正常に返されるのを待って、イメージ オブジェクト抽出モデルを使用できることを確認します。
Image Object Extractor モデルが使用可能になったら、それを参照する ImageObjectExtractor オブジェクトを作成します。
イメージを CreateWithSoftwareBitmapAsync に渡します。
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}
},
{},
{}
);