DML_ROI_ALIGN1_OPERATOR_DESC-Struktur (directml.h)
Führt einen ROI-Ausrichtungsvorgang aus, wie im Dokument Mask R-CNN (Mask R-CNN ) beschrieben. Zusammenfassend extrahiert der Vorgang zugeschnittene Fenster aus dem Eingabebild-Tensor und ändert ihre Größe auf eine allgemeine Ausgabegröße, die von den letzten 2 Dimensionen von OutputTensor mithilfe des angegebenen InterpolationMode angegeben wird.
Die allgemeine Logik sieht wie folgt aus.
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
Berechnen Sie alle Ausgabewerte für die aktuelle Region wie folgt.
for every output tensor element x y and channel in the region
outputValue = getOutputValue(channel, outputTensorX, outputTensorY)
OutputTensor[roiIndex, channel, outputTensorY, outputTensorX] = outputValue
endfor
Berechnen Sie jedes Eingabebeispiel für das Ausgabeelement wie folgt.
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
Beispiele
Syntax
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;
};
Member
InputTensor
Typ: const DML_TENSOR_DESC*
Ein Tensor, der die Eingabedaten mit Dimensionen { BatchCount, ChannelCount, InputHeight, InputWidth }
enthält.
ROITensor
Typ: const DML_TENSOR_DESC*
Ein Tensor, der die ROI-Daten (Regions of Interest) enthält, eine Reihe von Begrenzungsrahmen in Gleitkommakoordinaten, die auf die X- und Y-Dimensionen des Eingabe tensors zeigen. Die zulässigen Dimensionen von ROITensor sind { NumROIs, 4 }
, { 1, NumROIs, 4 }
oder { 1, 1, NumROIs, 4 }
. Für jeden ROI sind die Werte die Koordinaten der oberen linken und unteren rechten Ecken in der Reihenfolge [x1, y1, x2, y2]
. Bereiche können leer sein, was bedeutet, dass alle Ausgabepixel aus der einzelnen Eingabekoordinate stammen und Regionen invertiert werden können (z. B. x2 kleiner als x1), was bedeutet, dass die Ausgabe eine gespiegelte/gespiegelte Version der Eingabe empfängt. Diese Koordinaten werden zuerst von SpatialScaleX und SpatialScaleY skaliert, aber wenn beide 1,0 sind, entsprechen die Bereichsrechtecke einfach direkt den Eingabe-Tensorkoordinaten.
BatchIndicesTensor
Typ: const DML_TENSOR_DESC*
Ein Tensor, der die Batchindizes enthält, aus denen die ROIs extrahiert werden sollen. Die zulässigen Dimensionen von BatchIndicesTensor sind { NumROIs }
, { 1, NumROIs }
, { 1, 1, NumROIs }
oder { 1, 1, 1, NumROIs }
. Jeder Wert ist der Index eines Batches aus InputTensor. Das Verhalten ist nicht definiert, wenn die Werte nicht im Bereich [0, BatchCount)
liegen.
OutputTensor
Typ: const DML_TENSOR_DESC*
Ein Tensor, der die Ausgabedaten enthält. Die erwarteten Dimensionen von OutputTensor sind { NumROIs, ChannelCount, OutputHeight, OutputWidth }
.
ReductionFunction
Typ: DML_REDUCE_FUNCTION
Die Reduzierungsfunktion, die beim Reduzieren aller Eingabebeispiele verwendet werden soll, die zu einem Ausgabeelement beitragen (DML_REDUCE_FUNCTION_AVERAGE oder DML_REDUCE_FUNCTION_MAX). Die Anzahl der Eingabebeispiele, über die reduziert werden soll, wird durch MinimumSamplesPerOutput und MaximumSamplesPerOutput begrenzt.
InterpolationMode
Der Interpolationsmodus, der beim Ändern der Größe der Regionen verwendet werden soll.
- DML_INTERPOLATION_MODE_NEAREST_NEIGHBOR. Verwendet den nächstgelegenen nighbor-Algorithmus , der das Eingabeelement auswäht, das dem entsprechenden Pixelmittelpunkt für jedes Ausgabeelement am nächsten liegt.
- DML_INTERPOLATION_MODE_LINEAR. Verwendet den bilinearen Algorithmus, der das Ausgabeelement berechnet, indem der gewichtete Durchschnitt der 2 nächsten benachbarten Eingabeelemente pro Dimension ausgeführt wird. Da die Größe von nur zwei Dimensionen geändert wird, wird der gewichtete Durchschnitt für insgesamt 4 Eingabeelemente für jedes Ausgabeelement berechnet.
SpatialScaleX
Typ: FLOAT
Die X-Komponente (oder Breite) des Skalierungsfaktors, mit dem die ROITensor-Koordinaten multipliziert werden sollen, um sie proportional zu InputHeight und InputWidth zu machen. Wenn ROITensor beispielsweise normalisierte Koordinaten (Werte im Bereich [0..1]
) enthält, hat SpatialScaleX in der Regel den gleichen Wert wie InputWidth.
SpatialScaleY
Typ: FLOAT
Die Y-Komponente (oder Höhe) des Skalierungsfaktors, um die ROITensor-Koordinaten mit zu multiplizieren, um sie proportional zu InputHeight und InputWidth zu machen. Wenn ROITensor beispielsweise normalisierte Koordinaten (Werte im Bereich [0..1]
) enthält, hat SpatialScaleY in der Regel den gleichen Wert wie InputHeight.
InputPixelOffset
Typ: FLOAT
Der Offset von (0,0)
den Eingabekoordinaten zum pixeligen Mittelpunkt oben links, in der Regel entweder 0 oder 0,5. Wenn dieser Wert 0 ist, wird die obere linke Ecke des Pixels anstelle seiner Mitte verwendet, was normalerweise nicht das erwartete Ergebnis ergibt, aber für die Kompatibilität mit einigen Frameworks nützlich ist. Wenn dieser Wert 0,5 ist, werden Pixel als in der Mitte behandelt. Dies entspricht dem Verhalten DML_ROI_ALIGN_OPERATOR_DESC.
OutputPixelOffset
Typ: FLOAT
Der Offset vom oberen linken Pixelmittelpunkt zu (0,0)
den Ausgabekoordinaten, in der Regel entweder 0 oder -0,5. Wenn dieser Wert 0 ist, wird die obere linke Ecke des Pixels anstelle seiner Mitte verwendet, was normalerweise nicht das erwartete Ergebnis ergibt, aber für die Kompatibilität mit einigen Frameworks nützlich ist. Wenn dieser Wert -0,5 ist, werden Pixel als in der Mitte behandelt, was das gleiche Verhalten wie DML_ROI_ALIGN_OPERATOR_DESC ist.
OutOfBoundsInputValue
Typ: FLOAT
Der Wert, der aus InputTensor gelesen werden soll, wenn die ROIs außerhalb der Grenzen von InputTensor liegen. Dies kann passieren, wenn die werte, die nach der Skalierung von ROITensor von SpatialScaleX und SpatialScaleY abgerufen wurden, größer als InputWidth und InputHeight sind.
MinimumSamplesPerOutput
Typ: UINT
Die Mindestanzahl von Eingabebeispielen, die für jedes Ausgabeelement verwendet werden sollen. Der Operator berechnet die Anzahl der Eingabebeispiele, indem er ScaledCropSize / OutputSize ausführt und dann auf MinimumSamplesPerOutput und MaximumSamplesPerOutput klemmt.
MaximumSamplesPerOutput
Typ: UINT
Die maximale Anzahl von Eingabebeispielen, die für jedes Ausgabeelement verwendet werden sollen. Der Operator berechnet die Anzahl der Eingabebeispiele, indem er ScaledCropSize / OutputSize ausführt und dann auf MinimumSamplesPerOutput und MaximumSamplesPerOutput klemmt.
AlignRegionsToCorners
Typ: BOOL
Die Ausgabebeispielpunkte in jeder Region sollten bis an die Ecken der Region gestreckt werden, anstatt gleichmäßig innerhalb der Region verteilt zu sein. Der Standardwert ist FALSE. Dies entspricht dem Verhalten DML_ROI_ALIGN_OPERATOR_DESC.
Hinweise
Verfügbarkeit
Dieser Operator wurde in DML_FEATURE_LEVEL_4_0 eingeführt.
Tensoreinschränkungen
InputTensor, OutputTensor und ROITensor müssen denselben Datentyp aufweisen.
Tensorunterstützung
DML_FEATURE_LEVEL_5_0 und höher
Tensor | Art | Unterstützte Dimensionsanzahl | Unterstützte Datentypen |
---|---|---|---|
InputTensor | Eingabe | 4 | FLOAT32, FLOAT16 |
ROITensor | Eingabe | 2 bis 4 | FLOAT32, FLOAT16 |
BatchIndicesTensor | Eingabe | 1 bis 4 | UINT64, UINT32 |
OutputTensor | Output | 4 | FLOAT32, FLOAT16 |
DML_FEATURE_LEVEL_4_0 und höher
Tensor | Art | Unterstützte Dimensionsanzahl | Unterstützte Datentypen |
---|---|---|---|
InputTensor | Eingabe | 4 | FLOAT32, FLOAT16 |
ROITensor | Eingabe | 2 bis 4 | FLOAT32, FLOAT16 |
BatchIndicesTensor | Eingabe | 1 bis 4 | UINT32 |
OutputTensor | Output | 4 | FLOAT32, FLOAT16 |
Anforderungen
Unterstützte Mindestversion (Client) | Windows Build 22000 |
Unterstützte Mindestversion (Server) | Windows Build 22000 |
Kopfzeile | directml.h |