  from lib.utils import get_image_paths, get_folder
  from lib.cli import FullPaths, argparse, os, sys
  from plugins.PluginLoader import PluginLoader
  
  tf = None
  set_session = None
  def import_tensorflow_keras():
      ''' Import the TensorFlow and keras set_session modules only when they are required '''
      global tf
      global set_session
      if tf is None or set_session is None:
          import tensorflow
          import keras.backend.tensorflow_backend
          tf = tensorflow
          set_session = keras.backend.tensorflow_backend.set_session
  
  class TrainingProcessor(object):
      arguments = None
  
      def __init__(self, subparser, command, description='default'):
          self.argument_list = self.get_argument_list()
          self.optional_arguments = self.get_optional_arguments()
          self.parse_arguments(description, subparser, command)
          self.lock = threading.Lock()
  
      def process_arguments(self, arguments):
          self.arguments = arguments
          print("Model A Directory: {}".format(self.arguments.input_A))
          print("Model B Directory: {}".format(self.arguments.input_B))
 
</s> remove import threading 
from lib.utils import get_image_paths, get_folder
from lib.cli import FullPaths, argparse, os, sys
from plugins.PluginLoader import PluginLoader
 </s> add import os
import sys
import threading </s> remove     def process_arguments(self, arguments):
        self.arguments = arguments
        print("Model A Directory: {}".format(self.arguments.input_A))
        print("Model B Directory: {}".format(self.arguments.input_B))
        print("Training data directory: {}".format(self.arguments.model_dir))
 </s> add from lib.utils import get_folder, get_image_paths, set_system_verbosity
from plugins.PluginLoader import PluginLoader </s> remove # DLIB is a GPU Memory hog, so the following modules should only be imported when required
detect_faces = None
DetectedFace = None
FaceFilter = None

def import_faces_detect():
    ''' Import the faces_detect module only when it is required '''
    global detect_faces
    global DetectedFace
    if detect_faces is None or DetectedFace is None:
        import lib.faces_detect 
        detect_faces = lib.faces_detect.detect_faces
        DetectedFace = lib.faces_detect.DetectedFace
 </s> add from plugins.PluginLoader import PluginLoader

class ScriptExecutor(object):
    """ Loads the relevant script modules and executes the script.
        This class is initialised in each of the argparsers for the relevant command,
        then execute script is called within their set_default function """

    def __init__(self, command, subparsers=None):
        self.command = command.lower()
        self.subparsers = subparsers

    def import_script(self):
        """ Only import a script's modules when running that script."""
        if self.command == 'extract':
            from scripts.extract import Extract as script
        elif self.command == 'train':
            from scripts.train import Train as script
        elif self.command == 'convert':
            from scripts.convert import Convert as script
        elif self.command == 'gui':
            from scripts.gui import Gui as script
        else:
            script = None
        return script </s> remove         self.create_parser(subparser, command, description)
        self.parse_arguments(description, subparser, command)
 </s> add         self.parser = self.create_parser(subparser, command, description)

        self.add_arguments()

        script = ScriptExecutor(command, subparsers)
        self.parser.set_defaults(func=script.execute_script) </s> remove         args = {'prog': self.prog, 'message': message}
        self.exit(2, '%(prog)s: error: %(message)s\n' % args)

class DirectoryProcessor(object):
    '''
    Abstract class that processes a directory of images
    and writes output to the specified folder
    '''
    arguments = None
    parser = None

    input_dir = None
    output_dir = None

    images_found = 0
    num_faces_detected = 0
    faces_detected = dict()
    verify_output = False
    rotation_angles = None

    def __init__(self, subparser, command, description='default'):
 </s> add         args = {"prog": self.prog, "message": message}
        self.exit(2, "%(prog)s: error: %(message)s\n" % args)

class FaceSwapArgs(object):
    """ Faceswap argument parser functions that are universal
        to all commands. Should be the parent function of all
        subsequent argparsers """
    def __init__(self, subparser, command, description="default", subparsers=None):
import cv2
import tensorflow as tf
from keras.backend.tensorflow_backend import set_session
  from lib.utils import get_image_paths, get_folder
  from lib.cli import FullPaths, argparse, os, sys
  from plugins.PluginLoader import PluginLoader
  
import cv2
import tensorflow as tf
from keras.backend.tensorflow_backend import set_session
import cv2
import tensorflow as tf
from keras.backend.tensorflow_backend import set_session
import cv2
import tensorflow as tf
from keras.backend.tensorflow_backend import set_session
import cv2
import tensorflow as tf
from keras.backend.tensorflow_backend import set_session
import cv2
import tensorflow as tf
from keras.backend.tensorflow_backend import set_session
import cv2
import tensorflow as tf
from keras.backend.tensorflow_backend import set_session
import cv2
import tensorflow as tf
from keras.backend.tensorflow_backend import set_session
import cv2
import tensorflow as tf
from keras.backend.tensorflow_backend import set_session
import cv2
import tensorflow as tf
from keras.backend.tensorflow_backend import set_session
import cv2
import tensorflow as tf
from keras.backend.tensorflow_backend import set_session
import cv2
import tensorflow as tf
from keras.backend.tensorflow_backend import set_session
import cv2
import tensorflow as tf
from keras.backend.tensorflow_backend import set_session
import cv2
import tensorflow as tf
from keras.backend.tensorflow_backend import set_session
import cv2
import tensorflow as tf
from keras.backend.tensorflow_backend import set_session
import cv2
import tensorflow as tf
from keras.backend.tensorflow_backend import set_session
import cv2
import tensorflow as tf
from keras.backend.tensorflow_backend import set_session
import cv2
import tensorflow as tf
from keras.backend.tensorflow_backend import set_session
import cv2
import tensorflow as tf
from keras.backend.tensorflow_backend import set_session
import cv2
import tensorflow as tf
from keras.backend.tensorflow_backend import set_session
import cv2
import tensorflow as tf
from keras.backend.tensorflow_backend import set_session
  
      def process_arguments(self, arguments):
          self.arguments = arguments
          print("Model A Directory: {}".format(self.arguments.input_A))
          print("Model B Directory: {}".format(self.arguments.input_B))
keep keep keep keep replace replace replace replace replace replace replace replace replace replace replace replace replace replace replace replace replace replace replace replace keep keep keep keep keep
 cli/scripts Refactor (#367)

* Refactor for PEP 8 and split process function

* Remove backwards compatibility for skip frames

* Split optional functions into own class. Make functions more modular

* Conform scripts folder to PEP 8

* train.py - Fix write image bug. Make more modular

* extract.py - Make more modular, Put optional actions into own class

* cli.py - start PEP 8

* cli,py - Pep 8. Refactor and make modular. Bugfixes

* 1st round refactor. Completely untested and probably broken.

* convert.py: Extract alignments from frames if they don't exist

* BugFix: SkipExisting broken since face name refactor

* Extract.py tested

* Minor formatting

* convert.py + train.py amended not tested

* train.py - Semi-fix for hang on reaching target iteration. Now quits on preview mode
Make tensorflow / system warning less verbose

* 2nd pass refactor. Semi tested

bugfixes

* Remove obsolete code. imread/write to Utils

* rename inout.py to fsmedia.py

* Final bugfixes 
scripts/train.py