          logger.trace("Active plugins: %s", retval)
          return retval
  
      def _add_queues(self):
          """ Add the required processing queues to Queue Manager """
          queues = dict()
          tasks = ["extract_{}_in".format(phase) for phase in self._flow]
          tasks.append("extract_{}_out".format(self._final_phase))
          for task in tasks:
 
</s> remove         """ numpy.ndarray: The mask at the size of :attr:`stored_size` """
        return np.frombuffer(decompress(self._mask),
                             dtype="uint8").reshape((self.stored_size, self.stored_size, 1))
 </s> add         """ numpy.ndarray: The mask at the size of :attr:`stored_size` with any requested blurring
        and threshold amount applied."""
        dims = (self.stored_size, self.stored_size, 1)
        mask = np.frombuffer(decompress(self._mask), dtype="uint8").reshape(dims)
        if self._threshold != 0.0:
            mask[mask < self._threshold] = 0.0
            mask[mask > 255.0 - self._threshold] = 255.0
        if self._blur_kernel != 0:
            mask = cv2.GaussianBlur(mask, (self._blur_kernel, self._blur_kernel), 0)[..., None]
        logger.trace("mask shape: %s", mask.shape)
        return mask </s> remove         and vgg-obstructed. The worst ratio is selected for each combination, plus a litle extra
 </s> add         and vgg-obstructed. The worst ratio is selected for each combination, plus a little extra </s> remove         This class is initialised in each of the argparsers for the relevant
 </s> add         This class is initialized in each of the argparsers for the relevant
    @staticmethod
    def _set_flow(detector, aligner, masker):
        """ Set the flow list based on the input plugins """
        logger.debug("detector: %s, aligner: %s, masker: %s", detector, aligner, masker)
        retval = []
        if detector is not None and detector.lower() != "none":
            retval.append("detect")
        if aligner is not None and aligner.lower() != "none":
            retval.append("align")
        if masker is not None and masker.lower() != "none":
            retval.append("mask")
        logger.debug("flow: %s", retval)
        return retval

          logger.trace("Active plugins: %s", retval)
          return retval
  
    @staticmethod
    def _set_flow(detector, aligner, masker):
        """ Set the flow list based on the input plugins """
        logger.debug("detector: %s, aligner: %s, masker: %s", detector, aligner, masker)
        retval = []
        if detector is not None and detector.lower() != "none":
            retval.append("detect")
        if aligner is not None and aligner.lower() != "none":
            retval.append("align")
        if masker is not None and masker.lower() != "none":
            retval.append("mask")
        logger.debug("flow: %s", retval)
        return retval

      def _add_queues(self):
          """ Add the required processing queues to Queue Manager """
          queues = dict()
          tasks = ["extract_{}_in".format(phase) for phase in self._flow]
          tasks.append("extract_{}_out".format(self._final_phase))
          for task in tasks:
keep keep add keep keep keep keep keep keep
 Extract - Mask updates

- Remove none mask plugin
- Make pipeline more flexible
- Add support for pre-aligned faces to masker plugin
- Migrate blur and threshold settings to mask output 
plugins/extract/pipeline.py