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