class_docstr: This class implements the `Feature Pyramid Network <https://arxiv.org/abs/1612.03144>`_ module for object detection.
  
  Args:
      opts: command-line arguments
      in_channels (List[int]): List of channels at different output strides
      output_strides (List[int]): Feature maps from these output strides will be used in FPN
      out_channels (int): Output channels
code: def forward(
      self, x: Dict[str, Tensor], *args, **kwargs
  ) -> Dict[str, Tensor]:
      assert len(x) == self.num_fpn_layers
  
      # dictionary to store results for fpn
      fpn_out_dict = {
          "os_".format(os): None for os in self.output_strides
      }
  
      # process the last output stride
      os_key = "os_{}".format(self.output_strides[-1])
      prev_x = self.proj_layers[os_key](x[os_key])
      prev_x = self.nxn_convs[os_key](prev_x)
      fpn_out_dict[os_key] = prev_x
  
      remaining_output_strides = self.output_strides[:-1]
  
      # bottom-up processing
      for os in remaining_output_strides[::-1]:
          os_key = "os_{}".format(os)
          # 1x1 conv
          curr_x = self.proj_layers[os_key](x[os_key])
          # upsample
          prev_x = F.interpolate(
              prev_x, size=curr_x.shape[-2:], mode="nearest"
          )
          # add
          prev_x = curr_x + prev_x
          prev_x = self.nxn_convs[os_key](prev_x)
          fpn_out_dict[os_key] = prev_x
  
      return fpn_out_dict
  
file_path: ml-cvnets/cvnets/modules/feature_pyramid.py
imports: from typing import Dict, List
  import torch
  import torch.nn.functional
  from torch import Tensor, nn
  from cvnets.layers import ConvLayer2d, norm_layers_tuple
  from cvnets.misc.init_utils import initialize_conv_layer, initialize_norm_layers
  from cvnets.modules import BaseModule
  from utils import logger
label_desc: Use image node_id 3 for calling the FeaturePyramidNetwork obj's underlying member method code with example usage: obj.forward(x) and returns: fpn_out_dict