          """ Initialize CV2 DNN Detector Model"""
          self.model = cv2.dnn.readNetFromTensorflow(self.model_path)  # pylint: disable=no-member
          self.model.setPreferableTarget(cv2.dnn.DNN_TARGET_CPU)  # pylint: disable=no-member
  
      def process_input(self, batch):
          """ Compile the detected faces for prediction """
          faces, batch["roi"], batch["offsets"] = self.align_image(batch)
          faces = self._normalize_faces(faces)
          batch["feed"] = np.array(faces, dtype="float32")[..., :3].transpose((0, 3, 1, 2))
          return batch
  
      def align_image(self, batch):
 
</s> remove     def init_model(self):
 </s> add     def init_model(self) -> None: </s> remove         batch["feed"] = np.array(faces, dtype="float32")[..., :3].transpose((0, 3, 1, 2))
        return batch
 </s> add         batch.data.append(dict(roi=roi, offsets=offsets))
        batch.feed.append(np.array(faces, dtype="float32")[..., :3].transpose((0, 3, 1, 2)))

    def _get_box_and_offset(self, face: "DetectedFace") -> Tuple[List[int], int]:
        """Obtain the bounding box and offset from a detected face.


        Parameters
        ----------
        face: :class:`~lib.align.DetectedFace`
            The detected face object to obtain the bounding box and offset from </s> remove         batch["center_scale"] = self.get_center_scale(batch["detected_faces"])
        faces = self.crop(batch)
        logger.trace("Aligned image around center")
 </s> add         center_scale = self.get_center_scale(batch.detected_faces)
        faces = self.crop(batch, center_scale)
        logger.trace("Aligned image around center")  # type:ignore </s> remove     def process_input(self, batch):
        """ Compile the detected faces for prediction """
 </s> add     def process_input(self, batch: AlignerBatch) -> None:
        """ Compile the detected faces for prediction

        Parameters
        ----------
        batch: :class:`AlignerBatch`
            The current batch to process input for
        """ </s> remove     def align_image(self, batch):
        """ Align the incoming image for prediction """
        logger.trace("Aligning image around center")
 </s> add         Returns
        -------
        box: list
            The [left, top, right, bottom] bounding box
        offset: int
            The offset of the box (difference between half width vs height)
        """

        box = cast(List[int], [face.left,
                               face.top,
                               face.right,
                               face.bottom])
        diff_height_width = cast(int, face.height) - cast(int, face.width)
        offset = int(abs(diff_height_width / 2))
        return box, offset

    def align_image(self, batch: AlignerBatch) -> Tuple[List[np.ndarray],
                                                        List[List[int]],
                                                        List[Tuple[int, int]]]:
        """ Align the incoming image for prediction

        Parameters
        ----------
        batch: :class:`AlignerBatch`
            The current batch to align the input for

        Returns
        -------
        faces: list
            List of feed faces for the aligner
        rois: list
            List of roi's for the faces
        offsets: list
            List of offsets for the faces
        """
        logger.trace("Aligning image around center")  # type:ignore
    def process_input(self, batch: AlignerBatch) -> None:
        """ Compile the detected faces for prediction

        Parameters
        ----------
        batch: :class:`AlignerBatch`
            The current batch to process input for

        Returns
        -------
        :class:`AlignerBatch`
            The batch item with the :attr:`feed` populated and any required :attr:`data` added
        """
        faces, roi, offsets = self.align_image(batch)
          """ Initialize CV2 DNN Detector Model"""
          self.model = cv2.dnn.readNetFromTensorflow(self.model_path)  # pylint: disable=no-member
          self.model.setPreferableTarget(cv2.dnn.DNN_TARGET_CPU)  # pylint: disable=no-member
  
    def process_input(self, batch: AlignerBatch) -> None:
        """ Compile the detected faces for prediction

        Parameters
        ----------
        batch: :class:`AlignerBatch`
            The current batch to process input for

        Returns
        -------
        :class:`AlignerBatch`
            The batch item with the :attr:`feed` populated and any required :attr:`data` added
        """
        faces, roi, offsets = self.align_image(batch)
    def process_input(self, batch: AlignerBatch) -> None:
        """ Compile the detected faces for prediction

        Parameters
        ----------
        batch: :class:`AlignerBatch`
            The current batch to process input for

        Returns
        -------
        :class:`AlignerBatch`
            The batch item with the :attr:`feed` populated and any required :attr:`data` added
        """
        faces, roi, offsets = self.align_image(batch)
    def process_input(self, batch: AlignerBatch) -> None:
        """ Compile the detected faces for prediction

        Parameters
        ----------
        batch: :class:`AlignerBatch`
            The current batch to process input for

        Returns
        -------
        :class:`AlignerBatch`
            The batch item with the :attr:`feed` populated and any required :attr:`data` added
        """
        faces, roi, offsets = self.align_image(batch)
          faces = self._normalize_faces(faces)
          batch["feed"] = np.array(faces, dtype="float32")[..., :3].transpose((0, 3, 1, 2))
          return batch
  
      def align_image(self, batch):
keep keep keep keep replace 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/cv2_dnn.py