class_docstr: Implementation of the SMOT tracker
  The steps to use the tracker is:
  0. Set anchors from the SSD
  1. First call tracker.predict(new_frame)
  2. Then get the tracking anchor information
  3. Run the detractor with the tracking anchor information
  4. Run tracker.update(new_detection, track_info).
class_docstr_tok: ["Implementation","of","the","SMOT","tracker","The","steps","to","use","the","tracker","is",":","0",".","Set","anchors","from","the","SSD","1",".","First","call","tracker.predict","(","new_frame",")","2",".","Then","get","the","tracking","anchor","information","3",".","Run","the","detractor","with","the","tracking","anchor","information","4",".","Run","tracker.update","(","new_detection",",","track_info",")","."]
docstr: Parameters
  ----------
  frame_iterator: each step it emits a tuple of (frame_id, frame_data)
  tracktor
  
  Returns
  -------
      results_iter:  a response iterator with one tuple (frame_id, frame_rst) per frame
docstr_tok: ["Parameters","--","--","--","--","--","frame_iterator",":","each","step","it","emits","a","tuple","of","(","frame_id",",","frame_data",")","tracktor","Returns","--","--","--","-","results_iter",":","a","response","iterator","with","one","tuple","(","frame_id",",","frame_rst",")","per","frame"]
code: def process_frame_sequence(self, frame_iterator, tracktor):
      """
      Parameters
      ----------
      frame_iterator: each step it emits a tuple of (frame_id, frame_data)
      tracktor
  
      Returns
      -------
          results_iter:  a response iterator with one tuple (frame_id, frame_rst) per frame
      """
      for frame_id, frame in frame_iterator:
          logging.info("Processing Frame ID: {}".format(frame_id))
          t_iter_start = time.time()
  
          # STEP 0: Prepare the tracktor with the new frame data
          motion_pred_data = tracktor.prepare_for_frame(frame)
  
          # STEP 1: Predict the new locations of the tracked bounding boxes in the tracker
          (
              tracking_anchor_indices,
              tracking_anchor_weights,
              tracking_classes,
          ) = self.motion_predict(frame, motion_pred_data)
  
          # STEP 2: Run the tracktor
          (
              detection_bboxes,
              detection_anchor_indices,
              tracking_bboxes,
              extra_info,
          ) = tracktor.detect_and_track(
              frame,
              tracking_anchor_indices,
              tracking_anchor_weights,
              tracking_classes,
          )
          if self.anchor_array is None:
              self.set_anchor_array(tracktor.anchors())
  
          # STEP 3: Update the tracker with detector responses
          self.update(
              detection_bboxes,
              tracking_bboxes,
              detection_anchor_indices,
              tracking_anchor_indices,
              tracking_anchor_weights,
              tracking_classes,
              extra_info,
          )
  
          # yield the results of this frame
          results = self._produce_frame_result()
  
          elapsed = time.time() - t_iter_start
          logging.info(
              "Total Tracking Runtime: {:2.4f} msec, {:.01f} FPS".format(
                  elapsed * 1000, 1 / elapsed
              )
          )
          yield frame_id, results
  
imports: from __future__ import absolute_import
  import logging
  import time
  import numpy
  import mxnet
  from gluoncv.utils.bbox import bbox_iou
  from gluoncv.data import COCODetection
  from .utils import timeit, Track
  from .motion_estimation import FarneBeckFlowMotionEstimator
  from .motion_estimation import DummyMotionEstimator
label_desc: Use image node_id 2 for calling the SMOTTracker obj's underlying member method code with example usage: obj.process_frame_sequence(frame_iterator, tracktor) without return types