共用方式為


DML_ROI_ALIGN1_OPERATOR_DESC結構 (directml.h)

執行 ROI 對齊作業,如 遮罩 R-CNN 白皮書中所述。 總而言之,作業會從輸入影像張量擷取裁剪的視窗,並使用指定的InterpolationMode,將它們調整為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*

包含要從中擷取 RO 的批次索引的張量。 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_AVERAGEDML_REDUCE_FUNCTION_MAX) 。 要減少的輸入樣本數目會受限於 MinimumSamplesPerOutputMaximumSamplesPerOutput

InterpolationMode

類型: DML_INTERPOLATION_MODE

調整區域大小時要使用的插補模式。

  • DML_INTERPOLATION_MODE_NEAREST_NEIGHBOR。 使用 最接近 nighbor 演算法,它會為每個輸出元素選擇最接近對應圖元中心的輸入元素。
  • DML_INTERPOLATION_MODE_LINEAR。 使用 雙向演算法 ,其會執行每個維度 2 個最接近之輸入元素的加權平均值,以計算輸出元素。 由於只有 2 個維度會調整大小,因此加權平均會以每個輸出元素的總 4 個輸入元素計算。

SpatialScaleX

類型: FLOAT

縮放比例的 X (或寬度) 元件,以將 ROITensor 座標乘以 ,使其與 InputHeightInputWidth成比例。 例如,如果 ROITensor 包含標準化座標 (範圍 [0..1] 中的值) , SpatialScaleX 通常會有與 InputWidth相同的值。

SpatialScaleY

類型: FLOAT

縮放比例的 Y (或高度) 元件,以將 ROITensor 座標乘以 ,使其與 InputHeightInputWidth成比例。 例如,如果 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

當 RO 超出 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中引進。

Tensor 條件約束

InputTensorOutputTensorROITensor 必須具有相同 的 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