class_docstr: illustration of a minimal bifpn unit P7_0 ------------------------->
  P7_2 -------->
  
  |-------------|                ↑                  ↓                |
  P6_0 ---------> P6_1 ---------> P6_2 -------->
  |-------------|--------------↑ ↑                  ↓                | P5_0
  ---------> P5_1 ---------> P5_2 -------->    |-------------|--------------↑
  ↑                  ↓                | P4_0 ---------> P4_1 ---------> P4_2
  -------->    |-------------|--------------↑ ↑
  |--------------↓ | P3_0 -------------------------> P3_2 -------->
class_docstr_tok: ["illustration","of","a","minimal","bifpn","unit","P7_0","--","--","--","--","--","--","--","--","--","--","--","--","-",">","P7_2","--","--","--","--",">","|","--","--","--","--","--","--","-|","\u2191","\u2193","|","P6_0","--","--","--","--","-",">","P6_1","--","--","--","--","-",">","P6_2","--","--","--","--",">","|","--","--","--","--","--","--","-|","--","--","--","--","--","--","--","\u2191","\u2191","\u2193","|","P5_0","--","--","--","--","-",">","P5_1","--","--","--","--","-",">","P5_2","--","--","--","--",">","|","--","--","--","--","--","--","-|","--","--","--","--","--","--","--","\u2191","\u2191","\u2193","|","P4_0","--","--","--","--","-",">","P4_1","--","--","--","--","-",">","P4_2","--","--","--","--",">","|","--","--","--","--","--","--","-|","--","--","--","--","--","--","--","\u2191","\u2191","|","--","--","--","--","--","--","--","\u2193","|","P3_0","--","--","--","--","--","--","--","--","--","--","--","--","-",">","P3_2","--","--","--","--",">"]
code: def forward(self, inputs):
      def extra_convs(inputs, extra_convs):
          outputs = list()
          for extra_conv in extra_convs:
              inputs = extra_conv(inputs)
              outputs.append(inputs)
          return outputs
  
      assert len(inputs) == len(self.in_channels)
  
      # build laterals
      laterals = [
          lateral_conv(inputs[i + self.start_level])
          for i, lateral_conv in enumerate(self.lateral_convs)
      ]
      if self.num_outs > len(laterals) and self.add_extra_convs:
          extra_source = inputs[self.backbone_end_level - 1]
          for extra_conv in self.extra_convs:
              extra_source = extra_conv(extra_source)
              laterals.append(extra_source)
  
      for bifpn_module in self.bifpn_convs:
          laterals = bifpn_module(laterals)
      outs = laterals
  
      return tuple(outs)
  
file_path: mmocr/projects/ABCNet/abcnet/model/bifpn.py
imports: from typing import List
  import torch
  import torch.nn
  import torch.nn.functional
  from mmcv.cnn import ConvModule
  from mmengine.model import BaseModule
  from mmocr.registry import MODELS
  from mmocr.utils import ConfigType, MultiConfig, OptConfigType
label_desc: Use image node_id 2 for calling the BiFPN obj's underlying member method code with example usage: obj.forward(inputs) and returns: tuple, outputs