                  self._set_plugin_batchsize(plugin, available_vram)
  
      @staticmethod
      def _set_plugin_batchsize(plugin, available_vram):
          """ Set the batchsize for the given plugin based on given available vram """
          plugin.batchsize = max(1, available_vram // plugin.vram_per_batch)
          logger.verbose("Reset batchsize for %s to %s", plugin.name, plugin.batchsize)
  
      def _join_threads(self):
          """ Join threads for current pass """
 
</s> remove         """ Set the batchsize of a given :attr:`plugin_type` to the given :attr:`batchsize`.
 </s> add         """ Set the batch size of a given :attr:`plugin_type` to the given :attr:`batchsize`. </s> remove     def _launch_detector(self):
        """ Launch the face detector """
        logger.debug("Launching Detector")
        kwargs = dict(in_queue=self._queues["extract_detect_in"],
                      out_queue=self._queues["extract_align_in"])
        self._detector.initialize(**kwargs)
        self._detector.start()
        logger.debug("Launched Detector")

    def _launch_aligner(self):
        """ Launch the face aligner """
        logger.debug("Launching Aligner")
        kwargs = dict(in_queue=self._queues["extract_align_in"],
                      out_queue=self._queues["extract_mask_in"])
        self._aligner.initialize(**kwargs)
        self._aligner.start()
        logger.debug("Launched Aligner")

    def _launch_masker(self):
        """ Launch the face masker """
        logger.debug("Launching Masker")
        kwargs = dict(in_queue=self._queues["extract_mask_in"],
                      out_queue=self._queues["extract_mask_out"])
        self._masker.initialize(**kwargs)
        self._masker.start()
        logger.debug("Launched Masker")
 </s> add     def _launch_plugin(self, phase):
        """ Launch an extraction plugin """
        logger.debug("Launching %s plugin", phase)
        in_qname = "extract_{}_in".format(phase)
        if phase == self._final_phase:
            out_qname = "extract_{}_out".format(self._final_phase)
        else:
            next_phase = self._flow[self._flow.index(phase) + 1]
            out_qname = "extract_{}_in".format(next_phase)
        logger.debug("in_qname: %s, out_qname: %s", in_qname, out_qname)
        kwargs = dict(in_queue=self._queues[in_qname], out_queue=self._queues[out_qname])

        plugin = getattr(self, "_{}".format(phase))
        plugin.initialize(**kwargs)
        plugin.start()
        logger.debug("Launched %s plugin", phase) </s> remove         Sets the batchsize of the requested plugins based on their vram and
        vram_per_batch_requirements if the the configured batchsize requires more
 </s> add         Sets the batch size of the requested plugins based on their vram and
        vram_per_batch_requirements if the the configured batch size requires more </s> remove         retval = self._is_parallel or self.phase == "mask"
 </s> add         retval = self._is_parallel or self.phase == self._final_phase </s> remove         """ Return a list of available aligners/detectors """
 </s> add         """ Return a list of available extractors of the given type

        Parameters
        ----------
        extractor_type: {'aligner', 'detector', 'masker'}
            The type of extractor to return the plugins for

        Returns
        -------
        list:
            A list of the available extractor plugin names for the given type
        """
        """ Set the batch size for the given plugin based on given available vram """
                  self._set_plugin_batchsize(plugin, available_vram)
  
      @staticmethod
      def _set_plugin_batchsize(plugin, available_vram):
        """ Set the batch size for the given plugin based on given available vram """
          plugin.batchsize = max(1, available_vram // plugin.vram_per_batch)
          logger.verbose("Reset batchsize for %s to %s", plugin.name, plugin.batchsize)
  
      def _join_threads(self):
          """ Join threads for current pass """
keep keep keep keep replace keep keep keep keep keep
 Smart Mask - Extract code review

- Lint simple_tests.py
- Only reformat alignments file if it exists otherwise change filename
- Update legacy alignments to new format at all stages
- faces_detect.Mask.from_dict - logging format fix
- convert.py fix otf for new pipeline
- cli.py - Add note that masks not used. Revert convert masks
- faces_detect.py - Revert non-extract code
- Add .p and .pickle extensions for serializer
- plugins/extract revert some changes
- scripts/fsmedia - Revert code changes
- Pipeline - cleanup
- Consistant alpha channel stripping (fixes single-process)
- Store landmarks as numpy array
- Code attribution
- Normalize feed face and reference face to 0.0 - 1.0 in convert
- Lock in mask VRAM sized
- Add documentation to plugin_loader
- Update alignments tool to work with new format 
plugins/extract/pipeline.py