          configfile = self.args.configfile if hasattr(self.args, "configfile") else None
          normalization = None if self.args.normalization == "none" else self.args.normalization
          self.extractor = Extractor(self.args.detector,
                                     self.args.aligner,
                                     self.args.loglevel,
                                     configfile=configfile,
                                     multiprocess=not self.args.singleprocess,
                                     rotate_images=self.args.rotate_images,
                                     min_size=self.args.min_size,
                                     normalize_method=normalization)
 
</s> remove         self.extractor = dict()
        self.init_extractor(loglevel)
 </s> add         self.queues = dict()
        self.extractor = self.init_extractor() </s> remove                                loglevel=self.args.loglevel,
 </s> add  </s> remove         kwargs = {"in_queue": self.queues["extract_detect_in"],
                  "out_queue": self.queues["extract_align_in"]}
        mp_func = PoolProcess if self.detector.parent_is_pool else SpawnProcess
        process = mp_func(self.detector.run, **kwargs)

        event = process.event if hasattr(process, "event") else None
        error = process.error if hasattr(process, "error") else None
        process.start()
        self.processes.append(process)

        if event is None:
            logger.debug("Launched Detector")
            return

        for mins in reversed(range(5)):
            for seconds in range(60):
                event.wait(seconds)
                if event.is_set():
                    break
                if error and error.is_set():
                    break
            if event.is_set():
                break
            if mins == 0 or (error and error.is_set()):
                raise ValueError("Error initializing Detector")
            logger.info("Waiting for Detector... Time out in %s minutes", mins)

 </s> add         kwargs = dict(in_queue=self._queues["extract_detect_in"],
                      out_queue=self._queues["extract_align_in"],
                      queue_size=self._queue_size)
        self._detector.initialize(**kwargs)
        self._detector.start() </s> remove         # The input and output queues for the plugin.
        # See lib.queue_manager.QueueManager for getting queues
        self.queues = {"in": None, "out": None}
 </s> add     Other Parameters
    ----------------
    configfile: str, optional
        Path to a custom configuration ``ini`` file. Default: Use system configfile </s> remove         retval = self.queues[qname]
        logger.trace("%s: %s", qname, retval)
        return retval

    @property
    def output_queue(self):
        """ Return the correct output queue depending on the current phase """
        qname = "extract_align_out" if self.final_pass else "extract_align_in"
        retval = self.queues[qname]
 </s> add         retval = self._queues[qname]
          configfile = self.args.configfile if hasattr(self.args, "configfile") else None
          normalization = None if self.args.normalization == "none" else self.args.normalization
          self.extractor = Extractor(self.args.detector,
                                     self.args.aligner,

                                     configfile=configfile,
                                     multiprocess=not self.args.singleprocess,
                                     rotate_images=self.args.rotate_images,
                                     min_size=self.args.min_size,
                                     normalize_method=normalization)
keep keep keep keep replace 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 
scripts/extract.py