repo_description: [CVPR 2021, Oral] PREDATOR: Registration of 3D Point Clouds with Low Overlap. 
repo_topics: 3dvision attention-mechanism point-cloud registration transformer
code: import time
  
  
  class AverageMeter(object):
      """Computes and stores the average and current value"""
  
      def __init__(self):
          self.reset()
  
      def reset(self):
          self.val = 0
          self.avg = 0
          self.sum = 0.0
          self.sq_sum = 0.0
          self.count = 0
  
      def update(self, val, n=1):
          self.val = val
          self.sum += val * n
          self.count += n
          self.avg = self.sum / self.count
          self.sq_sum += val ** 2 * n
          self.var = self.sq_sum / self.count - self.avg ** 2
  
  
  class Timer(object):
      """A simple timer."""
  
      def __init__(self):
          self.total_time = 0.
          self.calls = 0
          self.start_time = 0.
          self.diff = 0.
          self.avg = 0.
  
      def reset(self):
          self.total_time = 0
          self.calls = 0
          self.start_time = 0
          self.diff = 0
          self.avg = 0
  
      def tic(self):
          # using time.time instead of time.clock because time time.clock
          # does not normalize for multithreading
          self.start_time = time.time()
  
      def toc(self, average=True):
          self.diff = time.time() - self.start_time
          self.total_time += self.diff
          self.calls += 1
          self.avg = self.total_time / self.calls
          if average:
              return self.avg
          else:
              return self.diff
  