code: def finalise(self, full_res=False, make_submission=False, **kwargs):
      if not full_res and not make_submission:
          return
  
      self._predict_full_res()
  
      # Compute full res metrics
      if self._dataset.has_labels(self._stage):
          for scan_id in self._full_preds:
              full_labels = self._raw_datas[scan_id].y
              # Mask ignored labels
              mask = full_labels != self._ignore_label
              full_labels = full_labels[mask]
              full_preds = self._full_preds[scan_id].cpu()[mask].numpy()
              self._full_confusion_matrix.count_predicted_batch(
                  full_labels, full_preds
              )
  
          self._full_acc = (
              100 * self._full_confusion_matrix.get_overall_accuracy()
          )
          self._full_macc = (
              100
              * self._full_confusion_matrix.get_mean_class_accuracy()
          )
          self._full_miou = (
              100
              * self._full_confusion_matrix.get_average_intersection_union()
          )
  
      # Save files to disk
      if make_submission and self._stage == "test":
          self._make_submission()
  
file_path: torch-points3d/torch_points3d/metrics/scannet_segmentation_tracker.py
imports: import os.path
  from typing import Dict, Any
  import logging
  import numpy
  import torch
  from torch_geometric.nn.unpool import knn_interpolate
  from torch_points3d.metrics.confusion_matrix import ConfusionMatrix
  from torch_points3d.metrics.segmentation_tracker import SegmentationTracker
  from torch_points3d.datasets.segmentation import IGNORE_LABEL
  from torch_points3d.core.data_transform import SaveOriginalPosId
  from torch_points3d.models import model_interface
label_desc: Use image node_id 4 for calling the ScannetSegmentationTracker obj's underlying member method code with example usage: obj.finalise(full_res, make_submission) without return types