From 077862376e8fb76757d9a00a6f6e241b24c3f712 Mon Sep 17 00:00:00 2001
From: Gourieff <777@lovemet.ru>
Date: Thu, 5 Oct 2023 18:44:57 +0700
Subject: [PATCH] UPDATE: Processing SpeedUP, fixes
- Huge boost when swapping several faces
Thanks @Dutch77 for spotting #95 and for showing the way of resolving it
-Import of the paths module fix for Portable A1111
-VersionUP (beta passed)
---
README.md | 2 +-
README_RU.md | 2 +-
install.py | 8 +-
scripts/reactor_faceswap.py | 8 +-
scripts/reactor_swapper.py | 144 ++++++++++++++++++++----------------
scripts/reactor_version.py | 2 +-
6 files changed, 98 insertions(+), 68 deletions(-)
diff --git a/README.md b/README.md
index 492d3e8..f81abc3 100644
--- a/README.md
+++ b/README.md
@@ -2,7 +2,7 @@
- 
+ 
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 @@
- 
+ 
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