          logger.trace(retval)
          return retval
  
      # <<< PREDICT WRAPPER >>> #
      def _predict(self, batch):
          """ Just return the aligner's predict function """
          try:
              batch["prediction"] = [self.predict(feed) for feed in batch["feed"]]
              return batch
          except tf_errors.ResourceExhaustedError as err:
              msg = ("You do not have enough GPU memory available to run detection at the "
 
</s> remove             batch["prediction"] = [self.predict(feed) for feed in batch["feed"]]
 </s> add             batch.prediction = np.array([self.predict(feed) for feed in batch.feed]) </s> remove         logger.trace(retval)
 </s> add         logger.trace(retval)  # type:ignore </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
        """ </s> remove         logger.trace(retval.shape)
 </s> add         logger.trace(retval.shape)  # type:ignore </s> remove     def finalize(self, batch):
 </s> add     def finalize(self, batch: AlignerBatch) -> Generator[ExtractMedia, None, None]:
    def _predict(self, batch: AlignerBatch) -> AlignerBatch:
        """ Just return the aligner's predict function

        Parameters
        ----------
        batch: :class:`AlignerBatch`
            The current batch to find alignments for

        Returns
        -------
        :class:`AlignerBatch`
            The batch item with the :attr:`prediction` populated

        Raises
        ------
        FaceswapError
            If GPU resources are exhausted
        """
          logger.trace(retval)
          return retval
  
      # <<< PREDICT WRAPPER >>> #
    def _predict(self, batch: AlignerBatch) -> AlignerBatch:
        """ Just return the aligner's predict function

        Parameters
        ----------
        batch: :class:`AlignerBatch`
            The current batch to find alignments for

        Returns
        -------
        :class:`AlignerBatch`
            The batch item with the :attr:`prediction` populated

        Raises
        ------
        FaceswapError
            If GPU resources are exhausted
        """
    def _predict(self, batch: AlignerBatch) -> AlignerBatch:
        """ Just return the aligner's predict function

        Parameters
        ----------
        batch: :class:`AlignerBatch`
            The current batch to find alignments for

        Returns
        -------
        :class:`AlignerBatch`
            The batch item with the :attr:`prediction` populated

        Raises
        ------
        FaceswapError
            If GPU resources are exhausted
        """
          try:
              batch["prediction"] = [self.predict(feed) for feed in batch["feed"]]
              return batch
          except tf_errors.ResourceExhaustedError as err:
              msg = ("You do not have enough GPU memory available to run detection at the "
keep keep keep keep replace 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/align/_base.py