          max_shift = np.min(original_boxes[..., 2:], axis=1) * beta
          rands = np.random.rand(self._re_feed, *original_boxes.shape) * 2 - 1
          new_boxes = np.rint(original_boxes + (rands * max_shift[None, :, None])).astype("int32")
          retval = np.concatenate((original_boxes[None, ...], new_boxes))
          logger.trace(retval)
          return retval
  
      # <<< PREDICT WRAPPER >>> #
      def _predict(self, batch):
          """ Just return the aligner's predict function """
 
</s> remove     def _predict(self, batch):
        """ Just return the aligner's predict function """
 </s> add     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
        """ </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             x_center = (face.left + face.right) / 2.0
            y_center = (face.top + face.bottom) / 2.0 - face.height * 0.12
            scale = (face.width + face.height) * self.reference_scale
 </s> add             x_center = (cast(int, face.left) + face.right) / 2.0
            y_center = (cast(int, face.top) + face.bottom) / 2.0 - cast(int, face.height) * 0.12
            scale = (cast(int, face.width) + cast(int, face.height)) * self.reference_scale </s> remove         logger.trace("Calculated center and scale: %s", center_scale)
 </s> add         logger.trace("Calculated center and scale: %s", center_scale)  # type:ignore </s> remove     @staticmethod
    def _normalize_hist(face):
        """ Equalize the RGB histogram channels """
 </s> add     @classmethod
    def _normalize_hist(cls, face: np.ndarray) -> np.ndarray:
        """ Equalize the RGB histogram channels

        Parameters
        ----------
        faces: :class:`numpy.ndarray`
            The faces to normalize

        Returns
        -------
        :class:`numpy.ndarray`
            The normalized faces
        """
        logger.trace(retval)  # type:ignore
          max_shift = np.min(original_boxes[..., 2:], axis=1) * beta
          rands = np.random.rand(self._re_feed, *original_boxes.shape) * 2 - 1
          new_boxes = np.rint(original_boxes + (rands * max_shift[None, :, None])).astype("int32")
          retval = np.concatenate((original_boxes[None, ...], new_boxes))
        logger.trace(retval)  # type:ignore
          return retval
  
      # <<< PREDICT WRAPPER >>> #
      def _predict(self, batch):
          """ Just return the aligner's predict function """
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/align/_base.py