| |
| |
|
|
| #include <torch/extension.h> |
| #include <ATen/DeviceGuard.h> |
|
|
| #include <cmath> |
| #include <vector> |
|
|
| #define WITH_CUDA |
| #ifdef WITH_CUDA |
| 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 |
|
|
| 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.device().is_cuda()) { |
| #ifdef WITH_CUDA |
| 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("deform conv is not compiled with GPU support"); |
| #endif |
| } |
| AT_ERROR("deform conv is not implemented on CPU"); |
| } |
|
|
| 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 (input.device().is_cuda()) { |
| #ifdef WITH_CUDA |
| 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("deform conv is not compiled with GPU support"); |
| #endif |
| } |
| AT_ERROR("deform conv is not implemented on CPU"); |
| } |
|
|
| int deform_conv_backward_parameters( |
| 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 (input.device().is_cuda()) { |
| #ifdef WITH_CUDA |
| 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("deform conv is not compiled with GPU support"); |
| #endif |
| } |
| AT_ERROR("deform conv is not implemented on CPU"); |
| } |
|
|
| 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.device().is_cuda()) { |
| #ifdef WITH_CUDA |
| 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("modulated deform conv is not compiled with GPU support"); |
| #endif |
| } |
| AT_ERROR("modulated deform conv is not implemented on CPU"); |
| } |
|
|
| 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 (input.device().is_cuda()) { |
| #ifdef WITH_CUDA |
| 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("modulated deform conv is not compiled with GPU support"); |
| #endif |
| } |
| AT_ERROR("modulated deform conv is not implemented on CPU"); |
| } |
|
|
|
|
| PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { |
| m.def("deform_conv_forward", &deform_conv_forward, |
| "deform forward"); |
| m.def("deform_conv_backward_input", &deform_conv_backward_input, |
| "deform_conv_backward_input"); |
| m.def("deform_conv_backward_parameters", |
| &deform_conv_backward_parameters, |
| "deform_conv_backward_parameters"); |
| m.def("modulated_deform_conv_forward", |
| &modulated_deform_conv_forward, |
| "modulated deform conv forward"); |
| m.def("modulated_deform_conv_backward", |
| &modulated_deform_conv_backward, |
| "modulated deform conv backward"); |
| } |
|
|