          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
              are passed back to parent.
              Do not override """
 
</s> remove     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)
 </s> add     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 </s> remove         except Exception:  # pylint: disable=broad-except
 </s> add         except Exception:  # pylint:disable=broad-except </s> remove     @staticmethod
    def set_model_path():
        """ path to data file/models
            override for specific detector """
        raise NotImplementedError()

 </s> add  </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                     "\nL|'dlib': Dlib Pose Predictor. Faster, less "
                    "resource intensive, but less accurate."
 </s> add                     "\nL|'cv2-dnn': A cpu only CNN based landmark detector. Faster, less "
                    "resource intensive, but less accurate. Only use this if not using a gpu "
                    " and time is important."
    # <<< ALIGNMENT WRAPPER >>> #
          if not self.init:
              self.initialize(*args, **kwargs)
          logger.debug("Launching Align: (args: %s kwargs: %s)", args, kwargs)
  
    # <<< ALIGNMENT WRAPPER >>> #
      def run(self, *args, **kwargs):
          """ Parent align process.
              This should always be called as the entry point so exceptions
              are passed back to parent.
              Do not override """
keep keep keep keep 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