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*

包含要从中提取 ROIs 的批处理索引的张量。 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

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

当 ROI 超出 InputTensor 边界时从 InputTensor 读取的值。 当 SpatialScaleXSpatialScaleY 缩放 ROITensor 后获取的值大于 InputWidthInputHeight 时,可能会发生这种情况。

MinimumSamplesPerOutput

类型: UINT

要用于每个输出元素的最小输入样本数。 运算符将通过执行 ScaledCropSize / OutputSize 计算输入样本数,然后将其固定为 MinimumSamplesPerOutputMaximumSamplesPerOutput

MaximumSamplesPerOutput

类型: UINT

要用于每个输出元素的最大输入样本数。 运算符将通过执行 ScaledCropSize / OutputSize 计算输入样本数,然后将其固定为 MinimumSamplesPerOutputMaximumSamplesPerOutput

AlignRegionsToCorners

类型: BOOL

每个区域中的输出示例点应伸展到该区域的各角落,而不是均匀分布在该区域内。 默认值为 FALSE,这与 DML_ROI_ALIGN_OPERATOR_DESC 的行为相同。

备注

可用性

此运算符是在 DML_FEATURE_LEVEL_4_0 中引入

张量约束

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