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
示例
语法
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*
包含要从中提取 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_AVERAGE或DML_REDUCE_FUNCTION_MAX) 的输出元素的所有输入样本中减少时使用的缩减函数。 要减少的输入样本数由 MinimumSamplesPerOutput 和 MaximumSamplesPerOutput 限制。
InterpolationMode
调整区域大小时要使用的内插模式。
- DML_INTERPOLATION_MODE_NEAREST_NEIGHBOR。 使用 最接近的 nighbor 算法,该算法为每个输出元素选择最靠近相应像素中心的输入元素。
- DML_INTERPOLATION_MODE_LINEAR。 使用 双线性 算法,该算法通过执行每个维度 2 个最接近的相邻输入元素的加权平均值来计算输出元素。 由于只调整了 2 个维度的大小,因此加权平均值将针对每个输出元素总共 4 个输入元素进行计算。
SpatialScaleX
类型: FLOAT
X (或宽度) 比例因子的组件,以乘以 ROITensor 坐标,使它们与 InputHeight 和 InputWidth 成比例。 例如,如果 ROITensor 包含规范化坐标 () 范围内的 [0..1]
值,则 SpatialScaleX 通常具有与 InputWidth 相同的值。
SpatialScaleY
类型: FLOAT
缩放因子的 Y (或高度) 分量将 ROITensor 坐标乘以,使它们与 InputHeight 和 InputWidth 成比例。 例如,如果 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 读取的值。 当 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 |