code: def _add_box_pred(
      self, outputs: VoteNetResults, input_data, conv_type
  ):
      # Track box predictions
      pred_boxes = outputs.get_boxes(
          self._dataset, apply_nms=True, duplicate_boxes=False
      )
      if input_data.id_scan is None:
          raise ValueError(
              "Cannot track boxes without knowing in which scan they are"
          )
  
      scan_ids = input_data.id_scan
      assert len(scan_ids) == len(pred_boxes)
      for idx, scan_id in enumerate(scan_ids):
          # Predictions
          self._pred_boxes[scan_id.item()] = pred_boxes[idx]
  
          # Ground truth
          sample_mask = idx
          gt_boxes = input_data.instance_box_corners[sample_mask]
          gt_boxes = gt_boxes[input_data.box_label_mask[sample_mask]]
          sample_labels = input_data.sem_cls_label[sample_mask]
          gt_box_data = [
              BoxData(sample_labels[i].item(), gt_boxes[i])
              for i in range(len(gt_boxes))
          ]
          self._gt_boxes[scan_id.item()] = gt_box_data
  
imports: from typing import Dict, List, Any
  import torchnet
  import torch
  from collections import OrderedDict
  from torch_points3d.models.model_interface import TrackerInterface
  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.modules.VoteNet import VoteNetResults
  from torch_points3d.datasets.object_detection.box_data import BoxData
  from .box_detection.ap import eval_detection
label_desc: Use image node_id 5 for calling the ObjectDetectionTracker obj's underlying member method code with example usage: obj._add_box_pred(outputs, input_data, conv_type) without return types