次の方法で共有


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

ROI アラインメントの例

構文

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 より小さい)。つまり、出力はミラー化/反転されたバージョンの入力を受け取ります。 これらの座標は最初に SpatialScaleXSpatialScaleY によってスケーリングされますが、両方が 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

出力要素 (DML_REDUCE_FUNCTION_AVERAGE または DML_REDUCE_FUNCTION_MAX) に寄与するすべての入力サンプルを縮小するときに使用する減少関数。 全体で削減する入力サンプルの数は、 MinimumSamplesPerOutputMaximumSamplesPerOutput によって制限されます。

InterpolationMode

種類: DML_INTERPOLATION_MODE

領域のサイズを変更するときに使用する補間モード。

  • DML_INTERPOLATION_MODE_NEAREST_NEIGHBOR最も近い nighbor アルゴリズムを使用します。このアルゴリズムは、各出力要素の対応するピクセル中心に最も近い入力要素を選択します。
  • DML_INTERPOLATION_MODE_LINEAR二次アルゴリズムを使用します。これは、ディメンションごとに最も近い 2 つの入力要素の重み付け平均を実行して出力要素を計算します。 サイズが変更されるのは 2 つのディメンションだけなので、重み付け平均は出力要素ごとに合計 4 つの入力要素で計算されます。

SpatialScaleX

型: FLOAT

ROITensor 座標を InputHeightInputWidth に比例させるために、ROITensor 座標を乗算するスケーリング 係数の X (または幅) コンポーネント。 たとえば、 ROITensor に 正規化された座標 (範囲内 [0..1]の値) が含まれている場合、 SpatialScaleX は通常 、InputWidth と同じ値を持ちます。

SpatialScaleY

型: FLOAT

ROITensor 座標を InputHeightInputWidth に比例させるために、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 から読み取る値。 これは、SpatialScaleXSpatialScaleY によって ROITensor をスケーリングした後に取得された値が InputWidthInputHeight よりも大きい場合に発生する可能性があります。

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で導入されました。

テンソル制約

InputTensorOutputTensorおよび 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