UPDATE: Image hashing -> Speed Boost
+VersionUP (0.4.3 beta4)
This commit is contained in:
parent
44811e02ed
commit
780357ee0c
@ -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"/>
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
<table>
|
<table>
|
||||||
<tr>
|
<tr>
|
||||||
|
|||||||
@ -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"/>
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
<table>
|
<table>
|
||||||
<tr>
|
<tr>
|
||||||
|
|||||||
@ -40,6 +40,8 @@ args=[
|
|||||||
0, #15 Gender Detection (Target) (0 - No, 1 - Female Only, 2 - Male Only)
|
0, #15 Gender Detection (Target) (0 - No, 1 - Female Only, 2 - Male Only)
|
||||||
False, #16 Save the original image(s) made before swapping
|
False, #16 Save the original image(s) made before swapping
|
||||||
0.8, #17 CodeFormer Weight (0 = maximum effect, 1 = minimum effect), 0.5 - by default
|
0.8, #17 CodeFormer Weight (0 = maximum effect, 1 = minimum effect), 0.5 - by default
|
||||||
|
False, #18 Source Image Hash Check, True - by default
|
||||||
|
False, #19 Target Image Hash Check, False - by default
|
||||||
]
|
]
|
||||||
|
|
||||||
# The args for ReActor can be found by
|
# The args for ReActor can be found by
|
||||||
|
|||||||
@ -117,4 +117,4 @@ def apply_logging_patch(console_logging_level):
|
|||||||
logger.setLevel(logging.STATUS)
|
logger.setLevel(logging.STATUS)
|
||||||
elif console_logging_level == 2:
|
elif console_logging_level == 2:
|
||||||
patch_insightface(*original_functions)
|
patch_insightface(*original_functions)
|
||||||
logger.setLevel(logging.STATUS)
|
logger.setLevel(logging.INFO)
|
||||||
|
|||||||
@ -153,6 +153,18 @@ class FaceSwapScript(scripts.Script):
|
|||||||
label="Console Log Level",
|
label="Console Log Level",
|
||||||
type="index",
|
type="index",
|
||||||
)
|
)
|
||||||
|
gr.Markdown("<br>")
|
||||||
|
with gr.Row():
|
||||||
|
source_hash_check = gr.Checkbox(
|
||||||
|
True,
|
||||||
|
label="Source Image Hash Check",
|
||||||
|
info="Recommended to keep it ON. Processing is faster when Source Image is the same."
|
||||||
|
)
|
||||||
|
target_hash_check = gr.Checkbox(
|
||||||
|
False,
|
||||||
|
label="Target Image Hash Check",
|
||||||
|
info="Affects if you use img2img with only 'Swap in source image' option."
|
||||||
|
)
|
||||||
|
|
||||||
return [
|
return [
|
||||||
img,
|
img,
|
||||||
@ -173,6 +185,8 @@ class FaceSwapScript(scripts.Script):
|
|||||||
gender_target,
|
gender_target,
|
||||||
save_original,
|
save_original,
|
||||||
codeformer_weight,
|
codeformer_weight,
|
||||||
|
source_hash_check,
|
||||||
|
target_hash_check,
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
@ -223,6 +237,8 @@ class FaceSwapScript(scripts.Script):
|
|||||||
gender_target,
|
gender_target,
|
||||||
save_original,
|
save_original,
|
||||||
codeformer_weight,
|
codeformer_weight,
|
||||||
|
source_hash_check,
|
||||||
|
target_hash_check,
|
||||||
):
|
):
|
||||||
self.enable = enable
|
self.enable = enable
|
||||||
if self.enable:
|
if self.enable:
|
||||||
@ -246,6 +262,8 @@ class FaceSwapScript(scripts.Script):
|
|||||||
self.gender_target = gender_target
|
self.gender_target = gender_target
|
||||||
self.save_original = save_original
|
self.save_original = save_original
|
||||||
self.codeformer_weight = codeformer_weight
|
self.codeformer_weight = codeformer_weight
|
||||||
|
self.source_hash_check = source_hash_check
|
||||||
|
self.target_hash_check = target_hash_check
|
||||||
if self.gender_source is None or self.gender_source == "No":
|
if self.gender_source is None or self.gender_source == "No":
|
||||||
self.gender_source = 0
|
self.gender_source = 0
|
||||||
if self.gender_target is None or self.gender_target == "No":
|
if self.gender_target is None or self.gender_target == "No":
|
||||||
@ -262,6 +280,10 @@ class FaceSwapScript(scripts.Script):
|
|||||||
self.faces_index = [0]
|
self.faces_index = [0]
|
||||||
if self.save_original is None:
|
if self.save_original is None:
|
||||||
self.save_original = False
|
self.save_original = False
|
||||||
|
if self.source_hash_check is None:
|
||||||
|
self.source_hash_check = True
|
||||||
|
if self.target_hash_check is None:
|
||||||
|
self.target_hash_check = False
|
||||||
|
|
||||||
if self.source is not None:
|
if self.source is not None:
|
||||||
apply_logging_patch(console_logging_level)
|
apply_logging_patch(console_logging_level)
|
||||||
@ -280,6 +302,8 @@ class FaceSwapScript(scripts.Script):
|
|||||||
enhancement_options=self.enhancement_options,
|
enhancement_options=self.enhancement_options,
|
||||||
gender_source=self.gender_source,
|
gender_source=self.gender_source,
|
||||||
gender_target=self.gender_target,
|
gender_target=self.gender_target,
|
||||||
|
source_hash_check=self.source_hash_check,
|
||||||
|
target_hash_check=self.target_hash_check,
|
||||||
)
|
)
|
||||||
p.init_images[i] = result
|
p.init_images[i] = result
|
||||||
# result_path = get_image_path(p.init_images[i], p.outpath_samples, "", p.all_seeds[i], p.all_prompts[i], "txt", p=p, suffix="-swapped")
|
# result_path = get_image_path(p.init_images[i], p.outpath_samples, "", p.all_seeds[i], p.all_prompts[i], "txt", p=p, suffix="-swapped")
|
||||||
@ -328,6 +352,8 @@ class FaceSwapScript(scripts.Script):
|
|||||||
enhancement_options=self.enhancement_options,
|
enhancement_options=self.enhancement_options,
|
||||||
gender_source=self.gender_source,
|
gender_source=self.gender_source,
|
||||||
gender_target=self.gender_target,
|
gender_target=self.gender_target,
|
||||||
|
source_hash_check=self.source_hash_check,
|
||||||
|
target_hash_check=self.target_hash_check,
|
||||||
)
|
)
|
||||||
if result is not None and swapped > 0:
|
if result is not None and swapped > 0:
|
||||||
result_images.append(result)
|
result_images.append(result)
|
||||||
@ -382,6 +408,8 @@ class FaceSwapScript(scripts.Script):
|
|||||||
enhancement_options=self.enhancement_options,
|
enhancement_options=self.enhancement_options,
|
||||||
gender_source=self.gender_source,
|
gender_source=self.gender_source,
|
||||||
gender_target=self.gender_target,
|
gender_target=self.gender_target,
|
||||||
|
source_hash_check=self.source_hash_check,
|
||||||
|
target_hash_check=self.target_hash_check,
|
||||||
)
|
)
|
||||||
try:
|
try:
|
||||||
pp = scripts_postprocessing.PostprocessedImage(result)
|
pp = scripts_postprocessing.PostprocessedImage(result)
|
||||||
|
|||||||
@ -4,6 +4,7 @@ from PIL import Image
|
|||||||
from math import isqrt, ceil
|
from math import isqrt, ceil
|
||||||
from typing import List
|
from typing import List
|
||||||
import logging
|
import logging
|
||||||
|
import hashlib
|
||||||
|
|
||||||
from modules.images import FilenameGenerator, get_next_sequence_number
|
from modules.images import FilenameGenerator, get_next_sequence_number
|
||||||
from modules import shared, script_callbacks
|
from modules import shared, script_callbacks
|
||||||
@ -117,3 +118,7 @@ def addLoggingLevel(levelName, levelNum, methodName=None):
|
|||||||
setattr(logging, levelName, levelNum)
|
setattr(logging, levelName, levelNum)
|
||||||
setattr(logging.getLoggerClass(), methodName, logForLevel)
|
setattr(logging.getLoggerClass(), methodName, logForLevel)
|
||||||
setattr(logging, methodName, logToRoot)
|
setattr(logging, methodName, logToRoot)
|
||||||
|
|
||||||
|
def get_image_md5hash(image: Image.Image):
|
||||||
|
md5hash = hashlib.md5(image.tobytes())
|
||||||
|
return md5hash.hexdigest()
|
||||||
|
|||||||
@ -42,8 +42,8 @@ if not logger.handlers:
|
|||||||
logger.addHandler(handler)
|
logger.addHandler(handler)
|
||||||
|
|
||||||
# Configure logger
|
# Configure logger
|
||||||
loglevel_string = getattr(shared.cmd_opts, "reactor_loglevel", "STATUS")
|
loglevel_string = getattr(shared.cmd_opts, "reactor_loglevel", "INFO")
|
||||||
loglevel = getattr(logging, loglevel_string.upper(), "status")
|
loglevel = getattr(logging, loglevel_string.upper(), "info")
|
||||||
logger.setLevel(loglevel)
|
logger.setLevel(loglevel)
|
||||||
|
|
||||||
def set_Run(value):
|
def set_Run(value):
|
||||||
|
|||||||
@ -9,6 +9,7 @@ from PIL import Image
|
|||||||
|
|
||||||
import insightface
|
import insightface
|
||||||
|
|
||||||
|
from scripts.reactor_helpers import get_image_md5hash
|
||||||
from modules.face_restoration import FaceRestoration
|
from modules.face_restoration import FaceRestoration
|
||||||
try: # A1111
|
try: # A1111
|
||||||
from modules import codeformer_model
|
from modules import codeformer_model
|
||||||
@ -74,6 +75,10 @@ CURRENT_FS_MODEL_PATH = None
|
|||||||
|
|
||||||
ANALYSIS_MODEL = None
|
ANALYSIS_MODEL = None
|
||||||
|
|
||||||
|
SOURCE_FACES = None
|
||||||
|
SOURCE_IMAGE_HASH = None
|
||||||
|
TARGET_FACES = None
|
||||||
|
TARGET_IMAGE_HASH = None
|
||||||
|
|
||||||
def getAnalysisModel():
|
def getAnalysisModel():
|
||||||
global ANALYSIS_MODEL
|
global ANALYSIS_MODEL
|
||||||
@ -271,7 +276,10 @@ def swap_face(
|
|||||||
enhancement_options: Union[EnhancementOptions, None] = None,
|
enhancement_options: Union[EnhancementOptions, None] = None,
|
||||||
gender_source: int = 0,
|
gender_source: int = 0,
|
||||||
gender_target: int = 0,
|
gender_target: int = 0,
|
||||||
|
source_hash_check: bool = True,
|
||||||
|
target_hash_check: bool = False,
|
||||||
):
|
):
|
||||||
|
global SOURCE_FACES, SOURCE_IMAGE_HASH, TARGET_FACES, TARGET_IMAGE_HASH
|
||||||
result_image = target_img
|
result_image = target_img
|
||||||
|
|
||||||
if check_process_halt():
|
if check_process_halt():
|
||||||
@ -299,11 +307,59 @@ def swap_face(
|
|||||||
output_info: str = ""
|
output_info: str = ""
|
||||||
swapped = 0
|
swapped = 0
|
||||||
|
|
||||||
|
if source_hash_check:
|
||||||
|
|
||||||
|
source_image_md5hash = get_image_md5hash(source_img)
|
||||||
|
|
||||||
|
if SOURCE_IMAGE_HASH is None:
|
||||||
|
SOURCE_IMAGE_HASH = source_image_md5hash
|
||||||
|
source_image_same = False
|
||||||
|
else:
|
||||||
|
source_image_same = True if SOURCE_IMAGE_HASH == source_image_md5hash else False
|
||||||
|
if not source_image_same:
|
||||||
|
SOURCE_IMAGE_HASH = source_image_md5hash
|
||||||
|
|
||||||
|
logger.info("Source Image MD5 Hash = %s", SOURCE_IMAGE_HASH)
|
||||||
|
logger.info("Source Image the Same? %s", source_image_same)
|
||||||
|
|
||||||
|
if SOURCE_FACES is None or not source_image_same:
|
||||||
|
logger.status("Analyzing Source Image...")
|
||||||
|
source_faces = analyze_faces(source_img)
|
||||||
|
SOURCE_FACES = source_faces
|
||||||
|
elif source_image_same:
|
||||||
|
logger.status("Using Ready Source Face(s) Model...")
|
||||||
|
source_faces = SOURCE_FACES
|
||||||
|
|
||||||
|
else:
|
||||||
logger.status("Analyzing Source Image...")
|
logger.status("Analyzing Source Image...")
|
||||||
source_faces = analyze_faces(source_img)
|
source_faces = analyze_faces(source_img)
|
||||||
|
|
||||||
if source_faces is not None:
|
if source_faces is not None:
|
||||||
|
|
||||||
|
if target_hash_check:
|
||||||
|
|
||||||
|
target_image_md5hash = get_image_md5hash(target_img)
|
||||||
|
|
||||||
|
if TARGET_IMAGE_HASH is None:
|
||||||
|
TARGET_IMAGE_HASH = target_image_md5hash
|
||||||
|
target_image_same = False
|
||||||
|
else:
|
||||||
|
target_image_same = True if TARGET_IMAGE_HASH == target_image_md5hash else False
|
||||||
|
if not target_image_same:
|
||||||
|
TARGET_IMAGE_HASH = target_image_md5hash
|
||||||
|
|
||||||
|
logger.info("Target Image MD5 Hash = %s", TARGET_IMAGE_HASH)
|
||||||
|
logger.info("Target Image the Same? %s", target_image_same)
|
||||||
|
|
||||||
|
if TARGET_FACES is None or not target_image_same:
|
||||||
|
logger.status("Analyzing Target Image...")
|
||||||
|
target_faces = analyze_faces(target_img)
|
||||||
|
TARGET_FACES = target_faces
|
||||||
|
elif target_image_same:
|
||||||
|
logger.status("Using Ready Target Face(s) Model...")
|
||||||
|
target_faces = TARGET_FACES
|
||||||
|
|
||||||
|
else:
|
||||||
logger.status("Analyzing Target Image...")
|
logger.status("Analyzing Target Image...")
|
||||||
target_faces = analyze_faces(target_img)
|
target_faces = analyze_faces(target_img)
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
app_title = "ReActor"
|
app_title = "ReActor"
|
||||||
version_flag = "v0.4.3-b3"
|
version_flag = "v0.4.3-b4"
|
||||||
|
|
||||||
from scripts.reactor_logger import logger, get_Run, set_Run
|
from scripts.reactor_logger import logger, get_Run, set_Run
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user