import pickle from pathlib import Path import cv2 from DFLIMG import * from facelib import LandmarksProcessor, FaceType from core.interact import interact as io from core import pathex from core.cv2ex import * def save_faceset_metadata_folder(input_path): input_path = Path(input_path) metadata_filepath = input_path / 'meta.dat' io.log_info (f"Saving metadata to {str(metadata_filepath)}\r\n") d = {} for filepath in io.progress_bar_generator( pathex.get_image_paths(input_path), "Processing"): filepath = Path(filepath) dflimg = DFLIMG.load (filepath) if dflimg is None or not dflimg.has_data(): io.log_info(f"{filepath} is not a dfl image file") continue dfl_dict = dflimg.get_dict() d[filepath.name] = ( dflimg.get_shape(), dfl_dict ) try: with open(metadata_filepath, "wb") as f: f.write ( pickle.dumps(d) ) except: raise Exception( 'cannot save %s' % (filename) ) io.log_info("Now you can edit images.") io.log_info("!!! Keep same filenames in the folder.") io.log_info("You can change size of images, restoring process will downscale back to original size.") io.log_info("After that, use restore metadata.") def restore_faceset_metadata_folder(input_path): input_path = Path(input_path) metadata_filepath = input_path / 'meta.dat' io.log_info (f"Restoring metadata from {str(metadata_filepath)}.\r\n") if not metadata_filepath.exists(): io.log_err(f"Unable to find {str(metadata_filepath)}.") try: with open(metadata_filepath, "rb") as f: d = pickle.loads(f.read()) except: raise FileNotFoundError(filename) for filepath in io.progress_bar_generator( pathex.get_image_paths(input_path, image_extensions=['.jpg'], return_Path_class=True), "Processing"): saved_data = d.get(filepath.name, None) if saved_data is None: io.log_info(f"No saved metadata for {filepath}") continue shape, dfl_dict = saved_data img = cv2_imread (filepath) if img.shape != shape: img = cv2.resize (img, (shape[1], shape[0]), interpolation=cv2.INTER_LANCZOS4 ) cv2_imwrite (str(filepath), img, [int(cv2.IMWRITE_JPEG_QUALITY), 100] ) if filepath.suffix == '.jpg': dflimg = DFLJPG.load(filepath) dflimg.set_dict(dfl_dict) dflimg.save() else: continue metadata_filepath.unlink() def add_landmarks_debug_images(input_path): io.log_info ("Adding landmarks debug images...") for filepath in io.progress_bar_generator( pathex.get_image_paths(input_path), "Processing"): filepath = Path(filepath) img = cv2_imread(str(filepath)) dflimg = DFLIMG.load (filepath) if dflimg is None or not dflimg.has_data(): io.log_err (f"{filepath.name} is not a dfl image file") continue if img is not None: face_landmarks = dflimg.get_landmarks() face_type = FaceType.fromString ( dflimg.get_face_type() ) if face_type == FaceType.MARK_ONLY: rect = dflimg.get_source_rect() LandmarksProcessor.draw_rect_landmarks(img, rect, face_landmarks, FaceType.FULL ) else: LandmarksProcessor.draw_landmarks(img, face_landmarks, transparent_mask=True ) output_file = '{}{}'.format( str(Path(str(input_path)) / filepath.stem), '_debug.jpg') cv2_imwrite(output_file, img, [int(cv2.IMWRITE_JPEG_QUALITY), 50] ) def recover_original_aligned_filename(input_path): io.log_info ("Recovering original aligned filename...") files = [] for filepath in io.progress_bar_generator( pathex.get_image_paths(input_path), "Processing"): filepath = Path(filepath) dflimg = DFLIMG.load (filepath) if dflimg is None or not dflimg.has_data(): io.log_err (f"{filepath.name} is not a dfl image file") continue files += [ [filepath, None, dflimg.get_source_filename(), False] ] files_len = len(files) for i in io.progress_bar_generator( range(files_len), "Sorting" ): fp, _, sf, converted = files[i] if converted: continue sf_stem = Path(sf).stem files[i][1] = fp.parent / ( sf_stem + '_0' + fp.suffix ) files[i][3] = True c = 1 for j in range(i+1, files_len): fp_j, _, sf_j, converted_j = files[j] if converted_j: continue if sf_j == sf: files[j][1] = fp_j.parent / ( sf_stem + ('_%d' % (c)) + fp_j.suffix ) files[j][3] = True c += 1 for file in io.progress_bar_generator( files, "Renaming", leave=False ): fs, _, _, _ = file dst = fs.parent / ( fs.stem + '_tmp' + fs.suffix ) try: fs.rename (dst) except: io.log_err ('fail to rename %s' % (fs.name) ) for file in io.progress_bar_generator( files, "Renaming" ): fs, fd, _, _ = file fs = fs.parent / ( fs.stem + '_tmp' + fs.suffix ) try: fs.rename (fd) except: io.log_err ('fail to rename %s' % (fs.name) )