      rootlogger = logging.getLogger()
      rootlogger.setLevel(loglevel)
  
  
  def log_setup(loglevel, logfile, command, is_gui=False):
      """ initial log set up. """
      numeric_loglevel = get_loglevel(loglevel)
 
</s> remove     q_handler = QueueHandler(queue)
    rootlogger.addHandler(q_handler)
 </s> add  </s> remove     set_root_logger(loglevel=root_loglevel)
 </s> add     rootlogger = set_root_logger(loglevel=root_loglevel) </s> remove def set_root_logger(loglevel=logging.INFO, queue=LOG_QUEUE):
    """ Setup the root logger.
        Loaded in main process and into any spawned processes
        Automatically added in multithreading.py"""
 </s> add def set_root_logger(loglevel=logging.INFO):
    """ Setup the root logger. """ </s> remove 
    q_listener = QueueListener(LOG_QUEUE, f_handler, s_handler, c_handler,
                               respect_handler_level=True)
    q_listener.start()
 </s> add     rootlogger.addHandler(f_handler)
    rootlogger.addHandler(s_handler)
    rootlogger.addHandler(c_handler) </s> remove             return image, None
        return self.rotate_image_by_angle(image, angle)
 </s> add             # Set the initial batch so we always rotate from zero
            batch["initial_feed"] = batch["feed"].copy()
            return

        retval = dict()
        for img, faces, rotmat in zip(batch["initial_feed"], batch["prediction"], batch["rotmat"]):
            if faces.any():
                image = np.zeros_like(img)
                matrix = rotmat
            else:
                image, matrix = self._rotate_image_by_angle(img, angle)
            retval.setdefault("feed", []).append(image)
            retval.setdefault("rotmat", []).append(matrix)
        batch["feed"] = np.array(retval["feed"], dtype="float32")
        batch["rotmat"] = retval["rotmat"]
    return rootlogger
      rootlogger = logging.getLogger()
      rootlogger.setLevel(loglevel)
    return rootlogger
  
  
  def log_setup(loglevel, logfile, command, is_gui=False):
      """ initial log set up. """
      numeric_loglevel = get_loglevel(loglevel)
keep add keep keep keep keep keep
 De-Multiprocess Extract (#871)

* requirements.txt: - Pin opencv to 4.1.1 (fixes cv2-dnn error)

* lib.face_detect.DetectedFace: change LandmarksXY to landmarks_xy. Add left, right, top, bottom attributes

* lib.model.session: Session manager for loading models into different graphs (for Nvidia + CPU)

* plugins.extract._base: New parent class for all extract plugins

* plugins.extract.pipeline. Remove MultiProcessing. Dynamically limit batchsize for Nvidia cards. Remove loglevel input

* S3FD + FAN plugins. Standardise to Keras version for all backends

* Standardize all extract plugins to new threaded codebase

* Documentation. Start implementing Numpy style docstrings for Sphinx Documentation

* Remove s3fd_amd. Change convert OTF to expect DetectedFace object

* faces_detect - clean up and documentation

* Remove PoolProcess

* Migrate manual tool to new extract workflow

* Remove AMD specific extractor code from cli and plugins

* Sort tool to new extract workflow

* Remove multiprocessing from project

* Remove multiprocessing queues from QueueManager

* Remove multiprocessing support from logger

* Move face_filter to new extraction pipeline

* Alignments landmarksXY > landmarks_xy and legacy handling

* Intercept get_backend for sphinx doc build

# Add Sphinx documentation 
lib/logger.py