text: # --------------------------------------------------------
  # Deformable Convolutional Networks
  # Copyright (c) 2017 Microsoft
  # Licensed under The MIT License [see LICENSE for details]
  # Modified by Zheng Zhang
  # --------------------------------------------------------
  # Based on:
  # MX-RCNN
  # Copyright (c) 2016 by Contributors
  # Licence under The Apache 2.0 License
  # https://github.com/ijkguo/mx-rcnn/
  # --------------------------------------------------------
  
  import time
  import logging
  import mxnet as mx
  
  class Speedometer(object):
      def __init__(self, batch_size, frequent=50):
          self.batch_size = batch_size
          self.frequent = frequent
          self.init = False
          self.tic = 0
          self.last_count = 0
  
      def __call__(self, param):
          """Callback to Show speed."""
          count = param.nbatch
          if self.last_count > count:
              self.init = False
          self.last_count = count
  
          if self.init:
              if count % self.frequent == 0:
                  speed = self.frequent * self.batch_size / (time.time() - self.tic)
                  s = ''
                  if param.eval_metric is not None:
                      name, value = param.eval_metric.get()
                      s = "Epoch[%d] Batch [%d]\tSpeed: %.2f samples/sec\tTrain-" % (param.epoch, count, speed)
                      for n, v in zip(name, value):
                          s += "%s=%f,\t" % (n, v)
                  else:
                      s = "Iter[%d] Batch [%d]\tSpeed: %.2f samples/sec" % (param.epoch, count, speed)
  
                  logging.info(s)
                  print(s)
                  self.tic = time.time()
          else:
              self.init = True
              self.tic = time.time()
  