              are passed back to parent.
              Do not override """
          try:
              self.align(*args, **kwargs)
          except Exception:  # pylint: disable=broad-except
              logger.error("Caught exception in child process: %s", os.getpid())
              # Display traceback if in initialization stage
              if not self.init.is_set():
                  logger.exception("Traceback:")
              tb_buffer = StringIO()
 
</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         #  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     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                 diff = np.array([var_a[i, pt_y, pt_x+1]
                                 - var_a[i, pt_y, pt_x-1],
                                 var_a[i, pt_y+1, pt_x]
                                 - var_a[i, pt_y-1, pt_x]])
 </s> add                 diff = np.array([prediction[i, pt_y, pt_x+1]
                                 - prediction[i, pt_y, pt_x-1],
                                 prediction[i, pt_y+1, pt_x]
                                 - prediction[i, pt_y-1, pt_x]])
        except Exception:  # pylint:disable=broad-except
              are passed back to parent.
              Do not override """
          try:
              self.align(*args, **kwargs)
        except Exception:  # pylint:disable=broad-except
              logger.error("Caught exception in child process: %s", os.getpid())
              # Display traceback if in initialization stage
              if not self.init.is_set():
                  logger.exception("Traceback:")
              tb_buffer = StringIO()
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