DML_ROI_ALIGN1_OPERATOR_DESC構造体 (directml.h)
R-CNN のマスクに関するページで説明されているように、ROI アライン操作を実行します。 要約すると、操作は入力イメージ テンソルからトリミングされたウィンドウを抽出し、指定された補間モードを使用して OutputTensor の最後の 2 次元で指定された共通の出力サイズにサイズ変更します。
一般的なロジックは次のとおりです。
for every region roiIndex
outputSizeX = OutputTensor.Sizes[3]
outputSizeY = OutputTensor.Sizes[2]
scaledRegionX1 = ROITensor[roiIndex, 0] * SpatialScaleX
scaledRegionY1 = ROITensor[roiIndex, 1] * SpatialScaleY
scaledRegionX2 = ROITensor[roiIndex, 2] * SpatialScaleX
scaledRegionY2 = ROITensor[roiIndex, 3] * SpatialScaleY
scaledRegionSizeX = scaledRegionX2 - scaledRegionX1
scaledRegionSizeY = scaledRegionY2 - scaledRegionY1
inputSamplesPerOutputSampleX = clamp(scaledRegionSizeX / outputSizeX, MinimumSamplesPerOutput, MaximumSamplesPerOutput)
inputSamplesPerOutputSampleY = clamp(scaledRegionSizeY / outputSizeY, MinimumSamplesPerOutput, MaximumSamplesPerOutput)
outputSampleSizeX = outputSizeX * inputSamplesPerOutputSampleX
outputSampleSizeY = outputSizeY * inputSamplesPerOutputSampleY
outputSampleToInputScaleX = scaledRegionSizeX / outputSampleSizeX
outputSampleToInputScaleY = scaledRegionSizeX / outputSampleSizeX
compute all output values
endfor
現在のリージョンのすべての出力値を次のように計算します。
for every output tensor element x y and channel in the region
outputValue = getOutputValue(channel, outputTensorX, outputTensorY)
OutputTensor[roiIndex, channel, outputTensorY, outputTensorX] = outputValue
endfor
出力要素の各入力サンプルを次のように計算します。
outputTensorSampleX = outputTensorX * inputSamplesPerOutputSampleX
outputTensorSampleY = outputTensorY * inputSamplesPerOutputSampleY
outputValue = 0
for sampleX from outputTensorSampleX to <= outputTensorSampleX + inputSamplesPerOutputSampleX
for sampleY from outputTensorSampleY to <= outputTensorSampleY + inputSamplesPerOutputSampleY
inputTensorX = (sampleX - OutputPixelOffset) * outputSampleToInputScaleX + scaledRegionX1 - InputPixelOffset
inputTensorY = (sampleY - OutputPixelOffset) * outputSampleToInputScaleY + scaledRegionY1 - InputPixelOffset
inputValue = interpolate2D(InputTensor, BatchIndicesTensor[roiIndex], channel, inputTensorX, inputTensorY)
outputValue = either average or maximum with inputValue
endfor
endfor
return outputValue
例
構文
struct DML_ROI_ALIGN1_OPERATOR_DESC {
const DML_TENSOR_DESC *InputTensor;
const DML_TENSOR_DESC *ROITensor;
const DML_TENSOR_DESC *BatchIndicesTensor;
const DML_TENSOR_DESC *OutputTensor;
DML_REDUCE_FUNCTION ReductionFunction;
DML_INTERPOLATION_MODE InterpolationMode;
FLOAT SpatialScaleX;
FLOAT SpatialScaleY;
FLOAT InputPixelOffset;
FLOAT OutputPixelOffset;
FLOAT OutOfBoundsInputValue;
UINT MinimumSamplesPerOutput;
UINT MaximumSamplesPerOutput;
BOOL AlignRegionsToCorners;
};
メンバー
InputTensor
型: const DML_TENSOR_DESC*
ディメンション { BatchCount, ChannelCount, InputHeight, InputWidth }
を持つ入力データを含むテンソル。
ROITensor
型: const DML_TENSOR_DESC*
関心領域 (ROI) データを含むテンソル。入力テンソルの X 次元と Y 次元を指す浮動小数点座標の一連の境界ボックス。 ROITensor で使用できるディメンションは、{ NumROIs, 4 }
、{ 1, NumROIs, 4 }
、または です{ 1, 1, NumROIs, 4 }
。 各 ROI の値は、左上隅と右下隅の順序 [x1, y1, x2, y2]
の座標になります。 領域は空の場合があります。つまり、すべての出力ピクセルは単一の入力座標から取得され、領域は反転できます (たとえば、x2 は x1 より小さい)。つまり、出力はミラー化/反転されたバージョンの入力を受け取ります。 これらの座標は最初に SpatialScaleX と SpatialScaleY によってスケーリングされますが、両方が 1.0 の場合、領域の四角形は入力テンソル座標に直接対応します。
BatchIndicesTensor
型: const DML_TENSOR_DESC*
ROI を抽出するバッチ インデックスを含むテンソル。 BatchIndicesTensor で使用できるディメンションは、{ NumROIs }
、{ 1, NumROIs }
、{ 1, 1, NumROIs }
、または { 1, 1, 1, NumROIs }
です。 各値は、 InputTensor からのバッチのインデックスです。 値が の範囲内 [0, BatchCount)
にない場合、動作は未定義です。
OutputTensor
型: const DML_TENSOR_DESC*
出力データを含むテンソル。 OutputTensor の予想されるディメンションは です{ NumROIs, ChannelCount, OutputHeight, OutputWidth }
。
ReductionFunction
出力要素 (DML_REDUCE_FUNCTION_AVERAGE または DML_REDUCE_FUNCTION_MAX) に寄与するすべての入力サンプルを縮小するときに使用する減少関数。 全体で削減する入力サンプルの数は、 MinimumSamplesPerOutput と MaximumSamplesPerOutput によって制限されます。
InterpolationMode
領域のサイズを変更するときに使用する補間モード。
- DML_INTERPOLATION_MODE_NEAREST_NEIGHBOR。 最も近い nighbor アルゴリズムを使用します。このアルゴリズムは、各出力要素の対応するピクセル中心に最も近い入力要素を選択します。
- DML_INTERPOLATION_MODE_LINEAR。 二次アルゴリズムを使用します。これは、ディメンションごとに最も近い 2 つの入力要素の重み付け平均を実行して出力要素を計算します。 サイズが変更されるのは 2 つのディメンションだけなので、重み付け平均は出力要素ごとに合計 4 つの入力要素で計算されます。
SpatialScaleX
型: FLOAT
ROITensor 座標を InputHeight と InputWidth に比例させるために、ROITensor 座標を乗算するスケーリング 係数の X (または幅) コンポーネント。 たとえば、 ROITensor に 正規化された座標 (範囲内 [0..1]
の値) が含まれている場合、 SpatialScaleX は通常 、InputWidth と同じ値を持ちます。
SpatialScaleY
型: FLOAT
ROITensor 座標を InputHeight と InputWidth に比例させるために、ROITensor 座標を乗算するスケーリング 係数の Y (または高さ) コンポーネント。 たとえば、 ROITensor に 正規化された座標 (範囲内 [0..1]
の値) が含まれている場合、 SpatialScaleY は通常 、InputHeight と同じ値を持ちます。
InputPixelOffset
型: FLOAT
入力座標から (0,0)
左上のピクセル中心までのオフセット (通常は 0 または 0.5)。 この値が 0 の場合、ピクセルの左上隅は中央ではなく使用されます。通常は期待される結果は得られませんが、一部のフレームワークとの互換性に役立ちます。 この値が 0.5 の場合、ピクセルは中央にあるものとして扱われます。これは、 DML_ROI_ALIGN_OPERATOR_DESCと同じ動作です。
OutputPixelOffset
型: FLOAT
左上のピクセルの中心から出力座標までの (0,0)
オフセット (通常は 0 または -0.5)。 この値が 0 の場合、ピクセルの左上隅は中央ではなく使用されます。通常は期待される結果は得られませんが、一部のフレームワークとの互換性に役立ちます。 この値が -0.5 の場合、ピクセルは中央にあるものとして扱われます。これは、 DML_ROI_ALIGN_OPERATOR_DESCと同じ動作です。
OutOfBoundsInputValue
型: FLOAT
ROIs が InputTensor の境界外にある場合に InputTensor から読み取る値。 これは、SpatialScaleX と SpatialScaleY によって ROITensor をスケーリングした後に取得された値が InputWidth と InputHeight よりも大きい場合に発生する可能性があります。
MinimumSamplesPerOutput
型: UINT
すべての出力要素に使用する入力サンプルの最小数。 演算子は、 ScaledCropSize / OutputSize を実行し、 それを MinimumSamplesPerOutput と MaximumSamplesPerOutput にクランプすることで、入力サンプルの数 を計算します。
MaximumSamplesPerOutput
型: UINT
すべての出力要素に使用する入力サンプルの最大数。 演算子は、 ScaledCropSize / OutputSize を実行し、 それを MinimumSamplesPerOutput と MaximumSamplesPerOutput にクランプすることで、入力サンプルの数 を計算します。
AlignRegionsToCorners
種類: BOOL
各リージョンの出力サンプル ポイントは、リージョン内で均等に広がるのではなく、領域の隅にストレッチする必要があります。 既定値は FALSE で、 DML_ROI_ALIGN_OPERATOR_DESCと同じ動作です。
解説
可用性
この演算子は 、DML_FEATURE_LEVEL_4_0で導入されました。
テンソル制約
InputTensor、 OutputTensor、 および ROITensor は、同じ DataType を持つ必要があります。
Tensor のサポート
DML_FEATURE_LEVEL_5_0以上
テンソル | 種類 | サポートされているディメンション数 | サポートされるデータ型 |
---|---|---|---|
InputTensor | 入力 | 4 | FLOAT32、FLOAT16 |
ROITensor | 入力 | 2 から 4 | FLOAT32、FLOAT16 |
BatchIndicesTensor | 入力 | 1 から 4 | UINT64、UINT32 |
OutputTensor | 出力 | 4 | FLOAT32、FLOAT16 |
DML_FEATURE_LEVEL_4_0以上
テンソル | 種類 | サポートされているディメンション数 | サポートされるデータ型 |
---|---|---|---|
InputTensor | 入力 | 4 | FLOAT32、FLOAT16 |
ROITensor | 入力 | 2 から 4 | FLOAT32、FLOAT16 |
BatchIndicesTensor | 入力 | 1 から 4 | UINT32 |
OutputTensor | 出力 | 4 | FLOAT32、FLOAT16 |
要件
サポートされている最小のクライアント | Windows ビルド 22000 |
サポートされている最小のサーバー | Windows ビルド 22000 |
ヘッダー | directml.h |