                          "rename", "sort-x", "sort-y", "spatial", "update-hashes"),
              "required": True,
              "help": "R|Choose which action you want to perform.\n"
                      "NB: All actions require an alignments file (-a) to be passed in."
                      "\n'draw': Draw landmarks on frames in the selected folder/video. A subfolder"
                      "\n\twill be created within the frames folder to hold the output." +
                      frames_dir + align_eyes +
                      "\n'extract': Re-extract faces from the source frames/video based on "
                      "\n\talignment data. This is a lot quicker than re-detecting faces." +
                      frames_and_faces_dir + align_eyes +
                      "\n'extract-large' - Extract all faces that have not been upscaled. Useful"
 
</s> remove                     "\n'extract': Re-extract faces from the source frames/video based on "
                    "\n\talignment data. This is a lot quicker than re-detecting faces." +
 </s> add                     "\nL|'extract': Re-extract faces from the source frames/video based on "
                    "alignment data. This is a lot quicker than re-detecting faces." + </s> remove             "help": "R|Choose which action you want to perform.\n"
 </s> add             "help": "R|Choose which action you want to perform. " </s> remove                     "\n'extract-large' - Extract all faces that have not been upscaled. Useful"
                    "\n\tfor excluding low-res images from a training set." +
 </s> add                     "\nL|'extract-large' - Extract all faces that have not been upscaled. Useful "
                    "for excluding low-res images from a training set." + </s> remove                     "\n'manual': Manually view and edit landmarks." + frames_dir + align_eyes +
                    "\n'merge': Merge multiple alignment files into one. Specify a space "
                    "\n\tseparated list of alignments files with the -a flag."
                    "\n'missing-alignments': Identify frames that do not exist in the alignments"
                    "\n\tfile." + output_opts + frames_dir +
                    "\n'missing-frames': Identify frames in the alignments file that do no "
                    "\n\tappear within the frames folder/video." + output_opts + frames_dir +
                    "\n'legacy': This updates legacy alignments to the latest format by rotating"
                    "\n\tthe landmarks and bounding boxes and adding face_hashes." +
 </s> add                     "\nL|'manual': Manually view and edit landmarks." + frames_dir + align_eyes +
                    "\nL|'merge': Merge multiple alignment files into one. Specify a space "
                    "separated list of alignments files with the -a flag."
                    "\nL|'missing-alignments': Identify frames that do not exist in the "
                    "alignments file." + output_opts + frames_dir +
                    "\nL|'missing-frames': Identify frames in the alignments file that do not "
                    "appear within the frames folder/video." + output_opts + frames_dir +
                    "\nL|'legacy': This updates legacy alignments to the latest format by "
                    "rotating the landmarks and bounding boxes and adding face_hashes." + </s> remove                     "\n'leftover-faces': Identify faces in the faces folder that do not exist in"
                    "\n\tthe alignments file." + output_opts + faces_dir +
                    "\n'multi-faces': Identify where multiple faces exist within the alignments"
                    "\n\tfile." + output_opts + frames_or_faces_dir +
                    "\n'no-faces': Identify frames that exist within the alignment file but no"
                    "\n\tfaces were detected." + output_opts + frames_dir +
                    "\n'reformat': Save a copy of alignments file in a different format. Specify"
                    "\n\ta format with the -fmt option."
                    "\n\tAlignments can be converted from DeepFaceLab by specifing:"
                    "\n\t    -a dfl"
                    "\n\t    -fc <source faces folder>"
                    "\n'remove-faces': Remove deleted faces from an alignments file. The original"
                    "\n\talignments file will be backed up. A different file format for the"
                    "\n\talignments file can optionally be specified (-fmt)." + faces_dir +
                    "\n'remove-frames': Remove deleted frames from an alignments file. The"
                    "\n\toriginal alignments file will be backed up. A different file format for"
                    "\n\tthe alignments file can optionally be specified (-fmt)." + frames_dir +
                    "\n'rename' - Rename faces to correspond with their parent frame and position"
                    "\n\tindex in the alignments file (i.e. how they are named after running"
                    "\n\textract)." + faces_dir +
                    "\n'sort-x': Re-index the alignments from left to right. For alignments with"
                    "\n\tmultiple faces this will ensure that the left-most face is at index 0"
                    "\n\tOptionally pass in a faces folder (-fc) to also rename extracted faces."
                    "\n'sort-y': Re-index the alignments from top to bottom. For alignments with"
                    "\n\tmultiple faces this will ensure that the top-most face is at index 0"
                    "\n\tOptionally pass in a faces folder (-fc) to also  rename extracted faces."
                    "\n'spatial': Perform spatial and temporal filtering to smooth alignments"
                    "\n\t(EXPERIMENTAL!)"
                    "\n'update-hashes': Recalculate the face hashes. Only use this if you have "
                    "\n\taltered the extracted faces (e.g. colour adjust). The files MUST be "
                    "\n\tnamed '<frame_name>_face index' (i.e. how they are named after running"
                    "\n\textract)." + faces_dir})
 </s> add                     "\nL|'leftover-faces': Identify faces in the faces folder that do not exist "
                    "in the alignments file." + output_opts + faces_dir +
                    "\nL|'multi-faces': Identify where multiple faces exist within the alignments "
                    "file." + output_opts + frames_or_faces_dir +
                    "\nL|'no-faces': Identify frames that exist within the alignment file but no "
                    "faces were detected." + output_opts + frames_dir +
                    "\nL|'reformat': Save a copy of alignments file in a different format. "
                    "Specify a format with the -fmt option. Alignments can be converted from "
                    "DeepFaceLab by specifing: '-a dfl -fc <source faces folder>'"
                    "\nL|'remove-faces': Remove deleted faces from an alignments file. The "
                    "original alignments file will be backed up. A different file format for the "
                    "alignments file can optionally be specified (-fmt)." + faces_dir +
                    "\nL|'remove-frames': Remove deleted frames from an alignments file. The "
                    "original alignments file will be backed up. A different file format for "
                    "the alignments file can optionally be specified (-fmt)." + frames_dir +
                    "\nL|'rename' - Rename faces to correspond with their parent frame and "
                    "position index in the alignments file (i.e. how they are named after running "
                    "extract)." + faces_dir +
                    "\nL|'sort-x': Re-index the alignments from left to right. For alignments "
                    "with multiple faces this will ensure that the left-most face is at index 0 "
                    "Optionally pass in a faces folder (-fc) to also rename extracted faces."
                    "\nL|'sort-y': Re-index the alignments from top to bottom. For alignments "
                    "with multiple faces this will ensure that the top-most face is at index 0. "
                    "Optionally pass in a faces folder (-fc) to also  rename extracted faces."
                    "\nL|'spatial': Perform spatial and temporal filtering to smooth alignments "
                    "(EXPERIMENTAL!)"
                    "\nL|'update-hashes': Recalculate the face hashes. Only use this if you have "
                    "altered the extracted faces (e.g. colour adjust). The files MUST be "
                    "named '<frame_name>_face index' (i.e. how they are named after running "
                    "extract)." + faces_dir})
                    "\nL|'draw': Draw landmarks on frames in the selected folder/video. A "
                    "subfolder will be created within the frames folder to hold the output." +
                          "rename", "sort-x", "sort-y", "spatial", "update-hashes"),
              "required": True,
              "help": "R|Choose which action you want to perform.\n"
                      "NB: All actions require an alignments file (-a) to be passed in."
                    "\nL|'draw': Draw landmarks on frames in the selected folder/video. A "
                    "subfolder will be created within the frames folder to hold the output." +
                    "\nL|'draw': Draw landmarks on frames in the selected folder/video. A "
                    "subfolder will be created within the frames folder to hold the output." +
                      frames_dir + align_eyes +
                      "\n'extract': Re-extract faces from the source frames/video based on "
                      "\n\talignment data. This is a lot quicker than re-detecting faces." +
                      frames_and_faces_dir + align_eyes +
                      "\n'extract-large' - Extract all faces that have not been upscaled. Useful"
keep keep keep keep replace replace keep keep keep keep keep
 Convert refactor (#703)

* Separate predict and implement pool

* Add check and raise error to multithreading

Box functions to config. Add crop box option.

* All masks to mask module. Refactor convert masks

Predicted mask passed from model. Cli update

* Intesect box with mask and fixes

* Use raw NN output for convert

Use raw mask for face adjustments. Split adjustments to pre and post warp

* Separate out adjustments. Add unmask sharpen

* Set sensible defaults. Pre PR Testing

* Fix queue sizes. Move masked.py to lib

* Fix Skip Frames. Fix GUI Config popup

* Sensible queue limits. Add a less resource intensive single processing mode

* Fix predicted mask. Amend smooth box defaults

* Deterministic ordering for video output

* Video to Video convert implemented

* Fixups

- Remove defaults from folders across all stages
- Move match-hist and aca into color adjustments selectable
- Handle crashes properly for pooled processes
- Fix output directory does not exist error when creating a new output folder
- Force output to frames if input is not a video

* Add Color Transfer adjustment method

Wrap info text in GUI plugin configure popup

* Refactor image adjustments. Easier to create plugins

Start implementing config options for video encoding

* Add video encoding config options

Allow video encoding for frames input (must pass in a reference video)
Move video and image output writers to plugins

* Image writers config options

Move scaling to cli
Move draw_transparent to images config
Add config options for cv2 writer
Add Pillow image writer

* Add gif filetype to Pillow. Fix draw transparent for Pillow

* Add Animated GIF writer

standardize opencv/pillow defaults

* [speedup] Pre-encode supported writers in the convert pool (opencv, pillow)

Move scaling to convert pool
Remove dfaker mask

* Fix default writer

* Bugfixes

* Better custom argparse formatting 
tools/cli.py