FIX: Interruption issue
+ VersionUP (beta)
This commit is contained in:
parent
8b69cd5854
commit
1d55c51a74
@ -1,4 +1,4 @@
|
|||||||
# ReActor 0.3.1 for StableDiffusion
|
# ReActor 0.3.2b for StableDiffusion
|
||||||
### The Fast and Simple "[roop-based](https://github.com/s0md3v/sd-webui-roop)" FaceSwap Extension with a lot of improvements and without NSFW filter (uncensored, use it on your own [responsibility](#disclaimer))
|
### The Fast and Simple "[roop-based](https://github.com/s0md3v/sd-webui-roop)" FaceSwap Extension with a lot of improvements and without NSFW filter (uncensored, use it on your own [responsibility](#disclaimer))
|
||||||
|
|
||||||
> Ex "Roop-GE" (GE - Gourieff Edition, aka "NSFW-Roop"), the extension was renamed with the version 0.3.0<br>
|
> Ex "Roop-GE" (GE - Gourieff Edition, aka "NSFW-Roop"), the extension was renamed with the version 0.3.0<br>
|
||||||
|
|||||||
@ -6,13 +6,12 @@ from modules.processing import (
|
|||||||
StableDiffusionProcessing,
|
StableDiffusionProcessing,
|
||||||
StableDiffusionProcessingImg2Img,
|
StableDiffusionProcessingImg2Img,
|
||||||
)
|
)
|
||||||
from modules.shared import cmd_opts, opts, state
|
|
||||||
from PIL import Image
|
from PIL import Image
|
||||||
import glob
|
import glob
|
||||||
from modules.face_restoration import FaceRestoration
|
from modules.face_restoration import FaceRestoration
|
||||||
|
|
||||||
from scripts.logger import logger
|
from scripts.logger import logger
|
||||||
from scripts.swapper import UpscaleOptions, swap_face
|
from scripts.swapper import UpscaleOptions, swap_face, check_process_halt, reset_messaged
|
||||||
from scripts.version import version_flag, app_title
|
from scripts.version import version_flag, app_title
|
||||||
from scripts.console_log_patch import apply_logging_patch
|
from scripts.console_log_patch import apply_logging_patch
|
||||||
import os
|
import os
|
||||||
@ -200,6 +199,10 @@ class FaceSwapScript(scripts.Script):
|
|||||||
):
|
):
|
||||||
self.enable = enable
|
self.enable = enable
|
||||||
if self.enable:
|
if self.enable:
|
||||||
|
|
||||||
|
reset_messaged()
|
||||||
|
if check_process_halt():
|
||||||
|
return
|
||||||
|
|
||||||
global MODELS_PATH
|
global MODELS_PATH
|
||||||
self.source = img
|
self.source = img
|
||||||
@ -228,10 +231,10 @@ class FaceSwapScript(scripts.Script):
|
|||||||
if self.source is not None:
|
if self.source is not None:
|
||||||
apply_logging_patch(console_logging_level)
|
apply_logging_patch(console_logging_level)
|
||||||
if isinstance(p, StableDiffusionProcessingImg2Img) and swap_in_source:
|
if isinstance(p, StableDiffusionProcessingImg2Img) and swap_in_source:
|
||||||
logger.info(f"Working: source face index %s, target face index %s", self.source_faces_index, self.faces_index)
|
logger.info("Working: source face index %s, target face index %s", self.source_faces_index, self.faces_index)
|
||||||
|
|
||||||
for i in range(len(p.init_images)):
|
for i in range(len(p.init_images)):
|
||||||
logger.info(f"Swap in %s", i)
|
logger.info("Swap in %s", i)
|
||||||
result = swap_face(
|
result = swap_face(
|
||||||
self.source,
|
self.source,
|
||||||
p.init_images[i],
|
p.init_images[i],
|
||||||
@ -243,8 +246,12 @@ class FaceSwapScript(scripts.Script):
|
|||||||
gender_target=self.gender_target,
|
gender_target=self.gender_target,
|
||||||
)
|
)
|
||||||
p.init_images[i] = result
|
p.init_images[i] = result
|
||||||
|
|
||||||
|
if shared.state.interrupted or shared.state.skipped:
|
||||||
|
return
|
||||||
|
|
||||||
else:
|
else:
|
||||||
logger.error(f"Please provide a source face")
|
logger.error("Please provide a source face")
|
||||||
|
|
||||||
def postprocess_batch(self, p, *args, **kwargs):
|
def postprocess_batch(self, p, *args, **kwargs):
|
||||||
if self.enable:
|
if self.enable:
|
||||||
@ -252,8 +259,16 @@ class FaceSwapScript(scripts.Script):
|
|||||||
|
|
||||||
def postprocess_image(self, p, script_pp: scripts.PostprocessImageArgs, *args):
|
def postprocess_image(self, p, script_pp: scripts.PostprocessImageArgs, *args):
|
||||||
if self.enable and self.swap_in_generated:
|
if self.enable and self.swap_in_generated:
|
||||||
|
|
||||||
|
current_job_number = shared.state.job_no + 1
|
||||||
|
job_count = shared.state.job_count
|
||||||
|
if current_job_number == job_count:
|
||||||
|
reset_messaged()
|
||||||
|
if check_process_halt():
|
||||||
|
return
|
||||||
|
|
||||||
if self.source is not None:
|
if self.source is not None:
|
||||||
logger.info(f"Working: source face index %s, target face index %s", self.source_faces_index, self.faces_index)
|
logger.info("Working: source face index %s, target face index %s", self.source_faces_index, self.faces_index)
|
||||||
image: Image.Image = script_pp.image
|
image: Image.Image = script_pp.image
|
||||||
result = swap_face(
|
result = swap_face(
|
||||||
self.source,
|
self.source,
|
||||||
@ -271,4 +286,4 @@ class FaceSwapScript(scripts.Script):
|
|||||||
p.extra_generation_params.update(pp.info)
|
p.extra_generation_params.update(pp.info)
|
||||||
script_pp.image = pp.image
|
script_pp.image = pp.image
|
||||||
except:
|
except:
|
||||||
logger.error(f"Cannot create a result image")
|
logger.error("Cannot create a result image")
|
||||||
|
|||||||
@ -12,6 +12,7 @@ import onnxruntime
|
|||||||
|
|
||||||
from modules.face_restoration import FaceRestoration
|
from modules.face_restoration import FaceRestoration
|
||||||
from modules.upscaler import UpscalerData
|
from modules.upscaler import UpscalerData
|
||||||
|
from modules.shared import state
|
||||||
from scripts.logger import logger
|
from scripts.logger import logger
|
||||||
|
|
||||||
import warnings
|
import warnings
|
||||||
@ -50,6 +51,31 @@ def cosine_similarity(test_vec: np.ndarray, source_vecs: List[np.ndarray]) -> fl
|
|||||||
return average_cos_dist
|
return average_cos_dist
|
||||||
|
|
||||||
|
|
||||||
|
MESSAGED_STOPPED = False
|
||||||
|
MESSAGED_SKIPPED = False
|
||||||
|
|
||||||
|
def reset_messaged():
|
||||||
|
global MESSAGED_STOPPED, MESSAGED_SKIPPED
|
||||||
|
if not state.interrupted:
|
||||||
|
MESSAGED_STOPPED = False
|
||||||
|
if not state.skipped:
|
||||||
|
MESSAGED_SKIPPED = False
|
||||||
|
|
||||||
|
def check_process_halt(msgforced: bool = False):
|
||||||
|
global MESSAGED_STOPPED, MESSAGED_SKIPPED
|
||||||
|
if state.interrupted:
|
||||||
|
if not MESSAGED_STOPPED or msgforced:
|
||||||
|
logger.info("Stopped by User")
|
||||||
|
MESSAGED_STOPPED = True
|
||||||
|
return True
|
||||||
|
if state.skipped:
|
||||||
|
if not MESSAGED_SKIPPED or msgforced:
|
||||||
|
logger.info("Skipped by User")
|
||||||
|
MESSAGED_SKIPPED = True
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
FS_MODEL = None
|
FS_MODEL = None
|
||||||
CURRENT_FS_MODEL_PATH = None
|
CURRENT_FS_MODEL_PATH = None
|
||||||
|
|
||||||
@ -77,6 +103,10 @@ def getFaceSwapModel(model_path: str):
|
|||||||
|
|
||||||
def upscale_image(image: Image, upscale_options: UpscaleOptions):
|
def upscale_image(image: Image, upscale_options: UpscaleOptions):
|
||||||
result_image = image
|
result_image = image
|
||||||
|
|
||||||
|
if check_process_halt(msgforced=True):
|
||||||
|
return result_image
|
||||||
|
|
||||||
if upscale_options.do_restore_first:
|
if upscale_options.do_restore_first:
|
||||||
if upscale_options.face_restorer is not None:
|
if upscale_options.face_restorer is not None:
|
||||||
original_image = result_image.copy()
|
original_image = result_image.copy()
|
||||||
@ -193,6 +223,10 @@ def swap_face(
|
|||||||
gender_target: int = 0,
|
gender_target: int = 0,
|
||||||
):
|
):
|
||||||
result_image = target_img
|
result_image = target_img
|
||||||
|
|
||||||
|
if check_process_halt():
|
||||||
|
return result_image
|
||||||
|
|
||||||
if model is not None:
|
if model is not None:
|
||||||
|
|
||||||
if isinstance(source_img, str): # source_img is a base64 string
|
if isinstance(source_img, str): # source_img is a base64 string
|
||||||
@ -214,8 +248,9 @@ def swap_face(
|
|||||||
source_face, wrong_gender = get_face_single(source_img, face_index=source_faces_index[0], gender_source=gender_source)
|
source_face, wrong_gender = get_face_single(source_img, face_index=source_faces_index[0], gender_source=gender_source)
|
||||||
|
|
||||||
if len(source_faces_index) != 0 and len(source_faces_index) != 1 and len(source_faces_index) != len(faces_index):
|
if len(source_faces_index) != 0 and len(source_faces_index) != 1 and len(source_faces_index) != len(faces_index):
|
||||||
logger.info(f'Source Faces must have no entries (default=0), one entry, or same number of entries as target faces.')
|
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:
|
elif source_face is not None:
|
||||||
|
|
||||||
result = target_img
|
result = target_img
|
||||||
model_path = os.path.join(os.path.abspath(os.path.dirname(__file__)), model)
|
model_path = os.path.join(os.path.abspath(os.path.dirname(__file__)), model)
|
||||||
face_swapper = getFaceSwapModel(model_path)
|
face_swapper = getFaceSwapModel(model_path)
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
app_title = "ReActor"
|
app_title = "ReActor"
|
||||||
version_flag = "v0.3.1"
|
version_flag = "v0.3.2b"
|
||||||
|
|
||||||
from scripts.logger import logger, get_Run, set_Run
|
from scripts.logger import logger, get_Run, set_Run
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user