parent
c5ecf9a194
commit
c745fa2911
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
<img src="https://github.com/Gourieff/Assets/raw/main/sd-webui-reactor/ReActor_logo_NEW_EN.png?raw=true" alt="logo" width="180px"/>
|
<img src="https://github.com/Gourieff/Assets/raw/main/sd-webui-reactor/ReActor_logo_NEW_EN.png?raw=true" alt="logo" width="180px"/>
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
<a href="https://boosty.to/artgourieff" target="_blank">
|
<a href="https://boosty.to/artgourieff" target="_blank">
|
||||||
<img src="https://lovemet.ru/www/boosty.jpg" width="108" alt="Support Me on Boosty"/>
|
<img src="https://lovemet.ru/www/boosty.jpg" width="108" alt="Support Me on Boosty"/>
|
||||||
@ -40,6 +40,10 @@
|
|||||||
|
|
||||||
## What's new in the latest updates
|
## What's new in the latest updates
|
||||||
|
|
||||||
|
### 0.6.1 <sub><sup>BETA3
|
||||||
|
|
||||||
|
- 'Force Upscale' option inside the 'Upscale' tab: ReActor will run the Upscaler even if there's no face is detected (FR https://github.com/Gourieff/sd-webui-reactor/issues/116)
|
||||||
|
|
||||||
### 0.6.1 <sub><sup>BETA2
|
### 0.6.1 <sub><sup>BETA2
|
||||||
|
|
||||||
- 'Save original' option works fine now when you select 'Multiple Images' or 'Source Folder'
|
- 'Save original' option works fine now when you select 'Multiple Images' or 'Source Folder'
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
<img src="https://github.com/Gourieff/Assets/raw/main/sd-webui-reactor/ReActor_logo_NEW_RU.png?raw=true" alt="logo" width="180px"/>
|
<img src="https://github.com/Gourieff/Assets/raw/main/sd-webui-reactor/ReActor_logo_NEW_RU.png?raw=true" alt="logo" width="180px"/>
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
<a href="https://boosty.to/artgourieff" target="_blank">
|
<a href="https://boosty.to/artgourieff" target="_blank">
|
||||||
<img src="https://lovemet.ru/www/boosty.jpg" width="108" alt="Поддержать проект на Boosty"/>
|
<img src="https://lovemet.ru/www/boosty.jpg" width="108" alt="Поддержать проект на Boosty"/>
|
||||||
@ -39,6 +39,10 @@
|
|||||||
|
|
||||||
## Что нового в последних обновлениях
|
## Что нового в последних обновлениях
|
||||||
|
|
||||||
|
### 0.6.1 <sub><sup>BETA3
|
||||||
|
|
||||||
|
- Опция 'Force Upscale' внутри вкладки 'Upscale': апскейл выполнится, даже если не было обнаружено ни одного лица (FR https://github.com/Gourieff/sd-webui-reactor/issues/116)
|
||||||
|
|
||||||
### 0.6.1 <sub><sup>BETA2
|
### 0.6.1 <sub><sup>BETA2
|
||||||
|
|
||||||
- Опция 'Save original' теперь работает правильно, когда вы выбираете 'Multiple Images' или 'Source Folder'
|
- Опция 'Save original' теперь работает правильно, когда вы выбираете 'Multiple Images' или 'Source Folder'
|
||||||
|
|||||||
@ -49,6 +49,7 @@ args=[
|
|||||||
"C:\PATH_TO_FACES_IMAGES", #24 The path to the folder containing source faces images, don't forger to set #22 to 2
|
"C:\PATH_TO_FACES_IMAGES", #24 The path to the folder containing source faces images, don't forger to set #22 to 2
|
||||||
None, #25 skip it for API
|
None, #25 skip it for API
|
||||||
True, #26 Randomly select an image from the path
|
True, #26 Randomly select an image from the path
|
||||||
|
True, #27 Force Upscale even if no face found
|
||||||
]
|
]
|
||||||
|
|
||||||
# The args for ReActor can be found by
|
# The args for ReActor can be found by
|
||||||
|
|||||||
@ -24,5 +24,6 @@ curl -X POST \
|
|||||||
"select_source": 1,
|
"select_source": 1,
|
||||||
"face_model": "elena.safetensors",
|
"face_model": "elena.safetensors",
|
||||||
"source_folder": "C:/faces",
|
"source_folder": "C:/faces",
|
||||||
"random_image": 1
|
"random_image": 1,
|
||||||
|
"upscale_force": 1
|
||||||
}'
|
}'
|
||||||
|
|||||||
@ -20,5 +20,6 @@
|
|||||||
"select_source": 1,
|
"select_source": 1,
|
||||||
"face_model": "elena.safetensors",
|
"face_model": "elena.safetensors",
|
||||||
"source_folder": "C:/faces",
|
"source_folder": "C:/faces",
|
||||||
"random_image": 1
|
"random_image": 1,
|
||||||
|
"upscale_force": 1
|
||||||
}
|
}
|
||||||
@ -9,11 +9,19 @@ def update_upscalers_list(selected: str):
|
|||||||
# TAB UPSCALE
|
# TAB UPSCALE
|
||||||
def show(show_br: bool = True):
|
def show(show_br: bool = True):
|
||||||
with gr.Tab("Upscale"):
|
with gr.Tab("Upscale"):
|
||||||
restore_first = gr.Checkbox(
|
with gr.Row():
|
||||||
True,
|
restore_first = gr.Checkbox(
|
||||||
label="1. Restore Face -> 2. Upscale (-Uncheck- if you want vice versa)",
|
True,
|
||||||
info="Postprocessing Order"
|
label="1. Restore Face -> 2. Upscale (-Uncheck- if you want vice versa)",
|
||||||
)
|
info="Postprocessing Order",
|
||||||
|
scale=2
|
||||||
|
)
|
||||||
|
upscale_force = gr.Checkbox(
|
||||||
|
False,
|
||||||
|
label="Force Upscale",
|
||||||
|
info="Upscale anyway - even if no face found",
|
||||||
|
scale=1
|
||||||
|
)
|
||||||
with gr.Row():
|
with gr.Row():
|
||||||
upscaler_name = gr.Dropdown(
|
upscaler_name = gr.Dropdown(
|
||||||
choices=[upscaler.name for upscaler in shared.sd_upscalers],
|
choices=[upscaler.name for upscaler in shared.sd_upscalers],
|
||||||
@ -36,4 +44,4 @@ def show(show_br: bool = True):
|
|||||||
upscaler_visibility = gr.Slider(
|
upscaler_visibility = gr.Slider(
|
||||||
0, 1, 1, step=0.1, label="Upscaler Visibility (if scale = 1)"
|
0, 1, 1, step=0.1, label="Upscaler Visibility (if scale = 1)"
|
||||||
)
|
)
|
||||||
return restore_first, upscaler_name, upscaler_scale, upscaler_visibility
|
return restore_first, upscaler_name, upscaler_scale, upscaler_visibility, upscale_force
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
'''
|
'''
|
||||||
Thanks SpenserCai for the original version of the roop api script
|
Thanks SpenserCai for the original version of the roop api script
|
||||||
-----------------------------------
|
-----------------------------------
|
||||||
--- ReActor External API v1.0.3 ---
|
--- ReActor External API v1.0.4 ---
|
||||||
-----------------------------------
|
-----------------------------------
|
||||||
'''
|
'''
|
||||||
import os, glob
|
import os, glob
|
||||||
@ -76,7 +76,8 @@ def reactor_api(_: gr.Blocks, app: FastAPI):
|
|||||||
select_source: int = Body(0,title="Select Source, 0 - Image, 1 - Face Model, 2 - Source Folder"),
|
select_source: int = Body(0,title="Select Source, 0 - Image, 1 - Face Model, 2 - Source Folder"),
|
||||||
face_model: str = Body("None",title="Filename of the face model (from 'models/reactor/faces'), e.g. elena.safetensors"),
|
face_model: str = Body("None",title="Filename of the face model (from 'models/reactor/faces'), e.g. elena.safetensors"),
|
||||||
source_folder: str = Body("",title="The path to the folder containing source faces images"),
|
source_folder: str = Body("",title="The path to the folder containing source faces images"),
|
||||||
random_image: int = Body(0,title="Randomly select an image from the path")
|
random_image: int = Body(0,title="Randomly select an image from the path"),
|
||||||
|
upscale_force: int = Body(0,title="Force Upscale even if no face found")
|
||||||
):
|
):
|
||||||
s_image = api.decode_base64_to_image(source_image) if select_source == 0 else None
|
s_image = api.decode_base64_to_image(source_image) if select_source == 0 else None
|
||||||
t_image = api.decode_base64_to_image(target_image)
|
t_image = api.decode_base64_to_image(target_image)
|
||||||
@ -87,7 +88,8 @@ def reactor_api(_: gr.Blocks, app: FastAPI):
|
|||||||
restore_first_bool = True if restore_first == 1 else False
|
restore_first_bool = True if restore_first == 1 else False
|
||||||
mask_face = True if mask_face == 1 else False
|
mask_face = True if mask_face == 1 else False
|
||||||
random_image = False if random_image == 0 else True
|
random_image = False if random_image == 0 else True
|
||||||
up_options = EnhancementOptions(do_restore_first=restore_first_bool, scale=scale, upscaler=get_upscaler(upscaler), upscale_visibility=upscale_visibility,face_restorer=get_face_restorer(face_restorer),restorer_visibility=restorer_visibility,codeformer_weight=codeformer_weight)
|
upscale_force = False if upscale_force == 0 else True
|
||||||
|
up_options = EnhancementOptions(do_restore_first=restore_first_bool, scale=scale, upscaler=get_upscaler(upscaler), upscale_visibility=upscale_visibility,face_restorer=get_face_restorer(face_restorer),restorer_visibility=restorer_visibility,codeformer_weight=codeformer_weight,upscale_force=upscale_force)
|
||||||
use_model = get_full_model(model)
|
use_model = get_full_model(model)
|
||||||
if use_model is None:
|
if use_model is None:
|
||||||
Exception("Model not found")
|
Exception("Model not found")
|
||||||
|
|||||||
@ -66,7 +66,7 @@ class FaceSwapScript(scripts.Script):
|
|||||||
img, imgs, select_source, face_model, source_folder, save_original, mask_face, source_faces_index, gender_source, faces_index, gender_target, face_restorer_name, face_restorer_visibility, codeformer_weight, swap_in_source, swap_in_generated, random_image = ui_main.show(is_img2img=is_img2img, **msgs)
|
img, imgs, select_source, face_model, source_folder, save_original, mask_face, source_faces_index, gender_source, faces_index, gender_target, face_restorer_name, face_restorer_visibility, codeformer_weight, swap_in_source, swap_in_generated, random_image = ui_main.show(is_img2img=is_img2img, **msgs)
|
||||||
|
|
||||||
# TAB UPSCALE
|
# TAB UPSCALE
|
||||||
restore_first, upscaler_name, upscaler_scale, upscaler_visibility = ui_upscale.show()
|
restore_first, upscaler_name, upscaler_scale, upscaler_visibility, upscale_force = ui_upscale.show()
|
||||||
|
|
||||||
# TAB TOOLS
|
# TAB TOOLS
|
||||||
ui_tools.show()
|
ui_tools.show()
|
||||||
@ -104,6 +104,7 @@ class FaceSwapScript(scripts.Script):
|
|||||||
source_folder,
|
source_folder,
|
||||||
imgs,
|
imgs,
|
||||||
random_image,
|
random_image,
|
||||||
|
upscale_force
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
@ -124,13 +125,14 @@ class FaceSwapScript(scripts.Script):
|
|||||||
@property
|
@property
|
||||||
def enhancement_options(self) -> EnhancementOptions:
|
def enhancement_options(self) -> EnhancementOptions:
|
||||||
return EnhancementOptions(
|
return EnhancementOptions(
|
||||||
do_restore_first = self.restore_first,
|
do_restore_first=self.restore_first,
|
||||||
scale=self.upscaler_scale,
|
scale=self.upscaler_scale,
|
||||||
upscaler=self.upscaler,
|
upscaler=self.upscaler,
|
||||||
face_restorer=self.face_restorer,
|
face_restorer=self.face_restorer,
|
||||||
upscale_visibility=self.upscaler_visibility,
|
upscale_visibility=self.upscaler_visibility,
|
||||||
restorer_visibility=self.face_restorer_visibility,
|
restorer_visibility=self.face_restorer_visibility,
|
||||||
codeformer_weight=self.codeformer_weight,
|
codeformer_weight=self.codeformer_weight,
|
||||||
|
upscale_force=self.upscale_force
|
||||||
)
|
)
|
||||||
|
|
||||||
def process(
|
def process(
|
||||||
@ -163,6 +165,7 @@ class FaceSwapScript(scripts.Script):
|
|||||||
source_folder,
|
source_folder,
|
||||||
imgs,
|
imgs,
|
||||||
random_image,
|
random_image,
|
||||||
|
upscale_force,
|
||||||
):
|
):
|
||||||
self.enable = enable
|
self.enable = enable
|
||||||
if self.enable:
|
if self.enable:
|
||||||
@ -198,6 +201,7 @@ class FaceSwapScript(scripts.Script):
|
|||||||
self.source_folder = source_folder
|
self.source_folder = source_folder
|
||||||
self.source_imgs = imgs
|
self.source_imgs = imgs
|
||||||
self.random_image = random_image
|
self.random_image = random_image
|
||||||
|
self.upscale_force = upscale_force
|
||||||
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":
|
||||||
@ -222,6 +226,8 @@ class FaceSwapScript(scripts.Script):
|
|||||||
self.mask_face = False
|
self.mask_face = False
|
||||||
if self.random_image is None:
|
if self.random_image is None:
|
||||||
self.random_image = False
|
self.random_image = False
|
||||||
|
if self.upscale_force is None:
|
||||||
|
self.upscale_force = False
|
||||||
|
|
||||||
logger.debug("*** Set Device")
|
logger.debug("*** Set Device")
|
||||||
set_Device(self.device)
|
set_Device(self.device)
|
||||||
@ -444,7 +450,7 @@ class FaceSwapScriptExtras(scripts_postprocessing.ScriptPostprocessing):
|
|||||||
img, imgs, select_source, face_model, source_folder, save_original, mask_face, source_faces_index, gender_source, faces_index, gender_target, face_restorer_name, face_restorer_visibility, codeformer_weight, swap_in_source, swap_in_generated, random_image = ui_main.show(is_img2img=False, show_br=False, **msgs)
|
img, imgs, select_source, face_model, source_folder, save_original, mask_face, source_faces_index, gender_source, faces_index, gender_target, face_restorer_name, face_restorer_visibility, codeformer_weight, swap_in_source, swap_in_generated, random_image = ui_main.show(is_img2img=False, show_br=False, **msgs)
|
||||||
|
|
||||||
# TAB UPSCALE
|
# TAB UPSCALE
|
||||||
restore_first, upscaler_name, upscaler_scale, upscaler_visibility = ui_upscale.show(show_br=False)
|
restore_first, upscaler_name, upscaler_scale, upscaler_visibility, upscale_force = ui_upscale.show(show_br=False)
|
||||||
|
|
||||||
# TAB TOOLS
|
# TAB TOOLS
|
||||||
ui_tools.show()
|
ui_tools.show()
|
||||||
@ -477,6 +483,7 @@ class FaceSwapScriptExtras(scripts_postprocessing.ScriptPostprocessing):
|
|||||||
'source_folder': source_folder,
|
'source_folder': source_folder,
|
||||||
'imgs': imgs,
|
'imgs': imgs,
|
||||||
'random_image': random_image,
|
'random_image': random_image,
|
||||||
|
'upscale_force': upscale_force,
|
||||||
}
|
}
|
||||||
return args
|
return args
|
||||||
|
|
||||||
@ -504,6 +511,7 @@ class FaceSwapScriptExtras(scripts_postprocessing.ScriptPostprocessing):
|
|||||||
upscale_visibility=self.upscaler_visibility,
|
upscale_visibility=self.upscaler_visibility,
|
||||||
restorer_visibility=self.face_restorer_visibility,
|
restorer_visibility=self.face_restorer_visibility,
|
||||||
codeformer_weight=self.codeformer_weight,
|
codeformer_weight=self.codeformer_weight,
|
||||||
|
upscale_force=self.upscale_force,
|
||||||
)
|
)
|
||||||
|
|
||||||
def process(self, pp: scripts_postprocessing.PostprocessedImage, **args):
|
def process(self, pp: scripts_postprocessing.PostprocessedImage, **args):
|
||||||
@ -532,6 +540,7 @@ class FaceSwapScriptExtras(scripts_postprocessing.ScriptPostprocessing):
|
|||||||
self.source_folder = args['source_folder']
|
self.source_folder = args['source_folder']
|
||||||
self.source_imgs = args['imgs']
|
self.source_imgs = args['imgs']
|
||||||
self.random_image = args['random_image']
|
self.random_image = args['random_image']
|
||||||
|
self.upscale_force = args['upscale_force']
|
||||||
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":
|
||||||
@ -550,6 +559,8 @@ class FaceSwapScriptExtras(scripts_postprocessing.ScriptPostprocessing):
|
|||||||
self.mask_face = False
|
self.mask_face = False
|
||||||
if self.random_image is None:
|
if self.random_image is None:
|
||||||
self.random_image = False
|
self.random_image = False
|
||||||
|
if self.upscale_force is None:
|
||||||
|
self.upscale_force = False
|
||||||
|
|
||||||
current_job_number = shared.state.job_no + 1
|
current_job_number = shared.state.job_no + 1
|
||||||
job_count = shared.state.job_count
|
job_count = shared.state.job_count
|
||||||
|
|||||||
@ -64,6 +64,7 @@ class EnhancementOptions:
|
|||||||
face_restorer: FaceRestoration = None
|
face_restorer: FaceRestoration = None
|
||||||
restorer_visibility: float = 0.5
|
restorer_visibility: float = 0.5
|
||||||
codeformer_weight: float = 0.5
|
codeformer_weight: float = 0.5
|
||||||
|
upscale_force: bool = False
|
||||||
|
|
||||||
|
|
||||||
MESSAGED_STOPPED = False
|
MESSAGED_STOPPED = False
|
||||||
@ -713,7 +714,7 @@ def operate(
|
|||||||
|
|
||||||
result_image = Image.fromarray(cv2.cvtColor(result, cv2.COLOR_BGR2RGB))
|
result_image = Image.fromarray(cv2.cvtColor(result, cv2.COLOR_BGR2RGB))
|
||||||
|
|
||||||
if enhancement_options is not None and swapped > 0:
|
if (enhancement_options is not None and swapped > 0) or enhancement_options.upscale_force:
|
||||||
if mask_face and entire_mask_image is not None:
|
if mask_face and entire_mask_image is not None:
|
||||||
result_image = enhance_image_and_mask(result_image, enhancement_options,Image.fromarray(target_img_orig),Image.fromarray(entire_mask_image).convert("L"))
|
result_image = enhance_image_and_mask(result_image, enhancement_options,Image.fromarray(target_img_orig),Image.fromarray(entire_mask_image).convert("L"))
|
||||||
else:
|
else:
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
app_title = "ReActor"
|
app_title = "ReActor"
|
||||||
version_flag = "v0.6.1-b2"
|
version_flag = "v0.6.1-b3"
|
||||||
|
|
||||||
from scripts.reactor_logger import logger, get_Run, set_Run
|
from scripts.reactor_logger import logger, get_Run, set_Run
|
||||||
from scripts.reactor_globals import DEVICE
|
from scripts.reactor_globals import DEVICE
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user