Share via


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

Roi-Ausrichtungsbeispiele

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

Typ: DML_INTERPOLATION_MODE

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