  from time import sleep
  
  import cv2
  
  from lib.keypress import KBHit
  from lib.multithreading import MultiThread
  from lib.utils import (get_folder, get_image_paths, FaceswapError, _image_extensions)
  from plugins.plugin_loader import PluginLoader
  
  logger = logging.getLogger(__name__)  # pylint: disable=invalid-name
 
</s> remove from lib.align import (Alignments, AlignedFace, DetectedFace, get_centered_size,
                       update_legacy_png_header)
from lib.image import read_image_meta_batch
from lib.training_data import TrainingDataGenerator
 </s> add from lib.training import TrainingDataGenerator </s> remove from concurrent import futures
from functools import partial

 </s> add  </s> remove from tqdm import tqdm
 </s> add  </s> remove def read_image_batch(filenames):
 </s> add def read_image_batch(filenames, with_metadata=False): </s> remove     image_extensions = _image_extensions
 </s> add     image_extensions = _image_extensions if extension is None else [extension]
from lib.image import read_image_meta
  from time import sleep
  
  import cv2
  
from lib.image import read_image_meta
  from lib.keypress import KBHit
  from lib.multithreading import MultiThread
  from lib.utils import (get_folder, get_image_paths, FaceswapError, _image_extensions)
  from plugins.plugin_loader import PluginLoader
  
  logger = logging.getLogger(__name__)  # pylint: disable=invalid-name
keep keep keep add keep keep keep keep keep keep
 Training startup updates
  - Remove alignments path option from cli
  - Restructure training_data.py
  - Load alignment data from PNG header during first epoch
  - lib.image.read_image_batch - Add option to return metadata
  - lib.utils.get_image_paths - Add option for explicit extension
  - plugins.train.trainer._base - remove pre-cache alignments code
  - scripts.train - Check first image in training folders for metadata
  - Documentation 
scripts/train.py