  
          if not self._verify_output and faces_count > 1:
              self._verify_output = True
  
      def _output_faces(self, saver: ImagesSaver, extract_media: ExtractMedia) -> None:
          """ Output faces to save thread
  
          Set the face filename based on the frame name and put the face to the
          :class:`~lib.image.ImagesSaver` save queue and add the face information to the alignments
          data.
 
</s> remove             logger.verbose("No faces were detected in image: %s",
 </s> add             logger.verbose("No faces were detected in image: %s",  # type: ignore </s> remove     As the cache is populated at run-time, thread safe writes are required for the first epoch.
    Following that, the cache is only used for reads, which is thread safe intrinsically.
 </s> add class DataGenerator():
    """ Parent class for Training and Preview Data Generators. </s> remove         saver: lib.images.ImagesSaver
            The background saver for saving the image
 </s> add         saver: :class:`lib.images.ImagesSaver` or ``None``
            The background saver for saving the image or ``None`` if faces are not to be saved </s> remove     Each side may have up to 3 generators (training, preview and time-lapse). To conserve VRAM
    these need to share access to the same face information for the images they are processing.
 </s> add  </s> remove class _Cache():
    """ A thread safe mechanism for collecting and holding face meta information (masks, "
    "alignments data etc.) for multiple :class:`TrainingDataGenerator`s.
 </s> add logger = logging.getLogger(__name__)
ConfigType = Dict[str, Union[bool, int, float, str]]  # TODO Dataclass
BatchType = Tuple[np.ndarray, List[np.ndarray]]
    def _output_faces(self, saver: Optional[ImagesSaver], extract_media: ExtractMedia) -> None:
  
          if not self._verify_output and faces_count > 1:
              self._verify_output = True
  
    def _output_faces(self, saver: Optional[ImagesSaver], extract_media: ExtractMedia) -> None:
          """ Output faces to save thread
  
          Set the face filename based on the frame name and put the face to the
          :class:`~lib.image.ImagesSaver` save queue and add the face information to the alignments
          data.
keep keep keep keep replace keep keep keep keep keep
 Data Augmentation update (#1263)

- lib.detected_face
    - Subclass Masks for Landmark based masks
    - Add training mask propery + methods to DetectedFace
  - lib.training_training
    - subclass TrainingDataGenerator for training and preview data
    - Split cache into own module
    - Reduce thread count to 1 to prevent image corruption + data re-use
    - Process on largest model input/output size rather than stored image size
    - Size and crop masks during caching stage
    - Implement ring buffer for data flow
    - Fix preview reload bug
  - augmentation
    - typing
    - switch color aug order
    - better initialization
    - Fix warp + landmark warp to correctly apply at different image scales
    - Slightly improved warp caching
    - Don't store whether image is_preview. Handle all data as training images implicitly
  - plugins.trainer: Typing and fixes to work with trainingdata refactor 
scripts/extract.py