          transform_matrix[:, :, 0, 2] = translations[:, :, 0]  # x translation
          transform_matrix[:, :, 1, 2] = translations[:, :, 1]  # y translation
          new_points = np.einsum('abij, abj -> abi', transform_matrix, points, optimize='greedy')
          retval = new_points[:, :, :2].astype('float32')
          logger.trace("Transformed Points: %s", retval)
          return retval
  
      def predict(self, batch):
          """ Predict the 68 point landmarks """
          logger.debug("Predicting Landmarks")
 
</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("Calculated center and scale: %s", center_scale)
 </s> add         logger.trace("Calculated center and scale: %s", center_scale)  # type:ignore </s> remove     def predict(self, batch):
        """ Predict the 68 point landmarks """
        logger.trace("Predicting Landmarks")
 </s> add     def predict(self, batch: AlignerBatch) -> 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
        """
        logger.trace("Predicting Landmarks")  # type:ignore </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(retval)
 </s> add         logger.trace(retval)  # type:ignore
        logger.trace("Transformed Points: %s", retval)  # type:ignore
          transform_matrix[:, :, 0, 2] = translations[:, :, 0]  # x translation
          transform_matrix[:, :, 1, 2] = translations[:, :, 1]  # y translation
          new_points = np.einsum('abij, abj -> abi', transform_matrix, points, optimize='greedy')
          retval = new_points[:, :, :2].astype('float32')
        logger.trace("Transformed Points: %s", retval)  # type:ignore
          return retval
  
      def predict(self, batch):
          """ Predict the 68 point landmarks """
          logger.debug("Predicting Landmarks")
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/fan.py