다음을 통해 공유


DML_ROI_ALIGN1_OPERATOR_DESC 구조체(directml.h)

R-CNN 마스크 용지에 설명된 대로 ROI 맞춤 작업을 수행합니다. 요약하자면, 이 작업은 입력 이미지 텐서에서 잘린 창을 추출하고 지정된 InterpolationMode를 사용하여 OutputTensor의 마지막 2차원에 지정된 공통 출력 크기로 크기를 조정합니다.

일반적인 논리는 다음과 같습니다.

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

다음과 같이 현재 지역의 모든 출력 값을 계산합니다.

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

다음과 같이 출력 요소에 대한 각 입력 샘플을 계산합니다.

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

예제

ROI 정렬 예제

구문

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

멤버

InputTensor

형식: const DML_TENSOR_DESC*

차원이 인 입력 데이터를 포함하는 텐서입니다.{ BatchCount, ChannelCount, InputHeight, InputWidth }

ROITensor

형식: const DML_TENSOR_DESC*

ROI(관심 영역) 데이터를 포함하는 텐서, 입력 텐서의 X 및 Y 차원을 가리키는 부동 소수점 좌표의 일련의 경계 상자입니다. ROITensor의 허용되는 차원은 , { 1, NumROIs, 4 }또는 { 1, 1, NumROIs, 4 }입니다{ NumROIs, 4 }. 각 ROI에 대해 값은 순서대로 왼쪽 위와 오른쪽 아래 모서리의 좌표가 [x1, y1, x2, y2]됩니다. 영역은 비어 있을 수 있습니다. 즉, 모든 출력 픽셀은 단일 입력 좌표에서 제공되며, 지역(예: x2 x1 미만)을 반전할 수 있습니다. 즉, 출력이 입력의 미러/대칭 이동 버전을 받습니다. 이러한 좌표는 먼저 SpatialScaleXSpatialScaleY에 의해 크기 조정되지만 둘 다 1.0인 경우 영역 사각형은 입력 텐서 좌표에 직접 해당합니다.

BatchIndicesTensor

형식: const DML_TENSOR_DESC*

ROI를 추출할 일괄 처리 인덱스를 포함하는 텐서입니다. BatchIndicesTensor의 허용되는 차원은 , { 1, NumROIs }, { 1, 1, NumROIs }또는 { 1, 1, 1, NumROIs }입니다{ NumROIs }. 각 값은 InputTensor의 일괄 처리 인덱스입니다. 값이 범위에 [0, BatchCount)없으면 동작이 정의되지 않습니다.

OutputTensor

형식: const DML_TENSOR_DESC*

출력 데이터를 포함하는 텐서입니다. OutputTensor의 예상 차원은 입니다{ NumROIs, ChannelCount, OutputHeight, OutputWidth }.

ReductionFunction

형식: DML_REDUCE_FUNCTION

출력 요소(DML_REDUCE_FUNCTION_AVERAGE 또는 DML_REDUCE_FUNCTION_MAX)에 기여하는 모든 입력 샘플에서 축소할 때 사용할 감소 함수입니다. 줄일 입력 샘플 수는 MinimumSamplesPerOutputMaximumSamplesPerOutput으로 제한됩니다.

InterpolationMode

형식: DML_INTERPOLATION_MODE

영역 크기를 조정할 때 사용할 보간 모드입니다.

  • DML_INTERPOLATION_MODE_NEAREST_NEIGHBOR. 각 출력 요소에 대해 해당 픽셀 센터에 가장 가까운 입력 요소를 선택하는 가장 가까운 nighbor 알고리즘을 사용합니다.
  • DML_INTERPOLATION_MODE_LINEAR. 차원당 가장 가까운 2개의 인접 입력 요소의 가중 평균을 수행하여 출력 요소를 계산하는 쌍선형 알고리즘을 사용합니다. 크기는 2개뿐이므로 가중 평균은 각 출력 요소에 대해 총 4개의 입력 요소에서 계산됩니다.

SpatialScaleX

형식: FLOAT

배율 인수의 X(또는 너비) 구성 요소를 사용하여 ROITensor 좌표를 곱하여 InputHeightInputWidth에 비례하도록 합니다. 예를 들어 ROITensor 에 정규화된 좌표(범위 [0..1]의 값)가 포함된 경우 SpatialScaleX 는 일반적으로 InputWidth와 동일한 값을 갖습니다.

SpatialScaleY

형식: FLOAT

배율 인수의 Y(또는 높이) 구성 요소는 ROITensor 좌표를 곱하여 InputHeightInputWidth에 비례하도록 합니다. 예를 들어 ROITensor 에 정규화된 좌표(범위 [0..1]의 값)가 포함된 경우 SpatialScaleY 는 일반적으로 InputHeight와 동일한 값을 갖습니다.

InputPixelOffset

형식: FLOAT

입력 좌표에서 (0,0) 왼쪽 위 픽셀 가운데로의 오프셋(일반적으로 0 또는 0.5)입니다. 이 값이 0이면 픽셀의 왼쪽 위 모서리가 중심 대신 사용되며, 일반적으로 예상 결과를 제공하지는 않지만 일부 프레임워크와의 호환성에 유용합니다. 이 값이 0.5이면 픽셀이 가운데에 있는 것으로 처리되며 이는 DML_ROI_ALIGN_OPERATOR_DESC 동작과 동일합니다.

OutputPixelOffset

형식: FLOAT

왼쪽 위 픽셀 중심에서 출력 좌표로 (0,0) 의 오프셋(일반적으로 0 또는 -0.5)입니다. 이 값이 0이면 픽셀의 왼쪽 위 모서리가 중심 대신 사용되며, 일반적으로 예상 결과를 제공하지는 않지만 일부 프레임워크와의 호환성에 유용합니다. 이 값이 -0.5이면 픽셀이 가운데에 있는 것으로 처리되며 이는 DML_ROI_ALIGN_OPERATOR_DESC 동작과 동일합니다.

OutOfBoundsInputValue

형식: FLOAT

ROI가 InputTensor 범위를 벗어날 때 InputTensor에서 읽을 값입니다. SpatialScaleX 및 SpatialScaleYROITensor 크기를 조정한 후 얻은 값이 InputWidthInputHeight보다 큰 경우에 발생할 수 있습니다.

MinimumSamplesPerOutput

형식: UINT

모든 출력 요소에 사용할 최소 입력 샘플 수입니다. 연산자는 ScaledCropSize OutputSize / 를 수행한 다음 MinimumSamplesPerOutput 및 MaximumSamplesPerOutput으로 고정하여 입력 샘플 수를 계산합니다.

MaximumSamplesPerOutput

형식: UINT

모든 출력 요소에 사용할 최대 입력 샘플 수입니다. 연산자는 ScaledCropSize OutputSize / 를 수행한 다음 MinimumSamplesPerOutput 및 MaximumSamplesPerOutput으로 고정하여 입력 샘플 수를 계산합니다.

AlignRegionsToCorners

형식: BOOL

각 지역의 출력 샘플 지점은 지역 내에서 균등하게 분산되지 않고 영역의 바로 모서리로 확장되어야 합니다. 기본값은 FALSE이며 DML_ROI_ALIGN_OPERATOR_DESC 동작과 동일합니다.

설명

가용성

이 연산자는 DML_FEATURE_LEVEL_4_0 도입되었습니다.

텐서 제약 조건

InputTensor, OutputTensorROITensor 에는 동일한 DataType이 있어야 합니다.

텐서 지원

DML_FEATURE_LEVEL_5_0 이상

텐서 종류 지원되는 차원 수 지원되는 데이터 형식
InputTensor 입력 4 FLOAT32, FLOAT16
ROITensor 입력 2~4 FLOAT32, FLOAT16
BatchIndicesTensor 입력 1~4개 UINT64, UINT32
OutputTensor 출력 4 FLOAT32, FLOAT16

DML_FEATURE_LEVEL_4_0 이상

텐서 종류 지원되는 차원 수 지원되는 데이터 형식
InputTensor 입력 4 FLOAT32, FLOAT16
ROITensor 입력 2~4 FLOAT32, FLOAT16
BatchIndicesTensor 입력 1~4 UINT32
OutputTensor 출력 4 FLOAT32, FLOAT16

요구 사항

   
지원되는 최소 클라이언트 Windows 빌드 22000
지원되는 최소 서버 Windows 빌드 22000
머리글 directml.h