Partager via


DML_ROI_ALIGN1_OPERATOR_DESC structure (directml.h)

Effectue une opération d’alignement du retour sur investissement, comme décrit dans le document Mask R-CNN . En résumé, l’opération extrait les fenêtres rognées du tenseur d’image d’entrée et les redimensionne à une taille de sortie commune spécifiée par les 2 dernières dimensions de OutputTensor à l’aide de l’InterpolationMode spécifié.

La logique générale est la suivante.

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

Calculez toutes les valeurs de sortie pour la région actuelle comme suit.

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

Calculez chaque exemple d’entrée pour l’élément de sortie comme suit.

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

Exemples

Exemples d’alignement du retour sur investissement

Syntaxe

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

Membres

InputTensor

Type : const DML_TENSOR_DESC*

Tenseur contenant les données d’entrée avec des dimensions { BatchCount, ChannelCount, InputHeight, InputWidth }.

ROITensor

Type : const DML_TENSOR_DESC*

Un tenseur contenant les données de régions d’intérêt (ROI), une série de cadres englobants en coordonnées à virgule flottante qui pointent dans les dimensions X et Y du tenseur d’entrée. Les dimensions autorisées de ROITensor sont { NumROIs, 4 }, { 1, NumROIs, 4 }ou { 1, 1, NumROIs, 4 }. Pour chaque retour sur investissement, les valeurs sont les coordonnées de ses coins supérieurs gauche et inférieur droit dans l’ordre [x1, y1, x2, y2]. Les régions peuvent être vides, ce qui signifie que tous les pixels de sortie proviennent de la coordonnée d’entrée unique, et les régions peuvent être inversées (par exemple, x2 inférieur à x1), ce qui signifie que la sortie reçoit une version mise en miroir/retournée de l’entrée. Ces coordonnées sont d’abord mises à l’échelle par SpatialScaleX et SpatialScaleY, mais si elles sont toutes deux 1.0, les rectangles de région correspondent simplement directement aux coordonnées tensoriels d’entrée.

BatchIndicesTensor

Type : const DML_TENSOR_DESC*

Tenseur contenant les index de lot à partir desquels extraire les ROI. Les dimensions autorisées de BatchIndicesTensor sont { NumROIs }, { 1, NumROIs }, { 1, 1, NumROIs }ou { 1, 1, 1, NumROIs }. Chaque valeur est l’index d’un lot d’InputTensor. Le comportement n’est pas défini si les valeurs ne se trouvent pas dans la plage [0, BatchCount).

OutputTensor

Type : const DML_TENSOR_DESC*

Tenseur contenant les données de sortie. Les dimensions attendues de OutputTensor sont { NumROIs, ChannelCount, OutputHeight, OutputWidth }.

ReductionFunction

Type : DML_REDUCE_FUNCTION

Fonction de réduction à utiliser lors de la réduction de tous les échantillons d’entrée qui contribuent à un élément de sortie (DML_REDUCE_FUNCTION_AVERAGE ou DML_REDUCE_FUNCTION_MAX). Le nombre d’exemples d’entrée à réduire est limité par MinimumSamplesPerOutput et MaximumSamplesPerOutput.

InterpolationMode

Type : DML_INTERPOLATION_MODE

Mode d’interpolation à utiliser lors du redimensionnement des régions.

  • DML_INTERPOLATION_MODE_NEAREST_NEIGHBOR. Utilise l’algorithme nighbor le plus proche , qui choisit l’élément d’entrée le plus proche du centre de pixels correspondant pour chaque élément de sortie.
  • DML_INTERPOLATION_MODE_LINEAR. Utilise l’algorithme bilinéaire , qui calcule l’élément de sortie en effectuant la moyenne pondérée des 2 éléments d’entrée voisins les plus proches par dimension. Étant donné que seules 2 dimensions sont redimensionnées, la moyenne pondérée est calculée sur un total de 4 éléments d’entrée pour chaque élément de sortie.

SpatialScaleX

Type : FLOAT

Composant X (ou largeur) du facteur de mise à l’échelle pour multiplier les coordonnées ROITensor par afin de les rendre proportionnelles à InputHeight et InputWidth. Par exemple, si ROITensor contient des coordonnées normalisées (valeurs dans la plage [0..1]), SpatialScaleX a généralement la même valeur que InputWidth.

SpatialScaleY

Type : FLOAT

Composant Y (ou height) du facteur de mise à l’échelle pour multiplier les coordonnées ROITensor par afin de les rendre proportionnelles à InputHeight et InputWidth. Par exemple, si ROITensor contient des coordonnées normalisées (valeurs dans la plage [0..1]), SpatialScaleY a généralement la même valeur que InputHeight.

InputPixelOffset

Type : FLOAT

Décalage entre (0,0) les coordonnées d’entrée et le centre du pixel en haut à gauche, généralement 0 ou 0,5. Lorsque cette valeur est 0, le coin supérieur gauche du pixel est utilisé à la place de son centre, ce qui ne donne généralement pas le résultat attendu, mais est utile pour la compatibilité avec certains frameworks. Lorsque cette valeur est 0,5, les pixels sont traités comme étant au centre, ce qui correspond au même comportement que DML_ROI_ALIGN_OPERATOR_DESC.

OutputPixelOffset

Type : FLOAT

Décalage entre le centre du pixel supérieur gauche et (0,0) les coordonnées de sortie, généralement 0 ou -0,5. Lorsque cette valeur est 0, le coin supérieur gauche du pixel est utilisé à la place de son centre, ce qui ne donne généralement pas le résultat attendu, mais est utile pour la compatibilité avec certains frameworks. Lorsque cette valeur est -0,5, les pixels sont traités comme étant au centre, ce qui correspond au même comportement que DML_ROI_ALIGN_OPERATOR_DESC.

OutOfBoundsInputValue

Type : FLOAT

Valeur à lire à partir d’InputTensor lorsque les ROIs sont en dehors des limites de InputTensor. Cela peut se produire lorsque les valeurs obtenues après la mise à l’échelle de ROITensor par SpatialScaleX et SpatialScaleY sont supérieures à InputWidth et InputHeight.

MinimumSamplesPerOutput

Type : UINT

Nombre minimal d’exemples d’entrée à utiliser pour chaque élément de sortie. L’opérateur calcule le nombre d’échantillons d’entrée en effectuant ScaledCropSize / OutputSize, puis en le serrant sur MinimumSamplesPerOutput et MaximumSamplesPerOutput.

MaximumSamplesPerOutput

Type : UINT

Nombre maximal d’exemples d’entrée à utiliser pour chaque élément de sortie. L’opérateur calcule le nombre d’échantillons d’entrée en effectuant ScaledCropSize / OutputSize, puis en le serrant sur MinimumSamplesPerOutput et MaximumSamplesPerOutput.

AlignRegionsToCorners

Type : BOOL

Les points d’échantillon de sortie dans chaque région doivent être étendus jusqu’aux coins de la région au lieu d’être répartis uniformément au sein de la région. La valeur par défaut est FALSE, qui est le même comportement que DML_ROI_ALIGN_OPERATOR_DESC.

Remarques

Disponibilité

Cet opérateur a été introduit dans DML_FEATURE_LEVEL_4_0.

Contraintes tensoriels

InputTensor, OutputTensor et ROITensor doivent avoir le même DataType.

Prise en charge des tenseurs

DML_FEATURE_LEVEL_5_0 et versions ultérieures

Tenseur Type Nombre de dimensions pris en charge Types de données pris en charge
InputTensor Entrée 4 FLOAT32, FLOAT16
ROITensor Entrée 2 à 4 FLOAT32, FLOAT16
BatchIndicesTensor Entrée 1 à 4 UINT64, UINT32
OutputTensor Output 4 FLOAT32, FLOAT16

DML_FEATURE_LEVEL_4_0 et versions ultérieures

Tenseur Type Nombre de dimensions pris en charge Types de données pris en charge
InputTensor Entrée 4 FLOAT32, FLOAT16
ROITensor Entrée 2 à 4 FLOAT32, FLOAT16
BatchIndicesTensor Entrée 1 à 4 UINT32
OutputTensor Output 4 FLOAT32, FLOAT16

Configuration requise

   
Client minimal pris en charge Windows Build 22000
Serveur minimal pris en charge Windows Build 22000
En-tête directml.h