                       [(face.left, face.right, face.top, face.bottom) for face in faces])
          self._detected_faces = faces
  
      def remove_image(self) -> None:
          """ Delete the image and reset :attr:`image` to ``None``.
  
          Required for multi-phase extraction to avoid the frames stacking RAM.
          """
          logger.trace("Removing image for filename: '%s'", self._filename)  # type: ignore
 
</s> remove     def save(self, filename, image):
 </s> add     def save(self, filename: str, image: bytes, sub_folder: Optional[str] = None) -> None: </s> remove                                      distance=self.config["aligner_distance"])
 </s> add                                      distance=self.config["aligner_distance"],
                                     save_output=self.config["save_filtered"]) </s> remove             The filename of the image to be saved
        image: numpy.ndarray
            The image to be saved
 </s> add             The filename of the image to be saved. NB: Any folders passed in with the filename
            will be stripped and replaced with :attr:`location`.
        image: bytes
            The encoded image to be saved
        subfolder: str, optional
            If the file should be saved in a subfolder in the output location, the subfolder should
            be provided here. ``None`` for no subfolder. Default: ``None`` </s> remove         image: numpy.ndarray
            The image to be saved
 </s> add         image: bytes
            The encoded image to be saved
        subfolder: str or ``None``
            If the file should be saved in a subfolder in the output location, the subfolder should
            be provided here. ``None`` for no subfolder. </s> remove     def _save(self, filename, image):
 </s> add     def _save(self, filename: str, image: bytes, sub_folder: Optional[str]) -> None:
    def add_sub_folders(self, folders: List[Optional[str]]) -> None:
        """ Add detected faces to the object. Called at the end of each extraction phase.

        Parameters
        ----------
        folders: list
            A list of str sub folder names or ``None`` if no sub folder is required. Should
            correspond to the detected faces list
        """
        logger.trace("Adding sub folders for filename: '%s'. "  # type: ignore
                     "(folders: %s)", self._filename, folders,)
        self._sub_folders = folders

                       [(face.left, face.right, face.top, face.bottom) for face in faces])
          self._detected_faces = faces
  
    def add_sub_folders(self, folders: List[Optional[str]]) -> None:
        """ Add detected faces to the object. Called at the end of each extraction phase.

        Parameters
        ----------
        folders: list
            A list of str sub folder names or ``None`` if no sub folder is required. Should
            correspond to the detected faces list
        """
        logger.trace("Adding sub folders for filename: '%s'. "  # type: ignore
                     "(folders: %s)", self._filename, folders,)
        self._sub_folders = folders

      def remove_image(self) -> None:
          """ Delete the image and reset :attr:`image` to ``None``.
  
          Required for multi-phase extraction to avoid the frames stacking RAM.
          """
          logger.trace("Removing image for filename: '%s'", self._filename)  # type: ignore
keep keep add keep keep keep keep keep keep
 Extract filter: Allow saving of filtered images 
plugins/extract/pipeline.py