class_docstr: KITTI tracking statistics (CLEAR MOT, id-switches, fragments, ML/PT/MT, precision/recall)
  MOTA       - Multi-object tracking accuracy in [0,100]
  MOTP       - Multi-object tracking precision in [0,100] (3D) / [td,100] (2D)
  MOTAL      - Multi-object tracking accuracy in [0,100] with log10(id-switches)
  
  id-switches - number of id switches
  fragments   - number of fragmentations
  
  MT, PT, ML - number of mostly tracked, partially tracked and mostly lost trajectories
  
  recall             - recall = percentage of detected targets
  precision      - precision = percentage of correctly detected targets
  FAR                    - number of false alarms per frame
  falsepositives - number of false positives (FP)
  missed         - number of missed targets (FN)
class_docstr_tok: ["KITTI","tracking","statistics","(","CLEAR","MOT",",","id-switches",",","fragments",",","ML\/PT\/MT",",","precision\/recall",")","MOTA","-","Multi-object","tracking","accuracy","in","[","0,100","]","MOTP","-","Multi-object","tracking","precision","in","[","0,100","]","(","3D",")","\/","[","td,100","]","(","2D",")","MOTAL","-","Multi-object","tracking","accuracy","in","[","0,100","]","with","log10","(","id-switches",")","id-switches","-","number","of","id","switches","fragments","-","number","of","fragmentations","MT",",","PT",",","ML","-","number","of","mostly","tracked",",","partially","tracked","and","mostly","lost","trajectories","recall","-","recall","=","percentage","of","detected","targets","precision","-","precision","=","percentage","of","correctly","detected","targets","FAR","-","number","of","false","alarms","per","frame","falsepositives","-","number","of","false","positives","(","FP",")","missed","-","number","of","missed","targets","(","FN",")"]
code: def createSummary(self):
      summary = ""
      summary += "tracking evaluation summary".center(80, "=") + "\n"
      summary += (
          self.printEntry(
              "Multiple Object Tracking Accuracy (MOTA)", self.MOTA
          )
          + "\n"
      )
      summary += (
          self.printEntry(
              "Multiple Object Tracking Precision (MOTP)", self.MOTP
          )
          + "\n"
      )
      summary += (
          self.printEntry(
              "Multiple Object Tracking Accuracy (MOTAL)", self.MOTAL
          )
          + "\n"
      )
      summary += (
          self.printEntry(
              "Multiple Object Detection Accuracy (MODA)", self.MODA
          )
          + "\n"
      )
      summary += (
          self.printEntry(
              "Multiple Object Detection Precision (MODP)", self.MODP
          )
          + "\n"
      )
      summary += "\n"
      summary += self.printEntry("Recall", self.recall) + "\n"
      summary += self.printEntry("Precision", self.precision) + "\n"
      summary += self.printEntry("F1", self.F1) + "\n"
      summary += self.printEntry("False Alarm Rate", self.FAR) + "\n"
      summary += "\n"
      summary += self.printEntry("Mostly Tracked", self.MT) + "\n"
      summary += self.printEntry("Partly Tracked", self.PT) + "\n"
      summary += self.printEntry("Mostly Lost", self.ML) + "\n"
      summary += "\n"
      summary += self.printEntry("True Positives", self.tp) + "\n"
      # summary += self.printEntry("True Positives per Sequence", self.tps) + "\n"
      summary += (
          self.printEntry("Ignored True Positives", self.itp) + "\n"
      )
      # summary += self.printEntry("Ignored True Positives per Sequence", self.itps) + "\n"
  
      summary += self.printEntry("False Positives", self.fp) + "\n"
      # summary += self.printEntry("False Positives per Sequence", self.fps) + "\n"
      summary += self.printEntry("False Negatives", self.fn) + "\n"
      # summary += self.printEntry("False Negatives per Sequence", self.fns) + "\n"
      summary += self.printEntry("ID-switches", self.id_switches) + "\n"
      self.fp = self.fp / self.n_gt
      self.fn = self.fn / self.n_gt
      self.id_switches = self.id_switches / self.n_gt
      summary += (
          self.printEntry("False Positives Ratio", self.fp) + "\n"
      )
      # summary += self.printEntry("False Positives per Sequence", self.fps) + "\n"
      summary += (
          self.printEntry("False Negatives Ratio", self.fn) + "\n"
      )
      # summary += self.printEntry("False Negatives per Sequence", self.fns) + "\n"
      summary += (
          self.printEntry("Ignored False Negatives Ratio", self.ifn)
          + "\n"
      )
  
      # summary += self.printEntry("Ignored False Negatives per Sequence", self.ifns) + "\n"
      summary += self.printEntry("Missed Targets", self.fn) + "\n"
      summary += self.printEntry("ID-switches", self.id_switches) + "\n"
      summary += (
          self.printEntry("Fragmentations", self.fragments) + "\n"
      )
      summary += "\n"
      summary += (
          self.printEntry(
              "Ground Truth Objects (Total)", self.n_gt + self.n_igt
          )
          + "\n"
      )
      # summary += self.printEntry("Ground Truth Objects (Total) per Sequence", self.n_gts) + "\n"
      summary += (
          self.printEntry("Ignored Ground Truth Objects", self.n_igt)
          + "\n"
      )
      # summary += self.printEntry("Ignored Ground Truth Objects per Sequence", self.n_igts) + "\n"
      summary += (
          self.printEntry(
              "Ground Truth Trajectories", self.n_gt_trajectories
          )
          + "\n"
      )
      summary += "\n"
      summary += (
          self.printEntry("Tracker Objects (Total)", self.n_tr) + "\n"
      )
      # summary += self.printEntry("Tracker Objects (Total) per Sequence", self.n_trs) + "\n"
      summary += (
          self.printEntry("Ignored Tracker Objects", self.n_itr) + "\n"
      )
      # summary += self.printEntry("Ignored Tracker Objects per Sequence", self.n_itrs) + "\n"
      summary += (
          self.printEntry(
              "Tracker Trajectories", self.n_tr_trajectories
          )
          + "\n"
      )
      # summary += "\n"
      # summary += self.printEntry("Ignored Tracker Objects with Associated Ignored Ground Truth Objects", self.n_igttr) + "\n"
      summary += "=" * 80
      return summary
  
imports: from __future__ import absolute_import
  from __future__ import division
  from __future__ import print_function
  import os
  import copy
  import sys
  import math
  from collections import defaultdict
  import numpy
  from ppdet.modeling.bbox_utils import bbox_iou_np_expand
  from .map_utils import ap_per_class
  from .metrics import Metric
  from .munkres import Munkres
  from ppdet.utils.logger import setup_logger
label_desc: Use image node_id 7 for calling the KITTIEvaluation obj's underlying member method code with example usage: obj.createSummary() and returns: summary