class_docstr: RFP (Recursive Feature Pyramid)
  
  This is an implementation of RFP in `DetectoRS
  <https://arxiv.org/pdf/2006.02334.pdf>`_. Different from standard FPN, the
  input of RFP should be multi level features along with origin input image
  of backbone.
  
  Args:
      rfp_steps (int): Number of unrolled steps of RFP.
      rfp_backbone (dict): Configuration of the backbone for RFP.
      aspp_out_channels (int): Number of output channels of ASPP module.
      aspp_dilations (tuple[int]): Dilation rates of four branches.
          Default: (1, 3, 6, 1)
code: def forward(self, inputs):
      inputs = list(inputs)
      assert (
          len(inputs) == len(self.in_channels) + 1
      )  # +1 for input image
      img = inputs.pop(0)
      # FPN forward
      x = super().forward(tuple(inputs))
      for rfp_idx in range(self.rfp_steps - 1):
          rfp_feats = [x[0]] + list(
              self.rfp_aspp(x[i]) for i in range(1, len(x))
          )
          x_idx = self.rfp_modules[rfp_idx].rfp_forward(img, rfp_feats)
          # FPN forward
          x_idx = super().forward(x_idx)
          x_new = []
          for ft_idx in range(len(x_idx)):
              add_weight = torch.sigmoid(self.rfp_weight(x_idx[ft_idx]))
              x_new.append(
                  add_weight * x_idx[ft_idx]
                  + (1 - add_weight) * x[ft_idx]
              )
          x = x_new
      return x
  
file_path: insightface/detection/scrfd/mmdet/models/necks/rfp.py
imports: import torch
  import torch.nn
  import torch.nn.functional
  from mmcv.cnn import constant_init, kaiming_init, xavier_init
  from ..builder import NECKS, build_backbone
  from .fpn import FPN
label_desc: Use image node_id 3 for calling the RFP obj's underlying member method code with example usage: obj.forward(inputs) and returns: x