text: """
  Vizualize: Code which converts .txt rle tracking results into a visual .png format.
  
  Author: Jonathon Luiten
  """
  
  import os
  import sys
  from multiprocessing.pool import Pool
  from multiprocessing import freeze_support
  
  sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..')))
  from trackeval.baselines import baseline_utils as butils
  from trackeval.utils import get_code_path
  from trackeval.datasets.rob_mots_classmap import cls_id_to_name
  
  code_path = get_code_path()
  config = {
      # Tracker format:
      'INPUT_FOL': os.path.join(code_path, 'data/trackers/rob_mots/{split}/STP/data/{bench}'),
      'OUTPUT_FOL': os.path.join(code_path, 'data/viz/rob_mots/{split}/STP/data/{bench}'),
      # GT format:
      # 'INPUT_FOL': os.path.join(code_path, 'data/gt/rob_mots/{split}/{bench}/data/'),
      # 'OUTPUT_FOL': os.path.join(code_path, 'data/gt_viz/rob_mots/{split}/{bench}/'),
      'SPLIT': 'train',  # valid: 'train', 'val', 'test'.
      'Benchmarks': None,  # If None, all benchmarks in SPLIT.
      'Num_Parallel_Cores': None,  # If None, run without parallel.
  }
  
  
  def do_sequence(seq_file):
      # Folder to save resulting visualization in
      out_fol = seq_file.replace(config['INPUT_FOL'].format(split=config['SPLIT'], bench=bench),
                                 config['OUTPUT_FOL'].format(split=config['SPLIT'], bench=bench)).replace('.txt', '')
  
      # Load input data from file (e.g. provided detections)
      # data format: data['cls'][t] = {'ids', 'scores', 'im_hs', 'im_ws', 'mask_rles'}
      data = butils.load_seq(seq_file)
  
      # Get frame size for visualizing empty frames
      im_h, im_w = butils.get_frame_size(data)
  
      # First run for each class.
      for cls, cls_data in data.items():
  
          if cls >= 100:
              continue
  
          # Run for each timestep.
          for timestep, t_data in enumerate(cls_data):
              # Save out visualization
              out_file = os.path.join(out_fol, cls_id_to_name[cls], str(timestep).zfill(5) + '.png')
              butils.save_as_png(t_data, out_file, im_h, im_w)
  
  
      # Then run for all classes combined
      # Converts data from a class-separated to a class-combined format.
      data = butils.combine_classes(data)
  
      # Run for each timestep.
      for timestep, t_data in enumerate(data):
          # Save out visualization
          out_file = os.path.join(out_fol, 'all_classes', str(timestep).zfill(5) + '.png')
          butils.save_as_png(t_data, out_file, im_h, im_w)
  
      print('DONE:', seq_file)
  
  
  if __name__ == '__main__':
  
      # Required to fix bug in multiprocessing on windows.
      freeze_support()
  
      # Obtain list of sequences to run tracker for.
      if config['Benchmarks']:
          benchmarks = config['Benchmarks']
      else:
          benchmarks = ['davis_unsupervised', 'kitti_mots', 'youtube_vis', 'ovis', 'bdd_mots', 'tao']
          if config['SPLIT'] != 'train':
              benchmarks += ['waymo', 'mots_challenge']
      seqs_todo = []
      for bench in benchmarks:
          bench_fol = config['INPUT_FOL'].format(split=config['SPLIT'], bench=bench)
          seqs_todo += [os.path.join(bench_fol, seq) for seq in os.listdir(bench_fol)]
  
      # Run in parallel
      if config['Num_Parallel_Cores']:
          with Pool(config['Num_Parallel_Cores']) as pool:
              results = pool.map(do_sequence, seqs_todo)
  
      # Run in series
      else:
          for seq_todo in seqs_todo:
              do_sequence(seq_todo)
  