diff --git a/README.md b/README.md index 492d3e8..f81abc3 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ logo - ![Version](https://img.shields.io/badge/version-0.4.2_beta3-green?style=for-the-badge&labelColor=darkgreen) + ![Version](https://img.shields.io/badge/version-0.4.2-brightgreen?style=for-the-badge&labelColor=darkgreen) diff --git a/README_RU.md b/README_RU.md index 4bc289f..e44c962 100644 --- a/README_RU.md +++ b/README_RU.md @@ -2,7 +2,7 @@ logo - ![Version](https://img.shields.io/badge/версия-0.4.2_beta3-green?style=for-the-badge&labelColor=darkgreen) + ![Version](https://img.shields.io/badge/версия-0.4.2-brightgreen?style=for-the-badge&labelColor=darkgreen)
diff --git a/install.py b/install.py index fd4488f..7ad5192 100644 --- a/install.py +++ b/install.py @@ -5,7 +5,13 @@ from tqdm import tqdm import urllib.request from packaging import version as pv -from modules.paths_internal import models_path +try: + from modules.paths_internal import models_path +except: + try: + from modules.paths import models_path + except: + model_path = os.path.abspath("models") req_file = os.path.join(os.path.dirname(os.path.realpath(__file__)), "requirements.txt") diff --git a/scripts/reactor_faceswap.py b/scripts/reactor_faceswap.py index bf94423..f8f3fdd 100644 --- a/scripts/reactor_faceswap.py +++ b/scripts/reactor_faceswap.py @@ -13,8 +13,14 @@ from modules.processing import ( StableDiffusionProcessingImg2Img, ) from modules.face_restoration import FaceRestoration -from modules.paths_internal import models_path from modules.images import save_image +try: + from modules.paths_internal import models_path +except: + try: + from modules.paths import models_path + except: + model_path = os.path.abspath("models") from scripts.reactor_logger import logger from scripts.reactor_swapper import EnhancementOptions, swap_face, check_process_halt, reset_messaged diff --git a/scripts/reactor_swapper.py b/scripts/reactor_swapper.py index 8abf955..54eced0 100644 --- a/scripts/reactor_swapper.py +++ b/scripts/reactor_swapper.py @@ -13,8 +13,14 @@ from modules.face_restoration import FaceRestoration from modules import codeformer_model from modules.upscaler import UpscalerData from modules.shared import state -from modules.paths_internal import models_path from scripts.reactor_logger import logger +try: + from modules.paths_internal import models_path +except: + try: + from modules.paths import models_path + except: + model_path = os.path.abspath("models") import warnings @@ -196,15 +202,16 @@ def get_face_age(face, face_index): return "None" return face_age -def reget_face_single(img_data, det_size, face_index, gender_source, gender_target): +def reget_face_single(face, det_size, face_index, gender_source, gender_target): det_size_half = (det_size[0] // 2, det_size[1] // 2) - return get_face_single(img_data, face_index=face_index, det_size=det_size_half, gender_source=gender_source, gender_target=gender_target) + return get_face_single(face, face_index=face_index, det_size=det_size_half, gender_source=gender_source, gender_target=gender_target) - -def get_face_single(img_data: np.ndarray, face_index=0, det_size=(640, 640), gender_source=0, gender_target=0): +def analyze_faces(img_data: np.ndarray, det_size=(640, 640)): face_analyser = copy.deepcopy(getAnalysisModel()) face_analyser.prepare(ctx_id=0, det_size=det_size) - face = face_analyser.get(img_data) + return face_analyser.get(img_data) + +def get_face_single(face, face_index=0, det_size=(640, 640), gender_source=0, gender_target=0): buffalo_path = os.path.join(models_path, "insightface/models/buffalo_l.zip") if os.path.exists(buffalo_path): @@ -226,18 +233,18 @@ def get_face_single(img_data: np.ndarray, face_index=0, det_size=(640, 640), gen if gender_source != 0: if len(face) == 0 and det_size[0] > 320 and det_size[1] > 320: - return reget_face_single(img_data, det_size, face_index, gender_source, gender_target) + return reget_face_single(face, det_size, face_index, gender_source, gender_target) faces, wrong_gender = get_face_gender(face,face_index,gender_source,"Source",gender_detected) return faces, wrong_gender, face_age, face_gender if gender_target != 0: if len(face) == 0 and det_size[0] > 320 and det_size[1] > 320: - return reget_face_single(img_data, det_size, face_index, gender_source, gender_target) + return reget_face_single(face, det_size, face_index, gender_source, gender_target) faces, wrong_gender = get_face_gender(face,face_index,gender_target,"Target",gender_detected) return faces, wrong_gender, face_age, face_gender if len(face) == 0 and det_size[0] > 320 and det_size[1] > 320: - return reget_face_single(img_data, det_size, face_index, gender_source, gender_target) + return reget_face_single(face, det_size, face_index, gender_source, gender_target) try: return sorted(face, key=lambda x: x.bbox[0])[face_index], 0, face_age, face_gender @@ -258,7 +265,7 @@ def swap_face( result_image = target_img if check_process_halt(): - return result_image + return result_image, [], 0 if model is not None: @@ -282,49 +289,72 @@ def swap_face( output_info: str = "" swapped = 0 - logger.info("Detecting Source Face, Index = %s", source_faces_index[0]) - source_face, wrong_gender, source_age, source_gender = get_face_single(source_img, face_index=source_faces_index[0], gender_source=gender_source) - if source_age != "None" or source_gender != "None": - logger.info("Detected: -%s- y.o. %s", source_age, source_gender) + logger.info("Analyzing Source Image...") + source_faces = analyze_faces(source_img) - output_info = f"SourceFaceIndex={source_faces_index[0]};Age={source_age};Gender={source_gender}\n" - output.append(output_info) + if source_faces is not None: - if len(source_faces_index) != 0 and len(source_faces_index) != 1 and len(source_faces_index) != len(faces_index): - logger.info("Source Faces must have no entries (default=0), one entry, or same number of entries as target faces.") - elif source_face is not None: - - result = target_img - face_swapper = getFaceSwapModel(model) + logger.info("Analyzing Target Image...") + target_faces = analyze_faces(target_img) - source_face_idx = 0 + logger.info("Detecting Source Face, Index = %s", source_faces_index[0]) + source_face, wrong_gender, source_age, source_gender = get_face_single(source_faces, face_index=source_faces_index[0], gender_source=gender_source) + if source_age != "None" or source_gender != "None": + logger.info("Detected: -%s- y.o. %s", source_age, source_gender) - for face_num in faces_index: - if len(source_faces_index) > 1 and source_face_idx > 0: + output_info = f"SourceFaceIndex={source_faces_index[0]};Age={source_age};Gender={source_gender}\n" + output.append(output_info) - logger.info("Detecting Source Face, Index = %s", source_faces_index[source_face_idx]) - source_face, wrong_gender, source_age, source_gender = get_face_single(source_img, face_index=source_faces_index[source_face_idx], gender_source=gender_source) - if source_age != "None" or source_gender != "None": - logger.info("Detected: -%s- y.o. %s", source_age, source_gender) + if len(source_faces_index) != 0 and len(source_faces_index) != 1 and len(source_faces_index) != len(faces_index): + logger.info("Source Faces must have no entries (default=0), one entry, or same number of entries as target faces.") + elif source_face is not None: + + result = target_img + face_swapper = getFaceSwapModel(model) - output_info = f"SourceFaceIndex={source_faces_index[source_face_idx]};Age={source_age};Gender={source_gender}\n" - output.append(output_info) + source_face_idx = 0 - source_face_idx += 1 + for face_num in faces_index: + if check_process_halt(): + return result_image, [], 0 + if len(source_faces_index) > 1 and source_face_idx > 0: + logger.info("Detecting Source Face, Index = %s", source_faces_index[source_face_idx]) + source_face, wrong_gender, source_age, source_gender = get_face_single(source_faces, face_index=source_faces_index[source_face_idx], gender_source=gender_source) + if source_age != "None" or source_gender != "None": + logger.info("Detected: -%s- y.o. %s", source_age, source_gender) - if source_face is not None and wrong_gender == 0: - logger.info("Detecting Target Face, Index = %s", face_num) - target_face, wrong_gender, target_age, target_gender = get_face_single(target_img, face_index=face_num, gender_target=gender_target) - if target_age != "None" or target_gender != "None": - logger.info("Detected: -%s- y.o. %s", target_age, target_gender) + output_info = f"SourceFaceIndex={source_faces_index[source_face_idx]};Age={source_age};Gender={source_gender}\n" + output.append(output_info) - output_info = f"TargetFaceIndex={face_num};Age={target_age};Gender={target_gender}\n" - output.append(output_info) - - if target_face is not None and wrong_gender == 0: - logger.info("Swapping Source into Target") - result = face_swapper.get(result, target_face, source_face) - swapped += 1 + source_face_idx += 1 + + if source_face is not None and wrong_gender == 0: + logger.info("Detecting Target Face, Index = %s", face_num) + target_face, wrong_gender, target_age, target_gender = get_face_single(target_faces, face_index=face_num, gender_target=gender_target) + if target_age != "None" or target_gender != "None": + logger.info("Detected: -%s- y.o. %s", target_age, target_gender) + + output_info = f"TargetFaceIndex={face_num};Age={target_age};Gender={target_gender}\n" + output.append(output_info) + + if target_face is not None and wrong_gender == 0: + logger.info("Swapping Source into Target") + result = face_swapper.get(result, target_face, source_face) + swapped += 1 + + elif wrong_gender == 1: + wrong_gender = 0 + + if source_face_idx == len(source_faces_index): + result_image = Image.fromarray(cv2.cvtColor(result, cv2.COLOR_BGR2RGB)) + + if enhancement_options is not None and len(source_faces_index) > 1: + result_image = enhance_image(result_image, enhancement_options) + + return result_image, output, swapped + + else: + logger.info(f"No target face found for {face_num}") elif wrong_gender == 1: wrong_gender = 0 @@ -338,27 +368,15 @@ def swap_face( return result_image, output, swapped else: - logger.info(f"No target face found for {face_num}") - - elif wrong_gender == 1: - wrong_gender = 0 - - if source_face_idx == len(source_faces_index): - result_image = Image.fromarray(cv2.cvtColor(result, cv2.COLOR_BGR2RGB)) - - if enhancement_options is not None and len(source_faces_index) > 1: - result_image = enhance_image(result_image, enhancement_options) - - return result_image, output, swapped - - else: - logger.info(f"No source face found for face number {source_face_idx}.") + logger.info(f"No source face found for face number {source_face_idx}.") - result_image = Image.fromarray(cv2.cvtColor(result, cv2.COLOR_BGR2RGB)) - - if enhancement_options is not None and swapped > 0: - result_image = enhance_image(result_image, enhancement_options) + result_image = Image.fromarray(cv2.cvtColor(result, cv2.COLOR_BGR2RGB)) + + if enhancement_options is not None and swapped > 0: + result_image = enhance_image(result_image, enhancement_options) + else: + logger.info("No source face(s) in Index %s", source_faces_index[source_face_idx]) else: logger.info("No source face(s) found") diff --git a/scripts/reactor_version.py b/scripts/reactor_version.py index c64c1ce..6106c8c 100644 --- a/scripts/reactor_version.py +++ b/scripts/reactor_version.py @@ -1,5 +1,5 @@ app_title = "ReActor" -version_flag = "v0.4.2-b3" +version_flag = "v0.4.2" from scripts.reactor_logger import logger, get_Run, set_Run