          self.error = kwargs["error"]
          self.queues["in"] = kwargs["in_queue"]
          self.queues["out"] = kwargs["out_queue"]
  
      def align(self, *args, **kwargs):
          """ Process landmarks
              Override for specific detector
              Must return a list of dlib rects"""
          if not self.init:
              self.initialize(*args, **kwargs)
          logger.debug("Launching Align: (args: %s kwargs: %s)", args, kwargs)
  
      # <<< DETECTION WRAPPER >>> #
      def run(self, *args, **kwargs):
          """ Parent align process.
              This should always be called as the entry point so exceptions
 
</s> remove     # <<< DETECTION WRAPPER >>> #
 </s> add     # <<< ALIGNMENT WRAPPER >>> # </s> remove     @staticmethod
    def set_model_path():
        """ path to data file/models
            override for specific detector """
        raise NotImplementedError()

 </s> add  </s> remove         self.cachepath = os.path.join(os.path.dirname(__file__), ".cache")
 </s> add         self.colorspace = colorspace.upper()
        self.input_size = input_size </s> remove         #  Path to model if required
        self.model_path = self.set_model_path()
 </s> add         #  Get model if required
        self.model_path = self.get_model(model_filename) </s> remove         except Exception:  # pylint: disable=broad-except
 </s> add         except Exception:  # pylint:disable=broad-except
    def align_image(self, detected_face, image):
        """ Align the incoming image for feeding into aligner
            Override for aligner specific processing """
        raise NotImplementedError

    def predict_landmarks(self, feed_dict):
        """ Predict the 68 point landmarks
            Override for aligner specific landmark prediction """
        raise NotImplementedError

    # <<< GET MODEL >>> #
    @staticmethod
    def get_model(model_filename):
        """ Check if model is available, if not, download and unzip it """
        cache_path = os.path.join(os.path.dirname(__file__), ".cache")
        model = GetModel(model_filename, cache_path)
        return model.model_path
          self.error = kwargs["error"]
          self.queues["in"] = kwargs["in_queue"]
          self.queues["out"] = kwargs["out_queue"]
  
    def align_image(self, detected_face, image):
        """ Align the incoming image for feeding into aligner
            Override for aligner specific processing """
        raise NotImplementedError

    def predict_landmarks(self, feed_dict):
        """ Predict the 68 point landmarks
            Override for aligner specific landmark prediction """
        raise NotImplementedError

    # <<< GET MODEL >>> #
    @staticmethod
    def get_model(model_filename):
        """ Check if model is available, if not, download and unzip it """
        cache_path = os.path.join(os.path.dirname(__file__), ".cache")
        model = GetModel(model_filename, cache_path)
        return model.model_path
    def align_image(self, detected_face, image):
        """ Align the incoming image for feeding into aligner
            Override for aligner specific processing """
        raise NotImplementedError

    def predict_landmarks(self, feed_dict):
        """ Predict the 68 point landmarks
            Override for aligner specific landmark prediction """
        raise NotImplementedError

    # <<< GET MODEL >>> #
    @staticmethod
    def get_model(model_filename):
        """ Check if model is available, if not, download and unzip it """
        cache_path = os.path.join(os.path.dirname(__file__), ".cache")
        model = GetModel(model_filename, cache_path)
        return model.model_path
    def align_image(self, detected_face, image):
        """ Align the incoming image for feeding into aligner
            Override for aligner specific processing """
        raise NotImplementedError

    def predict_landmarks(self, feed_dict):
        """ Predict the 68 point landmarks
            Override for aligner specific landmark prediction """
        raise NotImplementedError

    # <<< GET MODEL >>> #
    @staticmethod
    def get_model(model_filename):
        """ Check if model is available, if not, download and unzip it """
        cache_path = os.path.join(os.path.dirname(__file__), ".cache")
        model = GetModel(model_filename, cache_path)
        return model.model_path
    def align_image(self, detected_face, image):
        """ Align the incoming image for feeding into aligner
            Override for aligner specific processing """
        raise NotImplementedError

    def predict_landmarks(self, feed_dict):
        """ Predict the 68 point landmarks
            Override for aligner specific landmark prediction """
        raise NotImplementedError

    # <<< GET MODEL >>> #
    @staticmethod
    def get_model(model_filename):
        """ Check if model is available, if not, download and unzip it """
        cache_path = os.path.join(os.path.dirname(__file__), ".cache")
        model = GetModel(model_filename, cache_path)
        return model.model_path
    def align_image(self, detected_face, image):
        """ Align the incoming image for feeding into aligner
            Override for aligner specific processing """
        raise NotImplementedError

    def predict_landmarks(self, feed_dict):
        """ Predict the 68 point landmarks
            Override for aligner specific landmark prediction """
        raise NotImplementedError

    # <<< GET MODEL >>> #
    @staticmethod
    def get_model(model_filename):
        """ Check if model is available, if not, download and unzip it """
        cache_path = os.path.join(os.path.dirname(__file__), ".cache")
        model = GetModel(model_filename, cache_path)
        return model.model_path
    def align_image(self, detected_face, image):
        """ Align the incoming image for feeding into aligner
            Override for aligner specific processing """
        raise NotImplementedError

    def predict_landmarks(self, feed_dict):
        """ Predict the 68 point landmarks
            Override for aligner specific landmark prediction """
        raise NotImplementedError

    # <<< GET MODEL >>> #
    @staticmethod
    def get_model(model_filename):
        """ Check if model is available, if not, download and unzip it """
        cache_path = os.path.join(os.path.dirname(__file__), ".cache")
        model = GetModel(model_filename, cache_path)
        return model.model_path
    def align_image(self, detected_face, image):
        """ Align the incoming image for feeding into aligner
            Override for aligner specific processing """
        raise NotImplementedError

    def predict_landmarks(self, feed_dict):
        """ Predict the 68 point landmarks
            Override for aligner specific landmark prediction """
        raise NotImplementedError

    # <<< GET MODEL >>> #
    @staticmethod
    def get_model(model_filename):
        """ Check if model is available, if not, download and unzip it """
        cache_path = os.path.join(os.path.dirname(__file__), ".cache")
        model = GetModel(model_filename, cache_path)
        return model.model_path
  
      # <<< DETECTION WRAPPER >>> #
      def run(self, *args, **kwargs):
          """ Parent align process.
              This should always be called as the entry point so exceptions
keep keep keep keep replace replace replace replace replace replace replace keep keep keep keep keep
 Remove Dlib Aligner

Remove Dlib Aligner
Add CV2-DNN Aligner replacement for dlib
Remove aligner models from repo
Add download function to pull models from remote location
Minor FAN fixups 
plugins/extract/align/_base.py