                      aligner: Optional[str],
                      configfile: Optional[str],
                      normalize_method: Optional[str],
                      re_feed: int) -> Optional["Aligner"]:
          """ Set global arguments and load aligner plugin """
          if aligner is None or aligner.lower() == "none":
              logger.debug("No aligner selected. Returning None")
              return None
          aligner_name = aligner.replace("-", "_").lower()
          logger.debug("Loading Aligner: '%s'", aligner_name)
 
</s> remove                     normalize_method: Optional[str],
 </s> add                     normalize_method: Optional[Literal["none", "clahe", "hist", "mean"]], </s> remove     def get_batch(self, queue):
 </s> add     def get_batch(self, queue: "Queue") -> Tuple[bool, AlignerBatch]: </s> remove         self._normalize_method = method
 </s> add         self._normalize_method = cast(Optional[Literal["clahe", "hist", "mean"]], method) </s> remove                  min_size: int = 20,
                 normalize_method: Optional[str] = None,
 </s> add                  min_size: int = 0,
                 normalize_method:  Optional[Literal["none", "clahe", "hist", "mean"]] = None, </s> remove     def predict(self, batch):
        """ Predict the 68 point landmarks """
 </s> add     def predict(self, batch: np.ndarray) -> np.ndarray:
        """ Predict the 68 point landmarks

        Parameters
        ----------
        batch: :class:`numpy.ndarray`
            The batch to feed into the aligner

        Returns
        -------
        :class:`numpy.ndarray`
            The predictions from the aligner
        """
        """ Set global arguments and load aligner plugin

        Parameters
        ----------
        aligner: str
            The aligner plugin to load or ``None`` for no aligner
        configfile: str
            Optional full path to custom config file
        normalize_method: str
            Optional normalization method to use
        re_feed: int
            The number of times to adjust the image and re-feed to get an average score

        Returns
        -------
        Aligner plugin if one is specified otherwise ``None``
        """
                      aligner: Optional[str],
                      configfile: Optional[str],
                      normalize_method: Optional[str],
                      re_feed: int) -> Optional["Aligner"]:
        """ Set global arguments and load aligner plugin

        Parameters
        ----------
        aligner: str
            The aligner plugin to load or ``None`` for no aligner
        configfile: str
            Optional full path to custom config file
        normalize_method: str
            Optional normalization method to use
        re_feed: int
            The number of times to adjust the image and re-feed to get an average score

        Returns
        -------
        Aligner plugin if one is specified otherwise ``None``
        """
          if aligner is None or aligner.lower() == "none":
              logger.debug("No aligner selected. Returning None")
              return None
          aligner_name = aligner.replace("-", "_").lower()
          logger.debug("Loading Aligner: '%s'", aligner_name)
keep keep keep keep replace keep keep keep keep keep
 Extract updates:
  - Default CPU detector to MTCNN
  - add basic Aligner false positive filters
  - Typing: align + plugins
  - Use specific AlignerBatch class for alignment
  - 
plugins/extract/pipeline.py