|
|
|
#pragma once
|
|
#include <torch/types.h>
|
|
|
|
namespace detectron2 {
|
|
|
|
#if defined(WITH_CUDA) || defined(WITH_HIP)
|
|
int deform_conv_forward_cuda(
|
|
at::Tensor input,
|
|
at::Tensor weight,
|
|
at::Tensor offset,
|
|
at::Tensor output,
|
|
at::Tensor columns,
|
|
at::Tensor ones,
|
|
int kW,
|
|
int kH,
|
|
int dW,
|
|
int dH,
|
|
int padW,
|
|
int padH,
|
|
int dilationW,
|
|
int dilationH,
|
|
int group,
|
|
int deformable_group,
|
|
int im2col_step);
|
|
|
|
int deform_conv_backward_input_cuda(
|
|
at::Tensor input,
|
|
at::Tensor offset,
|
|
at::Tensor gradOutput,
|
|
at::Tensor gradInput,
|
|
at::Tensor gradOffset,
|
|
at::Tensor weight,
|
|
at::Tensor columns,
|
|
int kW,
|
|
int kH,
|
|
int dW,
|
|
int dH,
|
|
int padW,
|
|
int padH,
|
|
int dilationW,
|
|
int dilationH,
|
|
int group,
|
|
int deformable_group,
|
|
int im2col_step);
|
|
|
|
int deform_conv_backward_parameters_cuda(
|
|
at::Tensor input,
|
|
at::Tensor offset,
|
|
at::Tensor gradOutput,
|
|
at::Tensor gradWeight,
|
|
at::Tensor columns,
|
|
at::Tensor ones,
|
|
int kW,
|
|
int kH,
|
|
int dW,
|
|
int dH,
|
|
int padW,
|
|
int padH,
|
|
int dilationW,
|
|
int dilationH,
|
|
int group,
|
|
int deformable_group,
|
|
float scale,
|
|
int im2col_step);
|
|
|
|
void modulated_deform_conv_cuda_forward(
|
|
at::Tensor input,
|
|
at::Tensor weight,
|
|
at::Tensor bias,
|
|
at::Tensor ones,
|
|
at::Tensor offset,
|
|
at::Tensor mask,
|
|
at::Tensor output,
|
|
at::Tensor columns,
|
|
int kernel_h,
|
|
int kernel_w,
|
|
const int stride_h,
|
|
const int stride_w,
|
|
const int pad_h,
|
|
const int pad_w,
|
|
const int dilation_h,
|
|
const int dilation_w,
|
|
const int group,
|
|
const int deformable_group,
|
|
const bool with_bias);
|
|
|
|
void modulated_deform_conv_cuda_backward(
|
|
at::Tensor input,
|
|
at::Tensor weight,
|
|
at::Tensor bias,
|
|
at::Tensor ones,
|
|
at::Tensor offset,
|
|
at::Tensor mask,
|
|
at::Tensor columns,
|
|
at::Tensor grad_input,
|
|
at::Tensor grad_weight,
|
|
at::Tensor grad_bias,
|
|
at::Tensor grad_offset,
|
|
at::Tensor grad_mask,
|
|
at::Tensor grad_output,
|
|
int kernel_h,
|
|
int kernel_w,
|
|
int stride_h,
|
|
int stride_w,
|
|
int pad_h,
|
|
int pad_w,
|
|
int dilation_h,
|
|
int dilation_w,
|
|
int group,
|
|
int deformable_group,
|
|
const bool with_bias);
|
|
|
|
#endif
|
|
|
|
inline int deform_conv_forward(
|
|
at::Tensor input,
|
|
at::Tensor weight,
|
|
at::Tensor offset,
|
|
at::Tensor output,
|
|
at::Tensor columns,
|
|
at::Tensor ones,
|
|
int kW,
|
|
int kH,
|
|
int dW,
|
|
int dH,
|
|
int padW,
|
|
int padH,
|
|
int dilationW,
|
|
int dilationH,
|
|
int group,
|
|
int deformable_group,
|
|
int im2col_step) {
|
|
if (input.is_cuda()) {
|
|
#if defined(WITH_CUDA) || defined(WITH_HIP)
|
|
TORCH_CHECK(weight.is_cuda(), "weight tensor is not on GPU!");
|
|
TORCH_CHECK(offset.is_cuda(), "offset tensor is not on GPU!");
|
|
return deform_conv_forward_cuda(
|
|
input,
|
|
weight,
|
|
offset,
|
|
output,
|
|
columns,
|
|
ones,
|
|
kW,
|
|
kH,
|
|
dW,
|
|
dH,
|
|
padW,
|
|
padH,
|
|
dilationW,
|
|
dilationH,
|
|
group,
|
|
deformable_group,
|
|
im2col_step);
|
|
#else
|
|
AT_ERROR("Detectron2 is not compiled with GPU support!");
|
|
#endif
|
|
}
|
|
AT_ERROR("This operator is not implemented on CPU");
|
|
}
|
|
|
|
inline int deform_conv_backward_input(
|
|
at::Tensor input,
|
|
at::Tensor offset,
|
|
at::Tensor gradOutput,
|
|
at::Tensor gradInput,
|
|
at::Tensor gradOffset,
|
|
at::Tensor weight,
|
|
at::Tensor columns,
|
|
int kW,
|
|
int kH,
|
|
int dW,
|
|
int dH,
|
|
int padW,
|
|
int padH,
|
|
int dilationW,
|
|
int dilationH,
|
|
int group,
|
|
int deformable_group,
|
|
int im2col_step) {
|
|
if (gradOutput.is_cuda()) {
|
|
#if defined(WITH_CUDA) || defined(WITH_HIP)
|
|
TORCH_CHECK(input.is_cuda(), "input tensor is not on GPU!");
|
|
TORCH_CHECK(weight.is_cuda(), "weight tensor is not on GPU!");
|
|
TORCH_CHECK(offset.is_cuda(), "offset tensor is not on GPU!");
|
|
return deform_conv_backward_input_cuda(
|
|
input,
|
|
offset,
|
|
gradOutput,
|
|
gradInput,
|
|
gradOffset,
|
|
weight,
|
|
columns,
|
|
kW,
|
|
kH,
|
|
dW,
|
|
dH,
|
|
padW,
|
|
padH,
|
|
dilationW,
|
|
dilationH,
|
|
group,
|
|
deformable_group,
|
|
im2col_step);
|
|
#else
|
|
AT_ERROR("Detectron2 is not compiled with GPU support!");
|
|
#endif
|
|
}
|
|
AT_ERROR("This operator is not implemented on CPU");
|
|
}
|
|
|
|
inline int deform_conv_backward_filter(
|
|
at::Tensor input,
|
|
at::Tensor offset,
|
|
at::Tensor gradOutput,
|
|
at::Tensor gradWeight,
|
|
at::Tensor columns,
|
|
at::Tensor ones,
|
|
int kW,
|
|
int kH,
|
|
int dW,
|
|
int dH,
|
|
int padW,
|
|
int padH,
|
|
int dilationW,
|
|
int dilationH,
|
|
int group,
|
|
int deformable_group,
|
|
float scale,
|
|
int im2col_step) {
|
|
if (gradOutput.is_cuda()) {
|
|
#if defined(WITH_CUDA) || defined(WITH_HIP)
|
|
TORCH_CHECK(input.is_cuda(), "input tensor is not on GPU!");
|
|
TORCH_CHECK(offset.is_cuda(), "offset tensor is not on GPU!");
|
|
return deform_conv_backward_parameters_cuda(
|
|
input,
|
|
offset,
|
|
gradOutput,
|
|
gradWeight,
|
|
columns,
|
|
ones,
|
|
kW,
|
|
kH,
|
|
dW,
|
|
dH,
|
|
padW,
|
|
padH,
|
|
dilationW,
|
|
dilationH,
|
|
group,
|
|
deformable_group,
|
|
scale,
|
|
im2col_step);
|
|
#else
|
|
AT_ERROR("Detectron2 is not compiled with GPU support!");
|
|
#endif
|
|
}
|
|
AT_ERROR("This operator is not implemented on CPU");
|
|
}
|
|
|
|
inline void modulated_deform_conv_forward(
|
|
at::Tensor input,
|
|
at::Tensor weight,
|
|
at::Tensor bias,
|
|
at::Tensor ones,
|
|
at::Tensor offset,
|
|
at::Tensor mask,
|
|
at::Tensor output,
|
|
at::Tensor columns,
|
|
int kernel_h,
|
|
int kernel_w,
|
|
const int stride_h,
|
|
const int stride_w,
|
|
const int pad_h,
|
|
const int pad_w,
|
|
const int dilation_h,
|
|
const int dilation_w,
|
|
const int group,
|
|
const int deformable_group,
|
|
const bool with_bias) {
|
|
if (input.is_cuda()) {
|
|
#if defined(WITH_CUDA) || defined(WITH_HIP)
|
|
TORCH_CHECK(weight.is_cuda(), "weight tensor is not on GPU!");
|
|
TORCH_CHECK(bias.is_cuda(), "bias tensor is not on GPU!");
|
|
TORCH_CHECK(offset.is_cuda(), "offset tensor is not on GPU!");
|
|
return modulated_deform_conv_cuda_forward(
|
|
input,
|
|
weight,
|
|
bias,
|
|
ones,
|
|
offset,
|
|
mask,
|
|
output,
|
|
columns,
|
|
kernel_h,
|
|
kernel_w,
|
|
stride_h,
|
|
stride_w,
|
|
pad_h,
|
|
pad_w,
|
|
dilation_h,
|
|
dilation_w,
|
|
group,
|
|
deformable_group,
|
|
with_bias);
|
|
#else
|
|
AT_ERROR("Detectron2 is not compiled with GPU support!");
|
|
#endif
|
|
}
|
|
AT_ERROR("This operator is not implemented on CPU");
|
|
}
|
|
|
|
inline void modulated_deform_conv_backward(
|
|
at::Tensor input,
|
|
at::Tensor weight,
|
|
at::Tensor bias,
|
|
at::Tensor ones,
|
|
at::Tensor offset,
|
|
at::Tensor mask,
|
|
at::Tensor columns,
|
|
at::Tensor grad_input,
|
|
at::Tensor grad_weight,
|
|
at::Tensor grad_bias,
|
|
at::Tensor grad_offset,
|
|
at::Tensor grad_mask,
|
|
at::Tensor grad_output,
|
|
int kernel_h,
|
|
int kernel_w,
|
|
int stride_h,
|
|
int stride_w,
|
|
int pad_h,
|
|
int pad_w,
|
|
int dilation_h,
|
|
int dilation_w,
|
|
int group,
|
|
int deformable_group,
|
|
const bool with_bias) {
|
|
if (grad_output.is_cuda()) {
|
|
#if defined(WITH_CUDA) || defined(WITH_HIP)
|
|
TORCH_CHECK(input.is_cuda(), "input tensor is not on GPU!");
|
|
TORCH_CHECK(weight.is_cuda(), "weight tensor is not on GPU!");
|
|
TORCH_CHECK(bias.is_cuda(), "bias tensor is not on GPU!");
|
|
TORCH_CHECK(offset.is_cuda(), "offset tensor is not on GPU!");
|
|
return modulated_deform_conv_cuda_backward(
|
|
input,
|
|
weight,
|
|
bias,
|
|
ones,
|
|
offset,
|
|
mask,
|
|
columns,
|
|
grad_input,
|
|
grad_weight,
|
|
grad_bias,
|
|
grad_offset,
|
|
grad_mask,
|
|
grad_output,
|
|
kernel_h,
|
|
kernel_w,
|
|
stride_h,
|
|
stride_w,
|
|
pad_h,
|
|
pad_w,
|
|
dilation_h,
|
|
dilation_w,
|
|
group,
|
|
deformable_group,
|
|
with_bias);
|
|
#else
|
|
AT_ERROR("Detectron2 is not compiled with GPU support!");
|
|
#endif
|
|
}
|
|
AT_ERROR("This operator is not implemented on CPU");
|
|
}
|
|
|
|
}
|
|
|