          argument_list.append({
              "opts": ("-j", "--job"),
              "action": Radio,
              "type": str,
              "choices": ("draw", "extract", "manual", "merge", "missing-alignments",
                          "missing-frames", "leftover-faces", "multi-faces", "no-faces",
                          "reformat", "remove-faces", "remove-frames", "rename", "sort-x", "sort-y",
                          "spatial", "update-hashes"),
              "required": True,
              "help": "R|Choose which action you want to perform. "
 
</s> remove                         "reformat", "remove-faces", "remove-frames", "rename", "sort-x", "sort-y",
                        "spatial", "update-hashes"),
 </s> add                         "remove-faces", "remove-frames", "rename", "sort", "spatial",
                        "update-hashes"), </s> remove         argument_list.append({"opts": ("-ref", "--reference-video"),
                              "action": FileFullPaths,
                              "dest": "reference_video",
                              "filetypes": "video",
                              "type": str,
                              "group": "data",
                              "help": "Only required if converting from images to video. Provide "
                                      "The original video that the source frames were extracted "
                                      "from (for extracting the fps and audio)."})
        argument_list.append({"opts": ("-m", "--model-dir"),
                              "action": DirFullPaths,
                              "dest": "model_dir",
                              "required": True,
                              "group": "data",
                              "help": "Model directory. The directory containing the trained "
                                      "model you wish to use for conversion."})
 </s> add         argument_list.append({
            "opts": ("-ref", "--reference-video"),
            "action": FileFullPaths,
            "dest": "reference_video",
            "filetypes": "video",
            "type": str,
            "group": "data",
            "help": "Only required if converting from images to video. Provide The original video "
                    "that the source frames were extracted from (for extracting the fps and "
                    "audio)."})
        argument_list.append({
            "opts": ("-m", "--model-dir"),
            "action": DirFullPaths,
            "dest": "model_dir",
            "required": True,
            "group": "data",
            "help": "Model directory. The directory containing the trained model you wish to use "
                    "for conversion."}) </s> remove         argument_list.append({"opts": ("-i", "--input-dir"),
                              "action": DirOrFileFullPaths,
                              "filetypes": "video",
                              "dest": "input_dir",
                              "required": True,
                              "group": "Data",
                              "help": "Input directory or video. Either a directory containing "
                                      "the image files you wish to process or path to a video "
                                      "file. NB: This should be the source video/frames NOT the "
                                      "source faces."})
        argument_list.append({"opts": ("-o", "--output-dir"),
                              "action": DirFullPaths,
                              "dest": "output_dir",
                              "required": True,
                              "group": "Data",
                              "help": "Output directory. This is where the converted files will "
                                      "be saved."})
        argument_list.append({"opts": ("-al", "--alignments"),
                              "action": FileFullPaths,
                              "filetypes": "alignments",
                              "type": str,
                              "dest": "alignments_path",
                              "group": "Data",
                              "help": "Optional path to an alignments file. Leave blank if the "
                                      "alignments file is at the default location."})
 </s> add         argument_list.append({
            "opts": ("-i", "--input-dir"),
            "action": DirOrFileFullPaths,
            "filetypes": "video",
            "dest": "input_dir",
            "required": True,
            "group": "Data",
            "help": "Input directory or video. Either a directory containing the image files you "
                    "wish to process or path to a video file. NB: This should be the source video/"
                    "frames NOT the source faces."})
        argument_list.append({
            "opts": ("-o", "--output-dir"),
            "action": DirFullPaths,
            "dest": "output_dir",
            "required": True,
            "group": "Data",
            "help": "Output directory. This is where the converted files will be saved."})
        argument_list.append({
            "opts": ("-al", "--alignments"),
            "action": FileFullPaths,
            "filetypes": "alignments",
            "type": str,
            "dest": "alignments_path",
            "group": "Data",
            "help": "Optional path to an alignments file. Leave blank if the alignments file is "
                    "at the default location."}) </s> remove         global_args.append({"opts": ("-C", "--configfile"),
                            "action": FileFullPaths,
                            "filetypes": "ini",
                            "type": str,
                            "group": "Global Options",
                            "help": "Optionally overide the saved config with the path to a "
                                    "custom config file."})
        global_args.append({"opts": ("-L", "--loglevel"),
                            "type": str.upper,
                            "dest": "loglevel",
                            "default": "INFO",
                            "choices": ("INFO", "VERBOSE", "DEBUG", "TRACE"),
                            "group": "Global Options",
                            "help": "Log level. Stick with INFO or VERBOSE unless you need to "
                                    "file an error report. Be careful with TRACE as it will "
                                    "generate a lot of data"})
        global_args.append({"opts": ("-LF", "--logfile"),
                            "action": SaveFileFullPaths,
                            "filetypes": 'log',
                            "type": str,
                            "dest": "logfile",
                            "group": "Global Options",
                            "help": "Path to store the logfile. Leave blank to store in the "
                                    "faceswap folder",
                            "default": None})
 </s> add         global_args.append({
            "opts": ("-C", "--configfile"),
            "action": FileFullPaths,
            "filetypes": "ini",
            "type": str,
            "group": "Global Options",
            "help": "Optionally overide the saved config with the path to a custom config file."})
        global_args.append({
            "opts": ("-L", "--loglevel"),
            "type": str.upper,
            "dest": "loglevel",
            "default": "INFO",
            "choices": ("INFO", "VERBOSE", "DEBUG", "TRACE"),
            "group": "Global Options",
            "help": "Log level. Stick with INFO or VERBOSE unless you need to file an error "
                    "report. Be careful with TRACE as it will generate a lot of data"})
        global_args.append({
            "opts": ("-LF", "--logfile"),
            "action": SaveFileFullPaths,
            "filetypes": 'log',
            "type": str,
            "dest": "logfile",
            "group": "Global Options",
            "help": "Path to store the logfile. Leave blank to store in the faceswap folder",
            "default": None})
            "choices": ("dfl", "draw", "extract", "manual", "merge", "missing-alignments",
          argument_list.append({
              "opts": ("-j", "--job"),
              "action": Radio,
              "type": str,
            "choices": ("dfl", "draw", "extract", "manual", "merge", "missing-alignments",
                          "missing-frames", "leftover-faces", "multi-faces", "no-faces",
                          "reformat", "remove-faces", "remove-frames", "rename", "sort-x", "sort-y",
                          "spatial", "update-hashes"),
              "required": True,
              "help": "R|Choose which action you want to perform. "
keep keep keep keep replace keep keep keep keep keep
 Smart Mask - Extract code review

- Lint simple_tests.py
- Only reformat alignments file if it exists otherwise change filename
- Update legacy alignments to new format at all stages
- faces_detect.Mask.from_dict - logging format fix
- convert.py fix otf for new pipeline
- cli.py - Add note that masks not used. Revert convert masks
- faces_detect.py - Revert non-extract code
- Add .p and .pickle extensions for serializer
- plugins/extract revert some changes
- scripts/fsmedia - Revert code changes
- Pipeline - cleanup
- Consistant alpha channel stripping (fixes single-process)
- Store landmarks as numpy array
- Code attribution
- Normalize feed face and reference face to 0.0 - 1.0 in convert
- Lock in mask VRAM sized
- Add documentation to plugin_loader
- Update alignments tool to work with new format 
tools/cli.py