code: def associate(
      detections,
      trackers,
      iou_threshold,
      velocities,
      previous_obs,
      vdc_weight,
  ):
      if len(trackers) == 0:
          return (
              np.empty((0, 2), dtype=int),
              np.arange(len(detections)),
              np.empty((0, 5), dtype=int),
          )
  
      Y, X = speed_direction_batch(detections, previous_obs)
      inertia_Y, inertia_X = velocities[:, 0], velocities[:, 1]
      inertia_Y = np.repeat(
          inertia_Y[:, np.newaxis], Y.shape[1], axis=1
      )
      inertia_X = np.repeat(
          inertia_X[:, np.newaxis], X.shape[1], axis=1
      )
      diff_angle_cos = inertia_X * X + inertia_Y * Y
      diff_angle_cos = np.clip(diff_angle_cos, a_min=-1, a_max=1)
      diff_angle = np.arccos(diff_angle_cos)
      diff_angle = (np.pi / 2.0 - np.abs(diff_angle)) / np.pi
  
      valid_mask = np.ones(previous_obs.shape[0])
      valid_mask[np.where(previous_obs[:, 4] < 0)] = 0
  
      iou_matrix = iou_batch(detections, trackers)
      scores = np.repeat(
          detections[:, -1][:, np.newaxis], trackers.shape[0], axis=1
      )
      # iou_matrix = iou_matrix * scores # a trick sometiems works, we don't encourage this
      valid_mask = np.repeat(
          valid_mask[:, np.newaxis], X.shape[1], axis=1
      )
  
      angle_diff_cost = (valid_mask * diff_angle) * vdc_weight
      angle_diff_cost = angle_diff_cost.T
      angle_diff_cost = angle_diff_cost * scores
  
      if min(iou_matrix.shape) > 0:
          a = (iou_matrix > iou_threshold).astype(np.int32)
          if a.sum(1).max() == 1 and a.sum(0).max() == 1:
              matched_indices = np.stack(np.where(a), axis=1)
          else:
              matched_indices = linear_assignment(
                  -(iou_matrix + angle_diff_cost)
              )
      else:
          matched_indices = np.empty(shape=(0, 2))
  
      unmatched_detections = []
      for d, det in enumerate(detections):
          if d not in matched_indices[:, 0]:
              unmatched_detections.append(d)
      unmatched_trackers = []
      for t, trk in enumerate(trackers):
          if t not in matched_indices[:, 1]:
              unmatched_trackers.append(t)
  
      # filter out matched with low IOU
      matches = []
      for m in matched_indices:
          if iou_matrix[m[0], m[1]] < iou_threshold:
              unmatched_detections.append(m[0])
              unmatched_trackers.append(m[1])
          else:
              matches.append(m.reshape(1, 2))
      if len(matches) == 0:
          matches = np.empty((0, 2), dtype=int)
      else:
          matches = np.concatenate(matches, axis=0)
  
      return (
          matches,
          np.array(unmatched_detections),
          np.array(unmatched_trackers),
      )
  
imports: import os
  import numpy
label_desc: Use image node_id 4 for calling a global function with example usage: associate(detections, trackers, iou_threshold, velocities, previous_obs, vdc_weight) and returns: matches,  np,  np, np,  np,  np