code: def info(self):
      total_time, average_latency, qps = self.get_total_time()
      print(
          "------------------ Inference Time Info ----------------------"
      )
      print(
          "total_time(ms): {}, img_num: {}".format(
              total_time * 1000, self.img_num
          )
      )
  
      for k, v in self.module_time.items():
          v_time = round(v.value(), 4)
          if v_time > 0 and k in ["det", "mot", "video_action"]:
              print(
                  "{} time(ms): {}; per frame average time(ms): {}".format(
                      k, v_time * 1000, v_time * 1000 / self.img_num
                  )
              )
          elif v_time > 0:
              print(
                  "{} time(ms): {}; per trackid average time(ms): {}".format(
                      k, v_time * 1000, v_time * 1000 / self.track_num
                  )
              )
  
      print(
          "average latency time(ms): {:.2f}, QPS: {:2f}".format(
              average_latency * 1000, qps
          )
      )
      return qps
  
imports: import time
  import os
  import ast
  import glob
  import yaml
  import copy
  import numpy
  import subprocess
  from python.keypoint_preprocess import EvalAffine, TopDownEvalAffine, expand_crop
label_desc: Use image node_id 3 for calling the PipeTimer obj's underlying member method code with example usage: obj.info() and returns: qps