code: def forward(self, epoch=-1, **kwargs):
      # Backbone
      backbone_features = self.Backbone(self.input).x
  
      # Semantic and offset heads
      semantic_logits = self.Semantic(backbone_features)
      offset_logits = self.Offset(backbone_features)
  
      # Grouping and scoring
      cluster_scores = None
      all_clusters = None
      cluster_type = None
      if (
          epoch == -1 or epoch > self.opt.prepare_epoch
      ):  # Active by default
          all_clusters, cluster_type = self._cluster(
              semantic_logits, offset_logits
          )
          if len(all_clusters):
              cluster_scores = self._compute_score(
                  all_clusters, backbone_features, semantic_logits
              )
  
      self.output = PanopticResults(
          semantic_logits=semantic_logits,
          offset_logits=offset_logits,
          clusters=all_clusters,
          cluster_scores=cluster_scores,
          cluster_type=cluster_type,
      )
  
      # Sets visual data for debugging
      with torch.no_grad():
          self._dump_visuals(epoch)
  
imports: import torch
  import os
  from torch_points_kernels import region_grow
  from torch_geometric.data import Data
  from torch_scatter import scatter
  import random
  from torch_points3d.datasets.segmentation import IGNORE_LABEL
  from torch_points3d.models.base_model import BaseModel
  from torch_points3d.applications.minkowski import Minkowski
  from torch_points3d.core.common_modules import Seq, MLP, FastBatchNorm1d
  from torch_points3d.core.losses import offset_loss, instance_iou_loss
  from torch_points3d.core.data_transform import GridSampling3D
  from .structures import PanopticLabels, PanopticResults
  from torch_points3d.utils import is_list
label_desc: Use image node_id 3 for calling the PointGroup obj's underlying member method code with example usage: obj.forward(epoch) without return types