code: def _compute_part_ious(self, segl, segp, cat):
      part_ious = np.zeros(len(self._class_seg_map[cat]))
      for l in self._class_seg_map[cat]:
          if np.sum((segl == l) | (segp == l)) == 0:
              # part is not present in this shape
              part_ious[l - self._class_seg_map[cat][0]] = 1
          else:
              part_ious[l - self._class_seg_map[cat][0]] = float(
                  np.sum((segl == l) & (segp == l))
              ) / float(np.sum((segl == l) | (segp == l)))
      return part_ious
  
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 6 for calling the ShapenetPartTracker obj's underlying member method code with example usage: obj._compute_part_ious(segl, segp, cat) and returns: part_ious