Compartir a través de


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

Ejemplos de alineación de ROI

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