Compartilhar via


estrutura DML_ROI_ALIGN1_OPERATOR_DESC (directml.h)

Executa uma operação de alinhamento ROI, conforme descrito no artigo Mascarar R-CNN . Em resumo, a operação extrai janelas cortadas do tensor de imagem de entrada e as redimensiona para um tamanho de saída comum especificado pelas duas últimas dimensões de OutputTensor usando o InterpolationMode especificado.

A lógica geral é a seguinte.

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

Compute todos os valores de saída para a região atual da seguinte maneira.

for every output tensor element x y and channel in the region
    outputValue = getOutputValue(channel, outputTensorX, outputTensorY)
    OutputTensor[roiIndex, channel, outputTensorY, outputTensorX] = outputValue
endfor

Compute cada exemplo de entrada para o elemento de saída da seguinte maneira.

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

Exemplos

Exemplos de alinhamento roi

Sintaxe

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;
};

Membros

InputTensor

Tipo: const DML_TENSOR_DESC*

Um tensor que contém os dados de entrada com dimensões { BatchCount, ChannelCount, InputHeight, InputWidth }.

ROITensor

Tipo: const DML_TENSOR_DESC*

Um tensor que contém os dados de ROI (regiões de interesse), uma série de caixas delimitadoras em coordenadas de ponto flutuante que apontam para as dimensões X e Y do tensor de entrada. As dimensões permitidas de ROITensor são { NumROIs, 4 }, { 1, NumROIs, 4 }ou { 1, 1, NumROIs, 4 }. Para cada ROI, os valores serão as coordenadas de seus cantos superior esquerdo e inferior direito na ordem [x1, y1, x2, y2]. As regiões podem estar vazias, o que significa que todos os pixels de saída vêm da coordenada de entrada única e as regiões podem ser invertidas (por exemplo, x2 menos que x1), o que significa que a saída recebe uma versão espelhada/invertida da entrada. Essas coordenadas são dimensionadas primeiro por SpatialScaleX e SpatialScaleY, mas se ambas forem 1,0, os retângulos de região simplesmente corresponderão diretamente às coordenadas do tensor de entrada.

BatchIndicesTensor

Tipo: const DML_TENSOR_DESC*

Um tensor que contém os índices de lote dos quais extrair os ROIs. As dimensões permitidas de BatchIndicesTensor são { NumROIs }, { 1, NumROIs }, { 1, 1, NumROIs }ou { 1, 1, 1, NumROIs }. Cada valor é o índice de um lote de InputTensor. O comportamento será indefinido se os valores não estiverem no intervalo [0, BatchCount).

OutputTensor

Tipo: const DML_TENSOR_DESC*

Um tensor que contém os dados de saída. As dimensões esperadas de OutputTensor são { NumROIs, ChannelCount, OutputHeight, OutputWidth }.

ReductionFunction

Tipo: DML_REDUCE_FUNCTION

A função de redução a ser usada ao reduzir todos os exemplos de entrada que contribuem para um elemento de saída (DML_REDUCE_FUNCTION_AVERAGE ou DML_REDUCE_FUNCTION_MAX). O número de exemplos de entrada a serem reduzidos é limitado por MinimumSamplesPerOutput e MaximumSamplesPerOutput.

InterpolationMode

Tipo: DML_INTERPOLATION_MODE

O modo de interpolação a ser usado ao redimensionar as regiões.

  • DML_INTERPOLATION_MODE_NEAREST_NEIGHBOR. Usa o algoritmo nighbor mais próximo , que escolhe o elemento de entrada mais próximo do centro de pixel correspondente para cada elemento de saída.
  • DML_INTERPOLATION_MODE_LINEAR. Usa o algoritmo bilinear , que calcula o elemento de saída fazendo a média ponderada dos 2 elementos de entrada vizinhos mais próximos por dimensão. Como apenas duas dimensões são redimensionadas, a média ponderada é calculada em um total de 4 elementos de entrada para cada elemento de saída.

SpatialScaleX

Tipo: FLOAT

O componente X (ou largura) do fator de dimensionamento para multiplicar as coordenadas ROITensor por para torná-las proporcionais a InputHeight e InputWidth. Por exemplo, se ROITensor contiver coordenadas normalizadas (valores no intervalo [0..1]), SpatialScaleX normalmente teria o mesmo valor que InputWidth.

SpatialScaleY

Tipo: FLOAT

O componente Y (ou altura) do fator de dimensionamento para multiplicar as coordenadas ROITensor por para torná-las proporcionais a InputHeight e InputWidth. Por exemplo, se ROITensor contiver coordenadas normalizadas (valores no intervalo [0..1]), SpatialScaleY normalmente teria o mesmo valor que InputHeight.

InputPixelOffset

Tipo: FLOAT

O deslocamento das coordenadas de (0,0) entrada para o centro de pixels superior esquerdo, normalmente 0 ou 0,5. Quando esse valor é 0, o canto superior esquerdo do pixel é usado em vez de seu centro, o que geralmente não fornece o resultado esperado, mas é útil para compatibilidade com algumas estruturas. Quando esse valor é 0,5, os pixels são tratados como sendo no centro, que é o mesmo comportamento que DML_ROI_ALIGN_OPERATOR_DESC.

OutputPixelOffset

Tipo: FLOAT

O deslocamento do centro de pixels superior esquerdo para (0,0) as coordenadas de saída, normalmente 0 ou -0,5. Quando esse valor é 0, o canto superior esquerdo do pixel é usado em vez de seu centro, o que geralmente não fornece o resultado esperado, mas é útil para compatibilidade com algumas estruturas. Quando esse valor é -0,5, os pixels são tratados como sendo no centro, que é o mesmo comportamento que DML_ROI_ALIGN_OPERATOR_DESC.

OutOfBoundsInputValue

Tipo: FLOAT

O valor a ser lido de InputTensor quando os ROIs estiverem fora dos limites de InputTensor. Isso pode acontecer quando os valores obtidos após o dimensionamento de ROITensor por SpatialScaleX e SpatialScaleY são maiores que InputWidth e InputHeight.

MinimumSamplesPerOutput

Tipo: UINT

O número mínimo de exemplos de entrada a serem usados para cada elemento de saída. O operador calculará o número de amostras de entrada fazendo ScaledCropSize / OutputSize e, em seguida, a fixará em MinimumSamplesPerOutput e MaximumSamplesPerOutput.

MaximumSamplesPerOutput

Tipo: UINT

O número máximo de amostras de entrada a serem usadas para cada elemento de saída. O operador calculará o número de amostras de entrada fazendo ScaledCropSize / OutputSize e, em seguida, a fixará em MinimumSamplesPerOutput e MaximumSamplesPerOutput.

AlignRegionsToCorners

Tipo: BOOL

Os pontos de exemplo de saída em cada região devem ser estendidos até os cantos da região, em vez de se espalharem uniformemente dentro da região. O valor padrão é FALSE, que é o mesmo comportamento que DML_ROI_ALIGN_OPERATOR_DESC.

Comentários

Disponibilidade

Esse operador foi introduzido no DML_FEATURE_LEVEL_4_0.

Restrições do Tensor

InputTensor, OutputTensor e ROITensor devem ter o mesmo DataType.

Suporte ao Tensor

DML_FEATURE_LEVEL_5_0 e superior

Tensor Tipo Contagens de dimensões com suporte Tipos de dados com suporte
InputTensor Entrada 4 FLOAT32, FLOAT16
ROITensor Entrada 2 a 4 FLOAT32, FLOAT16
BatchIndicesTensor Entrada 1 a 4 UINT64, UINT32
OutputTensor Saída 4 FLOAT32, FLOAT16

DML_FEATURE_LEVEL_4_0 e superior

Tensor Tipo Contagens de dimensões com suporte Tipos de dados com suporte
InputTensor Entrada 4 FLOAT32, FLOAT16
ROITensor Entrada 2 a 4 FLOAT32, FLOAT16
BatchIndicesTensor Entrada 1 a 4 UINT32
OutputTensor Saída 4 FLOAT32, FLOAT16

Requisitos

   
Cliente mínimo com suporte Windows Build 22000
Servidor mínimo com suporte Windows Build 22000
Cabeçalho directml.h