code: def forward(self, *args, **kwargs):
      x = self.pointnet_seg(self.input_features, self.input.batch)
      self.output = x
  
      internal_loss = self.get_internal_loss()
  
      if self.labels is not None:
          self.loss_seg = F.cross_entropy(
              self.output, self.labels, ignore_index=IGNORE_LABEL
          )
          self.loss_internal = (
              internal_loss if internal_loss.item() != 0 else 0
          ) * 0.001
          self.loss = self.loss_seg + self.loss_internal
  
      self.data_visual = self.input
      self.data_visual.pred = torch.max(self.output, -1)[1]
      return self.output
  
imports: import torch.nn.functional
  import logging
  from omegaconf import OmegaConf
  from torch_points3d.core.base_conv.base_conv import *
  from torch_points3d.core.common_modules.base_modules import *
  from torch_points3d.utils.config import ConvolutionFormatFactory
  from torch_points3d.modules.PointNet import *
  from torch_points3d.models.base_model import BaseModel
  from torch_points3d.utils.model_building_utils.resolver_utils import flatten_dict
  from torch_points3d.datasets.segmentation import IGNORE_LABEL
label_desc: Use image node_id 4 for calling the PointNet obj's underlying member method code with example usage: obj.forward() and returns: self