          The arguments to be passed to the extraction process as generated from Faceswap's command
          line arguments
      """
      def __init__(self,
                   extractor: Extractor,
                   arguments: Namespace) -> None:
          logger.debug("Initializing %s: (extractor: %s, args: %s)", self.__class__.__name__,
                       extractor, arguments)
          self._args = arguments
          self._output_dir = None if self._args.skip_saving_faces else get_folder(
              self._args.output_dir)
  
          logger.info("Output Directory: %s", self._output_dir)
          self._images = ImagesLoader(self._args.input_dir, fast_count=True)
          self._alignments = Alignments(self._args, True, self._images.is_video)
          self._extractor = extractor
 
</s> remove         The extractor pipeline for running extractions
    arguments: :class:`argparse.Namespace`
        The arguments to be passed to the extraction process as generated from Faceswap's command
        line arguments
 </s> add         The extractor pipeline for obtaining face identity from images </s> remove         logger.info("Output Directory: %s", self._output_dir)
        self._images = ImagesLoader(self._args.input_dir, fast_count=True)
        self._alignments = Alignments(self._args, True, self._images.is_video)
 </s> add         self._embeddings: List[np.ndarray] = [np.array([]) for _ in self._filter_files]
        self._nembeddings: List[np.ndarray] = [np.array([]) for _ in self._nfilter_files] </s> remove         self._existing_count = 0
        self._set_skip_list()

        self._post_process = PostProcess(arguments)
        self._threads: List[MultiThread] = []
        self._verify_output = False
 </s> add         self._get_embeddings()
        self._extractor.recognition.add_identity_filters(self.embeddings,
                                                         self.n_embeddings,
                                                         self._threshold) </s> remove         Checks against `extract_every_n` and the existence of alignments data (can exist if
        `skip_existing` or `skip_existing_faces` has been provided) and compiles a list of frame
        indices that should not be processed, providing these to :class:`lib.image.ImagesLoader`.
 </s> add     @classmethod
    def _validate_inputs(cls,
                         filter_files: Optional[Union[str, List[str]]],
                         nfilter_files: Optional[Union[str, List[str]]]) -> Tuple[List[str],
                                                                                  List[str]]:
        """ Validates that the given filter/nfilter files exist, are image files and are unique

        Parameters
        ----------
        filter_files: str, list or ``None``
            The list of filter file(s) passed in as command line arguments
        nfilter_files: str, list or ``None``
            The list of nfilter file(s) passed in as command line arguments

        Returns
        -------
        filter_files: list
            List of full paths to filter files
        nfilter_files: list
            List of full paths to nfilter files
                 threshold: float,
                 filter_files: Optional[Union[str, List[str]]],
                 nfilter_files: Optional[Union[str, List[str]]],
                 extractor: Extractor) -> None:
        logger.debug("Initializing %s: (threshold: %s, filter_files: %s, nfilter_files: %s "
                     "extractor: %s)", self.__class__.__name__, threshold, filter_files,
                     nfilter_files, extractor)
        self._threshold = threshold
        self._filter_files, self._nfilter_files = self._validate_inputs(filter_files,
                                                                        nfilter_files)

        if not self._filter_files and not self._nfilter_files:
            logger.debug("Filter not selected. Exiting %s", self.__class__.__name__)
            return
          The arguments to be passed to the extraction process as generated from Faceswap's command
          line arguments
      """
      def __init__(self,
                 threshold: float,
                 filter_files: Optional[Union[str, List[str]]],
                 nfilter_files: Optional[Union[str, List[str]]],
                 extractor: Extractor) -> None:
        logger.debug("Initializing %s: (threshold: %s, filter_files: %s, nfilter_files: %s "
                     "extractor: %s)", self.__class__.__name__, threshold, filter_files,
                     nfilter_files, extractor)
        self._threshold = threshold
        self._filter_files, self._nfilter_files = self._validate_inputs(filter_files,
                                                                        nfilter_files)

        if not self._filter_files and not self._nfilter_files:
            logger.debug("Filter not selected. Exiting %s", self.__class__.__name__)
            return
                 threshold: float,
                 filter_files: Optional[Union[str, List[str]]],
                 nfilter_files: Optional[Union[str, List[str]]],
                 extractor: Extractor) -> None:
        logger.debug("Initializing %s: (threshold: %s, filter_files: %s, nfilter_files: %s "
                     "extractor: %s)", self.__class__.__name__, threshold, filter_files,
                     nfilter_files, extractor)
        self._threshold = threshold
        self._filter_files, self._nfilter_files = self._validate_inputs(filter_files,
                                                                        nfilter_files)

        if not self._filter_files and not self._nfilter_files:
            logger.debug("Filter not selected. Exiting %s", self.__class__.__name__)
            return
                 threshold: float,
                 filter_files: Optional[Union[str, List[str]]],
                 nfilter_files: Optional[Union[str, List[str]]],
                 extractor: Extractor) -> None:
        logger.debug("Initializing %s: (threshold: %s, filter_files: %s, nfilter_files: %s "
                     "extractor: %s)", self.__class__.__name__, threshold, filter_files,
                     nfilter_files, extractor)
        self._threshold = threshold
        self._filter_files, self._nfilter_files = self._validate_inputs(filter_files,
                                                                        nfilter_files)

        if not self._filter_files and not self._nfilter_files:
            logger.debug("Filter not selected. Exiting %s", self.__class__.__name__)
            return
                 threshold: float,
                 filter_files: Optional[Union[str, List[str]]],
                 nfilter_files: Optional[Union[str, List[str]]],
                 extractor: Extractor) -> None:
        logger.debug("Initializing %s: (threshold: %s, filter_files: %s, nfilter_files: %s "
                     "extractor: %s)", self.__class__.__name__, threshold, filter_files,
                     nfilter_files, extractor)
        self._threshold = threshold
        self._filter_files, self._nfilter_files = self._validate_inputs(filter_files,
                                                                        nfilter_files)

        if not self._filter_files and not self._nfilter_files:
            logger.debug("Filter not selected. Exiting %s", self.__class__.__name__)
            return
                 threshold: float,
                 filter_files: Optional[Union[str, List[str]]],
                 nfilter_files: Optional[Union[str, List[str]]],
                 extractor: Extractor) -> None:
        logger.debug("Initializing %s: (threshold: %s, filter_files: %s, nfilter_files: %s "
                     "extractor: %s)", self.__class__.__name__, threshold, filter_files,
                     nfilter_files, extractor)
        self._threshold = threshold
        self._filter_files, self._nfilter_files = self._validate_inputs(filter_files,
                                                                        nfilter_files)

        if not self._filter_files and not self._nfilter_files:
            logger.debug("Filter not selected. Exiting %s", self.__class__.__name__)
            return
                 threshold: float,
                 filter_files: Optional[Union[str, List[str]]],
                 nfilter_files: Optional[Union[str, List[str]]],
                 extractor: Extractor) -> None:
        logger.debug("Initializing %s: (threshold: %s, filter_files: %s, nfilter_files: %s "
                     "extractor: %s)", self.__class__.__name__, threshold, filter_files,
                     nfilter_files, extractor)
        self._threshold = threshold
        self._filter_files, self._nfilter_files = self._validate_inputs(filter_files,
                                                                        nfilter_files)

        if not self._filter_files and not self._nfilter_files:
            logger.debug("Filter not selected. Exiting %s", self.__class__.__name__)
            return
                 threshold: float,
                 filter_files: Optional[Union[str, List[str]]],
                 nfilter_files: Optional[Union[str, List[str]]],
                 extractor: Extractor) -> None:
        logger.debug("Initializing %s: (threshold: %s, filter_files: %s, nfilter_files: %s "
                     "extractor: %s)", self.__class__.__name__, threshold, filter_files,
                     nfilter_files, extractor)
        self._threshold = threshold
        self._filter_files, self._nfilter_files = self._validate_inputs(filter_files,
                                                                        nfilter_files)

        if not self._filter_files and not self._nfilter_files:
            logger.debug("Filter not selected. Exiting %s", self.__class__.__name__)
            return
  
          logger.info("Output Directory: %s", self._output_dir)
          self._images = ImagesLoader(self._args.input_dir, fast_count=True)
          self._alignments = Alignments(self._args, True, self._images.is_video)
          self._extractor = extractor
keep keep keep keep replace replace replace replace replace replace replace keep keep keep keep keep
 Update Face Filter
  - Remove old face filter
  - plugins.extract.pipeline: Expose plugins directly
  - Change `is_aligned` from plugin level to ExtractMedia level
  - Allow extract pipeline to take faceswap aligned images
  - Add ability for recognition plugins to accept aligned faces as input
  - Add face filter to recognition plugin
  - Move extractor pipeline IO ops to own class 
scripts/extract.py