DML_ROI_ALIGN1_OPERATOR_DESC struttura (directml.h)
Esegue un'operazione di allineamento roi, come descritto nel documento Mask R-CNN . In riepilogo, l'operazione estrae finestre ritagliate dal tensore dell'immagine di input e le ridimensiona in una dimensione di output comune specificata dall'ultima 2 dimensioni di OutputTensor usando interpolazioneMode specificata.
La logica generale è la seguente.
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
Calcolare tutti i valori di output per l'area corrente come indicato di seguito.
for every output tensor element x y and channel in the region
outputValue = getOutputValue(channel, outputTensorX, outputTensorY)
OutputTensor[roiIndex, channel, outputTensorY, outputTensorX] = outputValue
endfor
Calcolare ogni esempio di input per l'elemento di output come indicato di seguito.
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
Esempio
Sintassi
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;
};
Members
InputTensor
Tipo: const DML_TENSOR_DESC*
Tensore contenente i dati di input con dimensioni { BatchCount, ChannelCount, InputHeight, InputWidth }
.
ROITensor
Tipo: const DML_TENSOR_DESC*
Tensore contenente le aree di dati di interesse (ROI), una serie di caselle di selezione in coordinate a virgola mobile che puntano alle dimensioni X e Y del tensore di input. Le dimensioni consentite di ROITensor sono { NumROIs, 4 }
, { 1, NumROIs, 4 }
o { 1, 1, NumROIs, 4 }
. Per ogni ROI, i valori saranno le coordinate degli angoli in alto a sinistra e in basso a destra nell'ordine [x1, y1, x2, y2]
. Le aree possono essere vuote, ovvero tutti i pixel di output provengono dalla singola coordinata di input e le aree possono essere invertite (ad esempio, x2 meno di x1), significa che l'output riceve una versione con mirroring/capovolto dell'input. Queste coordinate vengono prima ridimensionate da SpatialScaleX e SpatialScaleY, ma se sono entrambe 1.0, i rettangoli di area corrispondono semplicemente direttamente alle coordinate del tensore di input.
BatchIndicesTensor
Tipo: const DML_TENSOR_DESC*
Tensor contenente gli indici batch da cui estrarre le ROI. Le dimensioni consentite di BatchIndicesTensor sono { NumROIs }
, , { 1, NumROIs }
{ 1, 1, NumROIs }
o { 1, 1, 1, NumROIs }
. Ogni valore è l'indice di un batch da InputTensor. Il comportamento non è definito se i valori non si trovano nell'intervallo [0, BatchCount)
.
OutputTensor
Tipo: const DML_TENSOR_DESC*
Tensor contenente i dati di output. Le dimensioni previste di OutputTensor sono { NumROIs, ChannelCount, OutputHeight, OutputWidth }
.
ReductionFunction
Tipo: DML_REDUCE_FUNCTION
Funzione di riduzione da usare quando si riduce in tutti gli esempi di input che contribuiscono a un elemento di output (DML_REDUCE_FUNCTION_AVERAGE o DML_REDUCE_FUNCTION_MAX). Il numero di esempi di input da ridurre è limitato da MinimumSamplesPerOutput e MaximumSamplesPerOutput.
InterpolationMode
Tipo: DML_INTERPOLATION_MODE
Modalità di interpolazione da usare quando si ridimensionano le aree.
- DML_INTERPOLATION_MODE_NEAREST_NEIGHBOR. Usa l'algoritmo nighbor più vicino , che sceglie l'elemento di input più vicino al centro pixel corrispondente per ogni elemento di output.
- DML_INTERPOLATION_MODE_LINEAR. Usa l'algoritmo bilinear , che calcola l'elemento di output eseguendo la media ponderata dei 2 elementi di input vicini più vicini per dimensione. Poiché vengono ridimensionate solo 2 dimensioni, la media ponderata viene calcolata su un totale di 4 elementi di input per ogni elemento di output.
SpatialScaleX
Tipo: FLOAT
Componente X (o larghezza) del fattore di ridimensionamento per moltiplicare le coordinate ROITensor per renderle proporzionali a InputHeight e InputWidth. Ad esempio, se ROITensor contiene coordinate normalizzate (valori nell'intervallo [0..1]
), SpatialScaleX in genere avrà lo stesso valore di InputWidth.
SpatialScaleY
Tipo: FLOAT
Componente Y (o altezza) del fattore di ridimensionamento per moltiplicare le coordinate ROITensor per renderle proporzionali a InputHeight e InputWidth. Ad esempio, se ROITensor contiene coordinate normalizzate (valori nell'intervallo [0..1]
), SpatialScaleY in genere avrà lo stesso valore di InputHeight.
InputPixelOffset
Tipo: FLOAT
Offset dalle (0,0)
coordinate di input al centro pixel superiore sinistro, in genere 0 o 0,5. Quando questo valore è 0, l'angolo superiore sinistro del pixel viene usato anziché il relativo centro, che in genere non darà il risultato previsto, ma è utile per la compatibilità con alcuni framework. Quando questo valore è 0,5, i pixel vengono trattati come al centro, ovvero lo stesso comportamento di DML_ROI_ALIGN_OPERATOR_DESC.
OutputPixelOffset
Tipo: FLOAT
Offset dal centro pixel superiore sinistro alle (0,0)
coordinate di output, in genere 0 o -0,5. Quando questo valore è 0, l'angolo superiore sinistro del pixel viene usato anziché il relativo centro, che in genere non darà il risultato previsto, ma è utile per la compatibilità con alcuni framework. Quando questo valore è -0,5, i pixel vengono considerati al centro, ovvero lo stesso comportamento di DML_ROI_ALIGN_OPERATOR_DESC.
OutOfBoundsInputValue
Tipo: FLOAT
Valore da leggere da InputTensor quando le RO sono esterne ai limiti di InputTensor. Ciò può verificarsi quando i valori ottenuti dopo il ridimensionamento di ROITensor by SpatialScaleX e SpatialScaleY sono più grandi di InputWidth e InputHeight.
MinimumSamplesPerOutput
Tipo: UINT
Numero minimo di esempi di input da usare per ogni elemento di output. L'operatore calcola il numero di esempi di input eseguendo ScaledCropSize OutputSizeSize / e quindi bloccandolo suMinimumSamplesPerOutput e MaximumSamplesPerOutput.
MaximumSamplesPerOutput
Tipo: UINT
Numero massimo di esempi di input da usare per ogni elemento di output. L'operatore calcola il numero di esempi di input eseguendo ScaledCropSize OutputSizeSize / e quindi bloccandolo suMinimumSamplesPerOutput e MaximumSamplesPerOutput.
AlignRegionsToCorners
Tipo: BOOL
I punti di esempio di output in ogni area devono essere estesi agli angoli dell'area anziché distribuiti uniformemente all'interno dell'area. Il valore predefinito è FALSE, che corrisponde allo stesso comportamento di DML_ROI_ALIGN_OPERATOR_DESC.
Commenti
Disponibilità
Questo operatore è stato introdotto in DML_FEATURE_LEVEL_4_0.
Vincoli tensor
InputTensor, OutputTensor e ROITensor devono avere lo stesso oggetto DataType.
Supporto di Tensor
DML_FEATURE_LEVEL_5_0 e versioni successive
Tensore | Tipo | Conteggi delle dimensioni supportate | Tipi di dati supportati |
---|---|---|---|
InputTensor | Input | 4 | FLOAT32, FLOAT16 |
ROITensor | Input | da 2 a 4 | FLOAT32, FLOAT16 |
BatchIndicesTensor | Input | da 1 a 4 | UINT64, UINT32 |
OutputTensor | Output | 4 | FLOAT32, FLOAT16 |
DML_FEATURE_LEVEL_4_0 e versioni successive
Tensore | Tipo | Conteggi delle dimensioni supportate | Tipi di dati supportati |
---|---|---|---|
InputTensor | Input | 4 | FLOAT32, FLOAT16 |
ROITensor | Input | da 2 a 4 | FLOAT32, FLOAT16 |
BatchIndicesTensor | Input | da 1 a 4 | UINT32 |
OutputTensor | Output | 4 | FLOAT32, FLOAT16 |
Requisiti
Client minimo supportato | Windows Build 22000 |
Server minimo supportato | Windows Build 22000 |
Intestazione | directml.h |