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)
This commit is contained in:
Gourieff 2023-10-05 18:44:57 +07:00
parent 6d6981acbb
commit 077862376e
6 changed files with 98 additions and 68 deletions

View File

@ -2,7 +2,7 @@
<img src="example/ReActor_logo_red.png" alt="logo" width="180px"/> <img src="example/ReActor_logo_red.png" alt="logo" width="180px"/>
![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)
<table> <table>
<tr> <tr>

View File

@ -2,7 +2,7 @@
<img src="example/ReActor_logo_red.png" alt="logo" width="180px"/> <img src="example/ReActor_logo_red.png" alt="logo" width="180px"/>
![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)
<table> <table>
<tr> <tr>

View File

@ -5,7 +5,13 @@ from tqdm import tqdm
import urllib.request import urllib.request
from packaging import version as pv from packaging import version as pv
try:
from modules.paths_internal import models_path 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") req_file = os.path.join(os.path.dirname(os.path.realpath(__file__)), "requirements.txt")

View File

@ -13,8 +13,14 @@ from modules.processing import (
StableDiffusionProcessingImg2Img, StableDiffusionProcessingImg2Img,
) )
from modules.face_restoration import FaceRestoration from modules.face_restoration import FaceRestoration
from modules.paths_internal import models_path
from modules.images import save_image 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_logger import logger
from scripts.reactor_swapper import EnhancementOptions, swap_face, check_process_halt, reset_messaged from scripts.reactor_swapper import EnhancementOptions, swap_face, check_process_halt, reset_messaged

View File

@ -13,8 +13,14 @@ from modules.face_restoration import FaceRestoration
from modules import codeformer_model from modules import codeformer_model
from modules.upscaler import UpscalerData from modules.upscaler import UpscalerData
from modules.shared import state from modules.shared import state
from modules.paths_internal import models_path
from scripts.reactor_logger import logger 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 import warnings
@ -196,15 +202,16 @@ def get_face_age(face, face_index):
return "None" return "None"
return face_age 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) 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 analyze_faces(img_data: np.ndarray, det_size=(640, 640)):
def get_face_single(img_data: np.ndarray, face_index=0, det_size=(640, 640), gender_source=0, gender_target=0):
face_analyser = copy.deepcopy(getAnalysisModel()) face_analyser = copy.deepcopy(getAnalysisModel())
face_analyser.prepare(ctx_id=0, det_size=det_size) 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") buffalo_path = os.path.join(models_path, "insightface/models/buffalo_l.zip")
if os.path.exists(buffalo_path): 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 gender_source != 0:
if len(face) == 0 and det_size[0] > 320 and det_size[1] > 320: 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) faces, wrong_gender = get_face_gender(face,face_index,gender_source,"Source",gender_detected)
return faces, wrong_gender, face_age, face_gender return faces, wrong_gender, face_age, face_gender
if gender_target != 0: if gender_target != 0:
if len(face) == 0 and det_size[0] > 320 and det_size[1] > 320: 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) faces, wrong_gender = get_face_gender(face,face_index,gender_target,"Target",gender_detected)
return faces, wrong_gender, face_age, face_gender return faces, wrong_gender, face_age, face_gender
if len(face) == 0 and det_size[0] > 320 and det_size[1] > 320: 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: try:
return sorted(face, key=lambda x: x.bbox[0])[face_index], 0, face_age, face_gender 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 result_image = target_img
if check_process_halt(): if check_process_halt():
return result_image return result_image, [], 0
if model is not None: if model is not None:
@ -282,8 +289,16 @@ def swap_face(
output_info: str = "" output_info: str = ""
swapped = 0 swapped = 0
logger.info("Analyzing Source Image...")
source_faces = analyze_faces(source_img)
if source_faces is not None:
logger.info("Analyzing Target Image...")
target_faces = analyze_faces(target_img)
logger.info("Detecting Source Face, Index = %s", source_faces_index[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) 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": if source_age != "None" or source_gender != "None":
logger.info("Detected: -%s- y.o. %s", source_age, source_gender) logger.info("Detected: -%s- y.o. %s", source_age, source_gender)
@ -300,10 +315,11 @@ def swap_face(
source_face_idx = 0 source_face_idx = 0
for face_num in faces_index: 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: if len(source_faces_index) > 1 and source_face_idx > 0:
logger.info("Detecting Source Face, Index = %s", source_faces_index[source_face_idx]) 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) 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": if source_age != "None" or source_gender != "None":
logger.info("Detected: -%s- y.o. %s", source_age, source_gender) logger.info("Detected: -%s- y.o. %s", source_age, source_gender)
@ -314,7 +330,7 @@ def swap_face(
if source_face is not None and wrong_gender == 0: if source_face is not None and wrong_gender == 0:
logger.info("Detecting Target Face, Index = %s", face_num) 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) 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": if target_age != "None" or target_gender != "None":
logger.info("Detected: -%s- y.o. %s", target_age, target_gender) logger.info("Detected: -%s- y.o. %s", target_age, target_gender)
@ -359,6 +375,8 @@ def swap_face(
if enhancement_options is not None and swapped > 0: if enhancement_options is not None and swapped > 0:
result_image = enhance_image(result_image, enhancement_options) 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: else:
logger.info("No source face(s) found") logger.info("No source face(s) found")

View File

@ -1,5 +1,5 @@
app_title = "ReActor" app_title = "ReActor"
version_flag = "v0.4.2-b3" version_flag = "v0.4.2"
from scripts.reactor_logger import logger, get_Run, set_Run from scripts.reactor_logger import logger, get_Run, set_Run