code: def publish_to_wandb(self, metrics, epoch):
      super().publish_to_wandb(metrics, epoch)
  
      # write confusion matrix out to wandb
      # flatten cm indices
      cm_indices = np.array(
          list(np.ndindex(self.confusion_matrix.shape))
      )
      # flatten cm values, make 2d
      cm_num_preds = self.confusion_matrix.flatten().reshape(-1, 1)
      # merge into a (c^2, c^2, 3) array for number of classes "c"
      stacked = np.concatenate((cm_indices, cm_num_preds), axis=1)
  
      fields = {
          "Actual": "Actual",
          "Predicted": "Predicted",
          "nPredictions": "nPredictions",
      }
  
      cm = wandb.plot_table(
          "wandb/confusion_matrix/v1",
          wandb.Table(
              columns=["Actual", "Predicted", "nPredictions"],
              data=stacked,
          ),
          fields,
          {"title": "Confusion Matrix"},
      )
  
      table_name = "%s/conf_mat" % self._stage
      wandb.log({table_name: cm})
  
file_path: torch-points3d/torch_points3d/metrics/segmentation_tracker.py
imports: from typing import Dict, Any
  import torch
  import wandb
  import numpy
  from torch_points3d.metrics.confusion_matrix import ConfusionMatrix
  from torch_points3d.metrics.base_tracker import BaseTracker, meter_value
  from torch_points3d.metrics.meters import APMeter
  from torch_points3d.datasets.segmentation import IGNORE_LABEL
  from torch_points3d.models import model_interface
label_desc: Use image node_id 9 for calling the SegmentationTracker obj's underlying member method code with example usage: obj.publish_to_wandb(metrics, epoch) without return types