class_docstr: A mask point head use in PointRend.
  
  ``MaskPointHead`` use shared multi-layer perceptron (equivalent to
  nn.Conv1d) to predict the logit of input points. The fine-grained feature
  and coarse feature will be concatenate together for predication.
  
  Args:
      num_fcs (int): Number of fc layers in the head. Default: 3.
      in_channels (int): Number of input channels. Default: 256.
      fc_channels (int): Number of fc channels. Default: 256.
      num_classes (int): Number of classes for logits. Default: 80.
      class_agnostic (bool): Whether use class agnostic classification.
          If so, the output channels of logits will be 1. Default: False.
      coarse_pred_each_layer (bool): Whether concatenate coarse feature with
          the output of each fc layer. Default: True.
      conv_cfg (dict | None): Dictionary to construct and config conv layer.
          Default: dict(type='Conv1d'))
      norm_cfg (dict | None): Dictionary to construct and config norm layer.
          Default: None.
      loss_point (dict): Dictionary to construct and config loss layer of
          point head. Default: dict(type='CrossEntropyLoss', use_mask=True,
          loss_weight=1.0).
docstr: Classify each point base on fine grained and coarse feats.
  
  Args:
      fine_grained_feats (Tensor): Fine grained feature sampled from FPN,
          shape (num_rois, in_channels, num_points).
      coarse_feats (Tensor): Coarse feature sampled from CoarseMaskHead,
          shape (num_rois, num_classes, num_points).
  
  Returns:
      Tensor: Point classification results,
          shape (num_rois, num_class, num_points).
docstr_tok: ["Classify","each","point","base","on","fine","grained","and","coarse","feats",".","Args",":","fine_grained_feats","(","Tensor",")",":","Fine","grained","feature","sampled","from","FPN",",","shape","(","num_rois",",","in_channels",",","num_points",")",".","coarse_feats","(","Tensor",")",":","Coarse","feature","sampled","from","CoarseMaskHead",",","shape","(","num_rois",",","num_classes",",","num_points",")",".","Returns",":","Tensor",":","Point","classification","results",",","shape","(","num_rois",",","num_class",",","num_points",")","."]
code: def forward(self, fine_grained_feats, coarse_feats):
      """Classify each point base on fine grained and coarse feats.
  
      Args:
          fine_grained_feats (Tensor): Fine grained feature sampled from FPN,
              shape (num_rois, in_channels, num_points).
          coarse_feats (Tensor): Coarse feature sampled from CoarseMaskHead,
              shape (num_rois, num_classes, num_points).
  
      Returns:
          Tensor: Point classification results,
              shape (num_rois, num_class, num_points).
      """
  
      x = torch.cat([fine_grained_feats, coarse_feats], dim=1)
      for fc in self.fcs:
          x = fc(x)
          if self.coarse_pred_each_layer:
              x = torch.cat((x, coarse_feats), dim=1)
      return self.fc_logits(x)
  
file_path: insightface/detection/scrfd/mmdet/models/roi_heads/mask_heads/mask_point_head.py
imports: import torch
  import torch.nn
  from mmcv.cnn import ConvModule, normal_init
  from mmcv.ops import point_sample, rel_roi_point_to_rel_img_point
  from mmdet.models.builder import HEADS, build_loss
label_desc: Use image node_id 3 for calling the MaskPointHead obj's underlying member method code with example usage: obj.forward(fine_grained_feats, coarse_feats) and returns: self