class_docstr: This code is from https://github.com/WenmuZhou/PAN.pytorch.
  
  Args:
      in_channels (list[int]): A list of 4 numbers of input channels.
      conv_out (int): Number of output channels.
      fpem_repeat (int): Number of FPEM layers before FFM operations.
      align_corners (bool): The interpolation behaviour in FFM operation,
          used in :func:`torch.nn.functional.interpolate`.
      init_cfg (dict or list[dict], optional): Initialization configs.
class_docstr_tok: ["This","code","is","from","https",":","\/\/github.com\/WenmuZhou\/PAN.pytorch",".","Args",":","in_channels","(","list","[","int","]",")",":","A","list","of","4","numbers","of","input","channels",".","conv_out","(","int",")",":","Number","of","output","channels",".","fpem_repeat","(","int",")",":","Number","of","FPEM","layers","before","FFM","operations",".","align_corners","(","bool",")",":","The","interpolation","behaviour","in","FFM","operation",",","used","in",":","func",":","`","torch.nn.functional.interpolate","`",".","init_cfg","(","dict","or","list","[","dict","]",",","optional",")",":","Initialization","configs","."]
code: def __init__(
      self,
      in_channels: List[int],
      conv_out: int = 128,
      fpem_repeat: int = 2,
      align_corners: bool = False,
      init_cfg: Optional[Union[Dict, List[Dict]]] = dict(
          type="Xavier", layer="Conv2d", distribution="uniform"
      ),
  ) -> None:
      super().__init__(init_cfg=init_cfg)
      # reduce layers
      self.reduce_conv_c2 = nn.Sequential(
          nn.Conv2d(
              in_channels=in_channels[0],
              out_channels=conv_out,
              kernel_size=1,
          ),
          nn.BatchNorm2d(conv_out),
          nn.ReLU(),
      )
      self.reduce_conv_c3 = nn.Sequential(
          nn.Conv2d(
              in_channels=in_channels[1],
              out_channels=conv_out,
              kernel_size=1,
          ),
          nn.BatchNorm2d(conv_out),
          nn.ReLU(),
      )
      self.reduce_conv_c4 = nn.Sequential(
          nn.Conv2d(
              in_channels=in_channels[2],
              out_channels=conv_out,
              kernel_size=1,
          ),
          nn.BatchNorm2d(conv_out),
          nn.ReLU(),
      )
      self.reduce_conv_c5 = nn.Sequential(
          nn.Conv2d(
              in_channels=in_channels[3],
              out_channels=conv_out,
              kernel_size=1,
          ),
          nn.BatchNorm2d(conv_out),
          nn.ReLU(),
      )
      self.align_corners = align_corners
      self.fpems = ModuleList()
      for _ in range(fpem_repeat):
          self.fpems.append(FPEM(conv_out))
  
file_path: mmocr/mmocr/models/textdet/necks/fpem_ffm.py
imports: from typing import Dict, List, Optional, Tuple, Union
  import torch
  import torch.nn.functional
  from mmengine.model import BaseModule, ModuleList
  from torch import nn
  from mmocr.registry import MODELS
label_desc: Use image node_id 1 to create a new FPEM_FFM object from inherited base classes: BaseModule with example: obj = FPEM_FFM(in_channels, conv_out, fpem_repeat, align_corners, init_cfg)