code: def matching_cascade(
      distance_metric,
      max_distance,
      cascade_depth,
      tracks,
      detections,
      track_indices=None,
      detection_indices=None,
  ):
      """
      Run matching cascade.
  
      Args:
          distance_metric :
              Callable[List[Track], List[Detection], List[int], List[int]) -> ndarray
              The distance metric is given a list of tracks and detections as
              well as a list of N track indices and M detection indices. The
              metric should return the NxM dimensional cost matrix, where element
              (i, j) is the association cost between the i-th track in the given
              track indices and the j-th detection in the given detection_indices.
          max_distance (float): Gating threshold. Associations with cost larger
              than this value are disregarded.
          cascade_depth (int): The cascade depth, should be se to the maximum
              track age.
          tracks (list[Track]): A list of predicted tracks at the current time
              step.
          detections (list[Detection]): A list of detections at the current time
              step.
          track_indices (list[int]): List of track indices that maps rows in
              `cost_matrix` to tracks in `tracks`.
          detection_indices (List[int]): List of detection indices that maps
              columns in `cost_matrix` to detections in `detections`.
  
      Returns:
          A tuple (List[(int, int)], List[int], List[int]) with the following
          three entries:
              * A list of matched track and detection indices.
              * A list of unmatched track indices.
              * A list of unmatched detection indices.
      """
      if track_indices is None:
          track_indices = list(range(len(tracks)))
      if detection_indices is None:
          detection_indices = list(range(len(detections)))
  
      unmatched_detections = detection_indices
      matches = []
      for level in range(cascade_depth):
          if len(unmatched_detections) == 0:  # No detections left
              break
  
          track_indices_l = [
              k
              for k in track_indices
              if tracks[k].time_since_update == 1 + level
          ]
          if (
              len(track_indices_l) == 0
          ):  # Nothing to match at this level
              continue
  
          matches_l, _, unmatched_detections = min_cost_matching(
              distance_metric,
              max_distance,
              tracks,
              detections,
              track_indices_l,
              unmatched_detections,
          )
          matches += matches_l
      unmatched_tracks = list(
          set(track_indices) - set(k for k, _ in matches)
      )
      return matches, unmatched_tracks, unmatched_detections
  
file_path: PaddleHub/modules/video/multiple_object_tracking/jde_darknet53/modeling/mot/matching/deepsort_matching.py
imports: import numpy
  from scipy.optimize import linear_sum_assignment
  from ..motion import kalman_filter
label_desc: Use image node_id 6 for calling a global function with example usage: matching_cascade(distance_metric, max_distance, cascade_depth, tracks, detections, track_indices, detection_indices) and returns: matches,  unmatched_tracks,  unmatched_detections