old_contents: '''
  Misc Utility functions
  '''
  
  import os
  
  def recursive_glob(rootdir='.', suffix=''):
      """Performs recursive glob with given suffix and rootdir 
          :param rootdir is the root directory
          :param suffix is the suffix to be searched
      """
      return [os.path.join(looproot, filename)
          for looproot, _, filenames in os.walk(rootdir)
          for filename in filenames if filename.endswith(suffix)]
  
  def poly_lr_scheduler(optimizer, init_lr, iter, lr_decay_iter=1, max_iter=30000, power=0.9,):
      """Polynomial decay of learning rate
          :param init_lr is base learning rate
          :param iter is a current iteration
          :param lr_decay_iter how frequently decay occurs, default is 1
          :param max_iter is number of maximum iterations
          :param power is a polymomial power
  
      """
      if iter % lr_decay_iter or iter > max_iter:
          return optimizer
  
      for param_group in optimizer.param_groups:
          param_group['lr'] = init_lr*(1 - iter/max_iter)**power
  
  
  def adjust_learning_rate(optimizer, init_lr, epoch):
      """Sets the learning rate to the initial LR decayed by 10 every 30 epochs"""
      lr = init_lr * (0.1 ** (epoch // 30))
      for param_group in optimizer.param_groups:
          param_group['lr'] = lr
new_contents: '''
  Misc Utility functions
  '''
  
  import os
  import numpy as np
  
  def recursive_glob(rootdir='.', suffix=''):
      """Performs recursive glob with given suffix and rootdir 
          :param rootdir is the root directory
          :param suffix is the suffix to be searched
      """
      return [os.path.join(looproot, filename)
          for looproot, _, filenames in os.walk(rootdir)
          for filename in filenames if filename.endswith(suffix)]
  
  def poly_lr_scheduler(optimizer, init_lr, iter, lr_decay_iter=1, max_iter=30000, power=0.9,):
      """Polynomial decay of learning rate
          :param init_lr is base learning rate
          :param iter is a current iteration
          :param lr_decay_iter how frequently decay occurs, default is 1
          :param max_iter is number of maximum iterations
          :param power is a polymomial power
  
      """
      if iter % lr_decay_iter or iter > max_iter:
          return optimizer
  
      for param_group in optimizer.param_groups:
          param_group['lr'] = init_lr*(1 - iter/max_iter)**power
  
  
  def adjust_learning_rate(optimizer, init_lr, epoch):
      """Sets the learning rate to the initial LR decayed by 10 every 30 epochs"""
      lr = init_lr * (0.1 ** (epoch // 30))
      for param_group in optimizer.param_groups:
          param_group['lr'] = lr
  
  
  def alpha_blend(input_image, segmentation_mask, alpha=0.5):
      """Alpha Blending utility to overlay RGB masks on RBG images 
          :param input_image is a np.ndarray with 3 channels
          :param segmentation_mask is a np.ndarray with 3 channels
          :param alpha is a float value
  
      """
      blended = np.zeros(input_image.size, dtype=np.float32)
      blended = input_image * alpha + segmentation_mask * (1 - alpha)
      return blended
subject: Add alpha blending utility