code: def backward(ctx, grad_output):
      if not grad_output.is_cuda:
          raise NotImplementedError(
              "DCN operator for cpu for backward propagation is not implemented."
          )
  
      data, rois, offset = ctx.saved_tensors
      output_count = ctx.output_count
      grad_input = torch.zeros_like(data)
      grad_rois = None
      grad_offset = torch.zeros_like(offset)
  
      deform_pool_cuda.deform_psroi_pooling_cuda_backward(
          grad_output,
          data,
          rois,
          offset,
          output_count,
          grad_input,
          grad_offset,
          ctx.no_trans,
          ctx.spatial_scale,
          ctx.out_channels,
          ctx.group_size,
          ctx.out_size,
          ctx.part_size,
          ctx.sample_per_part,
          ctx.trans_std,
      )
      return (
          grad_input,
          grad_rois,
          grad_offset,
          None,
          None,
          None,
          None,
          None,
          None,
          None,
          None,
      )
  
file_path: EasyOCR/easyocr/DBNet/assets/ops/dcn/functions/deform_pool.py
imports: import os
  import warnings
  import torch
  from torch.autograd import Function
  from torch.utils import cpp_extension
label_desc: Use image node_id 2 for calling the DeformRoIPoolingFunction obj's underlying member method code with example usage: obj.backward(ctx, grad_output) and returns: grad_input,  grad_rois,  grad_offset,  None,  None,  None,  None,  None,  None,  None,  None