code: def finalise(self, **kwargs):
      # Check if at least one element has been created for full res interpolation
      contains_elements = (
          np.sum([bool(d) for d in list(self._full_res_scans.values())])
          > 0
      )
      if not contains_elements:
          return
  
      for cat in self._full_res_scans.keys():
          samples = self._full_res_scans[cat].values()
          for sample in samples:
              segl = sample.full_res_labels.numpy()
              segp = sample.full_res_preds.numpy()
              part_ious = self._compute_part_ious(segl, segp, cat)
              self._full_shape_ious[cat].append(np.mean(part_ious))
      (
          self._full_miou_per_class,
          self._full_Cmiou,
          self._full_Imiou,
      ) = ShapenetPartTracker._get_metrics_per_class(
          self._full_shape_ious
      )
  
      self._full_res = True
  
file_path: torch-points3d/torch_points3d/metrics/shapenet_part_tracker.py
imports: import numpy
  from .confusion_matrix import ConfusionMatrix
  from .base_tracker import meter_value, BaseTracker
  from torch_geometric.data import Data
  from torch_points3d.models import model_interface
  from torch_points3d.core.data_transform import SaveOriginalPosId
  from torch_points3d.metrics.segmentation_helpers import SegmentationVoter
label_desc: Use image node_id 5 for calling the ShapenetPartTracker obj's underlying member method code with example usage: obj.finalise() without return types