          """list: A list of :class:`~lib.align.DetectedFace` objects in the :attr:`image`. """
          return self._detected_faces
  
      @property
      def frame_metadata(self) -> dict:
          """ dict: The frame metadata that has been added from an aligned image. This property
          should only be called after :func:`add_frame_metadata` has been called when processing
          an aligned face. For all other instances an assertion error will be raised.
  
          Raises
 
</s> remove     def _set_skip_list(self) -> None:
        """ Add the skip list to the image loader
 </s> add     @property
    def n_embeddings(self) -> np.ndarray:
        """ :class:`numpy.ndarray`: The n-filter embeddings"""
        if self._nembeddings and all(np.any(e) for e in self._nembeddings):
            retval = np.concatenate(self._nembeddings, axis=0)
        else:
            retval = np.array([])
        return retval </s> remove         The original frame
 </s> add         The original frame or a faceswap aligned face image </s> remove     def _save_interval(self) -> Optional[int]:
        """ int: The number of frames to be processed between each saving of the alignments file if
        it has been provided, otherwise ``None`` """
        if hasattr(self._args, "save_interval"):
            return self._args.save_interval
        return None
 </s> add     def active(self):
        """ bool: ``True`` if filter files have been passed in command line arguments. ``False`` if
        no filter files have been provided """
        return bool(self._filter_files) or bool(self._nfilter_files) </s> remove     def _skip_num(self) -> int:
        """ int: Number of frames to skip if extract_every_n has been provided """
        return self._args.extract_every_n if hasattr(self._args, "extract_every_n") else 1
 </s> add     def embeddings(self) -> np.ndarray:
        """ :class:`numpy.ndarray`: The filter embeddings"""
        if self._embeddings and all(np.any(e) for e in self._embeddings):
            retval = np.concatenate(self._embeddings, axis=0)
        else:
            retval = np.array([])
        return retval
    def is_aligned(self) -> bool:
        """ bool. ``True`` if :attr:`image` is an aligned faceswap image otherwise ``False`` """
        return self._is_aligned

    @property
    def frame_metadata(self) -> "PNGHeaderSourceDict":
          """list: A list of :class:`~lib.align.DetectedFace` objects in the :attr:`image`. """
          return self._detected_faces
  
      @property
    def is_aligned(self) -> bool:
        """ bool. ``True`` if :attr:`image` is an aligned faceswap image otherwise ``False`` """
        return self._is_aligned

    @property
    def frame_metadata(self) -> "PNGHeaderSourceDict":
          """ dict: The frame metadata that has been added from an aligned image. This property
          should only be called after :func:`add_frame_metadata` has been called when processing
          an aligned face. For all other instances an assertion error will be raised.
  
          Raises
keep keep keep keep replace keep keep keep keep keep
 Update Face Filter
  - Remove old face filter
  - plugins.extract.pipeline: Expose plugins directly
  - Change `is_aligned` from plugin level to ExtractMedia level
  - Allow extract pipeline to take faceswap aligned images
  - Add ability for recognition plugins to accept aligned faces as input
  - Add face filter to recognition plugin
  - Move extractor pipeline IO ops to own class 
plugins/extract/pipeline.py