          except on save iterations.
  
          Parameters
          ----------
          viewer: :func:`scripts.train.Train._show`
              The function that will display the preview image
          timelapse_kwargs: dict
              The keyword arguments for generating time-lapse previews. If a time-lapse preview is
              not required then this should be ``None``. Otherwise all values should be full paths
              the keys being `input_a`, `input_b`, `output`.
 
</s> remove     def clear_tensorboard(self):
 </s> add     def _update_viewers(self,
                        viewer: Optional[Callable[[np.ndarray, str], None]],
                        timelapse_kwargs: Optional[Dict[str, str]]) -> None:
        """ Update the preview viewer and timelapse output

        Parameters
        ----------
        viewer: :func:`scripts.train.Train._show` or ``None``
            The function that will display the preview image
        timelapse_kwargs: dict
            The keyword arguments for generating time-lapse previews. If a time-lapse preview is
            not required then this should be ``None``. Otherwise all values should be full paths
            the keys being `input_a`, `input_b`, `output`.
        """
        if viewer is not None:
            self._samples.images = self._feeder.generate_preview()
            samples = self._samples.show_sample()
            if samples is not None:
                viewer(samples,
                       "Training - 'S': Save Now. 'R': Refresh Preview. 'M': Toggle Mask. 'F': "
                       "Toggle Screen Fit-Actual Size. 'ENTER': Save and Quit")

        if timelapse_kwargs:
            self._timelapse.output_timelapse(timelapse_kwargs)

    def clear_tensorboard(self) -> None: </s> remove         logger.trace("Training one step: (iteration: %s)", self._model.iterations)
        do_preview = viewer is not None
 </s> add         logger.trace("Training one step: (iteration: %s)", self._model.iterations)  # type: ignore </s> remove         images: list
            A list of image paths that will be used to compile the final augmented data from.
        batchsize: int
            The batchsize for this iterator. Images will be returned in :class:`numpy.ndarray`
            objects of this size from the iterator.
        side: {'a' or 'b'}
            The side of the model that this iterator is for.
        do_shuffle: bool, optional
            Whether data should be shuffled prior to loading from disk. If true, each time the full
            list of filenames are processed, the data will be reshuffled to make sure they are not
            returned in the same order. Default: ``True``
        is_preview: bool, optional
            Indicates whether this iterator is generating preview images. If ``True`` then certain
            augmentations will not be performed. Default: ``False``
        is_timelapse: bool optional
            Indicates whether this iterator is generating time-lapse images. If ``True``, then
            certain augmentations will not be performed. Default: ``False``
 </s> add         batch: :class:`numpy.ndarray`
            This should be a 4-dimensional array of training images in the format (`batch size`,
            `height`, `width`, `channels`). Targets should be requested after performing image
            transformations but prior to performing warps. The 4th channel should be the mask.
            Any channels above the 4th should be any additional area masks (e.g. eye/mouth) that
            are required. </s> remove     feeder: dict
        The :class:`_Feeder` for generating the time-lapse images.
 </s> add     feeder: :class:`_Feeder`
        The feeder for generating the time-lapse images. </s> remove         images: list
            The list of full paths to the images for creating the time-lapse for this
            :class:`_Feeder`
 </s> add         images: dict
            The list of full paths to the images for creating the time-lapse for each side
        viewer: :func:`scripts.train.Train._show` or ``None``
          except on save iterations.
  
          Parameters
          ----------
        viewer: :func:`scripts.train.Train._show` or ``None``
              The function that will display the preview image
          timelapse_kwargs: dict
              The keyword arguments for generating time-lapse previews. If a time-lapse preview is
              not required then this should be ``None``. Otherwise all values should be full paths
              the keys being `input_a`, `input_b`, `output`.
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 
plugins/train/trainer/_base.py