          setattr(self, "{}_thread".format(task), io_thread)
          logger.debug("Started thread: '%s'", task)
  
      # Loading tasks
      def load(self, *args):  # pylint: disable=unused-argument
          """ Load the images with detected_faces"""
          logger.debug("Load Images: Start")
          idx = 0
          for filename, image in self.images.load():
              idx += 1
              if self.load_queue.shutdown.is_set():
 
</s> remove         for filename, image in self.images.load():
 </s> add         for filename, image in self._images.load(): </s> remove         setattr(self, "{}_thread".format(task), io_thread)
 </s> add         self._threads[task] = io_thread </s> remove             if self.load_queue.shutdown.is_set():
 </s> add             if self._queues["load"].shutdown.is_set(): </s> remove         args = self.completion_event if task == "save" else None
        func = getattr(self, task)
 </s> add         args = self._completion_event if task == "save" else None
        func = getattr(self, "_{}".format(task)) </s> remove         write_preview = self.args.redirect_gui and self.writer.is_stream
        preview_image = os.path.join(self.writer.output_folder, ".gui_preview.jpg")
 </s> add         write_preview = self._args.redirect_gui and self._writer.is_stream
        preview_image = os.path.join(self._writer.output_folder, ".gui_preview.jpg")
    def _load(self, *args):  # pylint: disable=unused-argument
        """ Load frames from disk.

        In a background thread:
            * Loads frames from disk.
            * Discards or passes through cli selected skipped frames
            * Pairs the frame with its :class:`~lib.faces_detect.DetectedFace` objects
            * Performs any pre-processing actions
            * Puts the frame and detected faces to the load queue
        """
          setattr(self, "{}_thread".format(task), io_thread)
          logger.debug("Started thread: '%s'", task)
  
      # Loading tasks
    def _load(self, *args):  # pylint: disable=unused-argument
        """ Load frames from disk.

        In a background thread:
            * Loads frames from disk.
            * Discards or passes through cli selected skipped frames
            * Pairs the frame with its :class:`~lib.faces_detect.DetectedFace` objects
            * Performs any pre-processing actions
            * Puts the frame and detected faces to the load queue
        """
    def _load(self, *args):  # pylint: disable=unused-argument
        """ Load frames from disk.

        In a background thread:
            * Loads frames from disk.
            * Discards or passes through cli selected skipped frames
            * Pairs the frame with its :class:`~lib.faces_detect.DetectedFace` objects
            * Performs any pre-processing actions
            * Puts the frame and detected faces to the load queue
        """
          logger.debug("Load Images: Start")
          idx = 0
          for filename, image in self.images.load():
              idx += 1
              if self.load_queue.shutdown.is_set():
keep keep keep keep replace replace keep keep keep keep keep
 Smart Masks to Convert (#957)

- scripts.convert - Use Smart Masks for Convert
    * Make on-the-fly conversion an explicit option

- Move BlurMask to lib.faces_detect

- tools.preview - Fix for smart masks
    * Subclass from tk.Tk
    * Options to lib.gui.control_helper
    *variable cleanup

- lib.logger - Demote more tensorflow deprecation messages

- Documentation:
    * lib.faces_detect.BlurMask
    * plugins.convert.mask
    * lib.convert
    * scripts.convert
    * scripts.fsmedia
    * tools.preview 
scripts/convert.py