estructura DML_ROI_ALIGN1_OPERATOR_DESC (directml.h)
Realiza una operación de alineación de ROI, como se describe en el documento Mask R-CNN . En resumen, la operación extrae ventanas recortadas del tensor de la imagen de entrada y las cambia a un tamaño de salida común especificado por las últimas 2 dimensiones de OutputTensor mediante el InterpolationMode especificado.
La lógica general es la siguiente.
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
Calcule todos los valores de salida de la región actual de la siguiente manera.
for every output tensor element x y and channel in the region
outputValue = getOutputValue(channel, outputTensorX, outputTensorY)
OutputTensor[roiIndex, channel, outputTensorY, outputTensorX] = outputValue
endfor
Calcule cada ejemplo de entrada para el elemento de salida como se indica a continuación.
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
Ejemplos
Sintaxis
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;
};
Miembros
InputTensor
Tipo: const DML_TENSOR_DESC*
Tensor que contiene los datos de entrada con dimensiones { BatchCount, ChannelCount, InputHeight, InputWidth }
.
ROITensor
Tipo: const DML_TENSOR_DESC*
Tensor que contiene las regiones de interés (ROI), una serie de cuadros de límite en coordenadas de punto flotante que apuntan a las dimensiones X e Y del tensor de entrada. Las dimensiones permitidas de ROITensor son { NumROIs, 4 }
, { 1, NumROIs, 4 }
o { 1, 1, NumROIs, 4 }
. Para cada ROI, los valores serán las coordenadas de sus esquinas superior izquierda e inferior derecha en el orden [x1, y1, x2, y2]
. Las regiones pueden estar vacías, lo que significa que todos los píxeles de salida proceden de la única coordenada de entrada y las regiones se pueden invertir (por ejemplo, x2 menos que x1), lo que significa que la salida recibe una versión reflejada o volteada de la entrada. Estas coordenadas se escalan primero mediante SpatialScaleX y SpatialScaleY, pero si son 1.0, los rectángulos de región simplemente se corresponden directamente con las coordenadas de tensor de entrada.
BatchIndicesTensor
Tipo: const DML_TENSOR_DESC*
Tensor que contiene los índices por lotes de los que se van a extraer las ROIs. Las dimensiones permitidas de BatchIndicesTensor son { NumROIs }
, { 1, NumROIs }
, { 1, 1, NumROIs }
o { 1, 1, 1, NumROIs }
. Cada valor es el índice de un lote de InputTensor. El comportamiento no está definido si los valores no están en el intervalo [0, BatchCount)
.
OutputTensor
Tipo: const DML_TENSOR_DESC*
Tensor que contiene los datos de salida. Las dimensiones esperadas de OutputTensor son { NumROIs, ChannelCount, OutputHeight, OutputWidth }
.
ReductionFunction
Tipo: DML_REDUCE_FUNCTION
Función de reducción que se va a usar al reducir en todas las muestras de entrada que contribuyen a un elemento de salida (DML_REDUCE_FUNCTION_AVERAGE o DML_REDUCE_FUNCTION_MAX). El número de muestras de entrada que se van a reducir está limitado por MinimumSamplesPerOutput y MaximumSamplesPerOutput.
InterpolationMode
Tipo: DML_INTERPOLATION_MODE
Modo de interpolación que se va a usar al cambiar el tamaño de las regiones.
- DML_INTERPOLATION_MODE_NEAREST_NEIGHBOR. Usa el algoritmo nighbor más cercano , que elige el elemento de entrada más cercano al centro de píxeles correspondiente para cada elemento de salida.
- DML_INTERPOLATION_MODE_LINEAR. Usa el algoritmo bilineal , que calcula el elemento de salida haciendo el promedio ponderado de los 2 elementos de entrada vecinos más cercanos por dimensión. Dado que solo se cambia el tamaño de 2 dimensiones, el promedio ponderado se calcula en un total de 4 elementos de entrada para cada elemento de salida.
SpatialScaleX
Tipo: FLOAT
Componente X (o ancho) del factor de escalado para multiplicar las coordenadas ROITensor por para que sean proporcionales a InputHeight y InputWidth. Por ejemplo, si ROITensor contiene coordenadas normalizadas (valores en el intervalo [0..1]
), SpatialScaleX normalmente tendría el mismo valor que InputWidth.
SpatialScaleY
Tipo: FLOAT
Componente Y (o alto) del factor de escalado para multiplicar las coordenadas ROITensor por para que sean proporcionales a InputHeight y InputWidth. Por ejemplo, si ROITensor contiene coordenadas normalizadas (valores en el intervalo [0..1]
), SpatialScaleY normalmente tendría el mismo valor que InputHeight.
InputPixelOffset
Tipo: FLOAT
Desplazamiento de (0,0)
las coordenadas de entrada al centro de píxeles superior izquierdo, normalmente 0 o 0,5. Cuando este valor es 0, se usa la esquina superior izquierda del píxel en lugar de su centro, que normalmente no dará el resultado esperado, pero es útil para la compatibilidad con algunos marcos. Cuando este valor es 0,5, los píxeles se tratan como en el centro, que es el mismo comportamiento que DML_ROI_ALIGN_OPERATOR_DESC.
OutputPixelOffset
Tipo: FLOAT
Desplazamiento desde el centro de píxeles superior izquierdo hasta (0,0)
las coordenadas de salida, normalmente 0 o -0,5. Cuando este valor es 0, se usa la esquina superior izquierda del píxel en lugar de su centro, que normalmente no dará el resultado esperado, pero es útil para la compatibilidad con algunos marcos. Cuando este valor es -0,5, los píxeles se tratan como en el centro, que es el mismo comportamiento que DML_ROI_ALIGN_OPERATOR_DESC.
OutOfBoundsInputValue
Tipo: FLOAT
Valor que se va a leer desde InputTensor cuando las ROIs están fuera de los límites de InputTensor. Esto puede ocurrir cuando los valores obtenidos después de escalar ROITensor por SpatialScaleX y SpatialScaleY son mayores que InputWidth y InputHeight.
MinimumSamplesPerOutput
Tipo: UINT
Número mínimo de muestras de entrada que se van a usar para cada elemento de salida. El operador calculará el número de muestras de entrada mediante ScaledCropSizeOutputSize / y, a continuación, lo sujetará a MinimumSamplesPerOutput y MaximumSamplesPerOutput.
MaximumSamplesPerOutput
Tipo: UINT
Número máximo de muestras de entrada que se van a usar para cada elemento de salida. El operador calculará el número de muestras de entrada mediante ScaledCropSizeOutputSize / y, a continuación, lo sujetará a MinimumSamplesPerOutput y MaximumSamplesPerOutput.
AlignRegionsToCorners
Tipo: BOOL
Los puntos de ejemplo de salida de cada región deben extenderse a las esquinas de la región en lugar de distribuirse uniformemente dentro de la región. El valor predeterminado es FALSE, que es el mismo comportamiento que DML_ROI_ALIGN_OPERATOR_DESC.
Observaciones
Disponibilidad
Este operador se introdujo en DML_FEATURE_LEVEL_4_0.
Restricciones tensor
InputTensor, OutputTensor y ROITensor deben tener el mismo DataType.
Compatibilidad con Tensor
DML_FEATURE_LEVEL_5_0 y versiones posteriores
Tensor | Kind | Recuentos de dimensiones admitidos | Tipos de datos admitidos |
---|---|---|---|
InputTensor | Entrada | 4 | FLOAT32, FLOAT16 |
ROITensor | Entrada | De 2 a 4 | FLOAT32, FLOAT16 |
BatchIndicesTensor | Entrada | De 1 a 4 | UINT64, UINT32 |
OutputTensor | Output | 4 | FLOAT32, FLOAT16 |
DML_FEATURE_LEVEL_4_0 y versiones posteriores
Tensor | Kind | Recuentos de dimensiones admitidos | Tipos de datos admitidos |
---|---|---|---|
InputTensor | Entrada | 4 | FLOAT32, FLOAT16 |
ROITensor | Entrada | De 2 a 4 | FLOAT32, FLOAT16 |
BatchIndicesTensor | Entrada | De 1 a 4 | UINT32 |
OutputTensor | Output | 4 | FLOAT32, FLOAT16 |
Requisitos
Cliente mínimo compatible | Windows Build 22000 |
Servidor mínimo compatible | Windows Build 22000 |
Encabezado | directml.h |