              "type": str.lower,
              "choices": PluginLoader.get_available_extractors("align"),
              "default": "fan",
              "help": "R|Aligner to use."
                      "\nL|'dlib': Dlib Pose Predictor. Faster, less "
                      "resource intensive, but less accurate."
                      "\nL|'fan': Face Alignment Network. Best aligner. "
                      "GPU heavy, slow when not running on GPU"})
          argument_list.append({"opts": ("-r", "--rotate-images"),
                                "type": str,
                                "dest": "rotate_images",
 
</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     @staticmethod
    def set_model_path():
        """ path to data file/models
            override for specific detector """
        raise NotImplementedError()

 </s> add  </s> remove         except Exception:  # pylint: disable=broad-except
 </s> add         except Exception:  # pylint:disable=broad-except </s> remove     # <<< DETECTION WRAPPER >>> #
 </s> add     # <<< ALIGNMENT WRAPPER >>> # </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
                    "\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."
              "type": str.lower,
              "choices": PluginLoader.get_available_extractors("align"),
              "default": "fan",
              "help": "R|Aligner to use."
                    "\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."
                    "\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."
                      "\nL|'fan': Face Alignment Network. Best aligner. "
                      "GPU heavy, slow when not running on GPU"})
          argument_list.append({"opts": ("-r", "--rotate-images"),
                                "type": str,
                                "dest": "rotate_images",
keep keep keep keep 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 
lib/cli.py