Compare commits
11 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| a6ccd6fd40 | |||
| b11037173b | |||
| abdcf4a494 | |||
| 6ba60f6332 | |||
| 6d69f69509 | |||
| 32eeed8bd7 | |||
| 7830eb1da9 | |||
| d1a82d520d | |||
| aba00ba381 | |||
| 272dca83b8 | |||
| 04a0a5c46c |
@@ -1,8 +1,4 @@
|
||||
repos:
|
||||
- repo: https://github.com/psf/black
|
||||
rev: 23.7.0
|
||||
hooks:
|
||||
- id: black
|
||||
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||||
rev: v4.4.0
|
||||
hooks:
|
||||
@@ -10,4 +6,8 @@ repos:
|
||||
- id: check-case-conflict
|
||||
- id: check-docstring-first
|
||||
- id: detect-private-key
|
||||
- id: fix-byte-order-marker
|
||||
- id: fix-byte-order-marker
|
||||
- repo: https://github.com/psf/black
|
||||
rev: 23.7.0
|
||||
hooks:
|
||||
- id: black
|
||||
@@ -1,3 +1,19 @@
|
||||
# 1.2.3
|
||||
|
||||
Speed up ui : change the way default settings are manage by not storing them in ui-config.json
|
||||
|
||||
Migration : YOU NEED TO recreate ui-config.json (delete) or at least remove any faceswaplab reference to be able to use default settings again.
|
||||
|
||||
See this for explainations : https://github.com/AUTOMATIC1111/stable-diffusion-webui/issues/6109
|
||||
|
||||
# 1.2.2
|
||||
|
||||
+ Add NSFW filter option in settings (1 == disable)
|
||||
+ Improve install speed
|
||||
+ Install gpu requirements by default if --use-cpu is not used
|
||||
+ Fix improved mask + color correction
|
||||
+ Remove javascript, use https://github.com/w-e-w/sdwebui-close-confirmation-dialogue.git instead to prevent gradio from closing.
|
||||
|
||||
# 1.2.1 :
|
||||
|
||||
Add GPU support option : see https://github.com/glucauze/sd-webui-faceswaplab/pull/24
|
||||
|
||||
@@ -1,6 +1,12 @@
|
||||
# FaceSwapLab for a1111/Vlad
|
||||
|
||||
Please read the documentation here : https://glucauze.github.io/sd-webui-faceswaplab/
|
||||
V1.2.3 : Breaking change for settings, please read changelog.
|
||||
|
||||
Please read the documentation here : https://glucauze.github.io/sd-webui-faceswaplab/
|
||||
|
||||
You can also read the [doc discussion section](https://github.com/glucauze/sd-webui-faceswaplab/discussions/categories/guide-doc)
|
||||
|
||||
See [CHANGELOG.md](CHANGELOG.md) for changes in last versions.
|
||||
|
||||
FaceSwapLab is an extension for Stable Diffusion that simplifies face-swapping. It has evolved from sd-webui-faceswap and some part of sd-webui-roop. However, a substantial amount of the code has been rewritten to improve performance and to better manage masks.
|
||||
|
||||
|
||||
@@ -5,6 +5,8 @@ permalink: /doc/
|
||||
toc: true
|
||||
---
|
||||
|
||||
You can also read the [doc discussion section](https://github.com/glucauze/sd-webui-faceswaplab/discussions/categories/guide-doc)
|
||||
|
||||
## TLDR: I Just Want Good Results:
|
||||
|
||||
1. Put a face in the reference.
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
window.onbeforeunload = function() {
|
||||
// Prevent the stable diffusion window from being closed by mistake
|
||||
return "Are you sure ?";
|
||||
};
|
||||
@@ -20,7 +20,7 @@ def check_configuration() -> None:
|
||||
models_dir = MODELS_DIR
|
||||
faces_dir = FACES_DIR
|
||||
|
||||
model_url = "https://huggingface.co/henryruhs/roop/resolve/main/inswapper_128.onnx"
|
||||
model_url = "https://github.com/facefusion/facefusion-assets/releases/download/models/inswapper_128.onnx"
|
||||
model_name = os.path.basename(model_url)
|
||||
model_path = os.path.join(models_dir, model_name)
|
||||
|
||||
|
||||
@@ -109,7 +109,13 @@ class FaceSwapScript(scripts.Script):
|
||||
components += faceswaplab_unit_ui.faceswap_unit_ui(is_img2img, i)
|
||||
post_processing = faceswaplab_tab.postprocessing_ui()
|
||||
# If the order is modified, the before_process should be changed accordingly.
|
||||
return components + post_processing
|
||||
|
||||
components = components + post_processing
|
||||
# Ask sd to not store in ui-config.json
|
||||
for component in components:
|
||||
setattr(component, "do_not_save_to_config", True)
|
||||
|
||||
return components
|
||||
|
||||
def read_config(
|
||||
self, p: StableDiffusionProcessing, *components: Tuple[Any, ...]
|
||||
|
||||
@@ -16,7 +16,7 @@ REFERENCE_PATH = os.path.join(
|
||||
)
|
||||
|
||||
# Defining the version flag for the application
|
||||
VERSION_FLAG: str = "v1.2.2"
|
||||
VERSION_FLAG: str = "v1.2.3"
|
||||
# Defining the path for 'sd-webui-faceswaplab' inside the 'extensions' directory
|
||||
EXTENSION_PATH = os.path.join("extensions", "sd-webui-faceswaplab")
|
||||
|
||||
|
||||
@@ -216,18 +216,11 @@ class UpscaledINSwapper(INSwapper):
|
||||
bgr_fake, inswapper_options=options, k=k
|
||||
)
|
||||
|
||||
if options.improved_mask:
|
||||
if k == 1:
|
||||
logger.warning(
|
||||
"Please note that improved mask does not work well without upscaling. Set upscaling to Lanczos at least if you want speed and want to use improved mask."
|
||||
)
|
||||
fake_diff: CV2ImgU8 = None # type: ignore
|
||||
|
||||
logger.info("improved_mask")
|
||||
mask = get_face_mask(aimg, bgr_fake)
|
||||
bgr_fake = merge_images_with_mask(aimg, bgr_fake, mask)
|
||||
|
||||
# compute fake_diff before sharpen and color correction (better result)
|
||||
fake_diff = compute_diff(bgr_fake, aimg)
|
||||
if not options.improved_mask:
|
||||
# If improved mask is not used, we should compute before sharpen and color correction (better diff)
|
||||
fake_diff = compute_diff(bgr_fake, aimg=aimg)
|
||||
|
||||
if options.sharpen:
|
||||
logger.info("sharpen")
|
||||
@@ -244,6 +237,24 @@ class UpscaledINSwapper(INSwapper):
|
||||
)
|
||||
bgr_fake = pil_to_cv2(bgr_fake_pil)
|
||||
|
||||
if options.improved_mask:
|
||||
if k == 1:
|
||||
logger.warning(
|
||||
"Please note that improved mask does not work well without upscaling. Set upscaling to Lanczos at least if you want speed and want to use improved mask."
|
||||
)
|
||||
|
||||
logger.info("improved_mask")
|
||||
mask = get_face_mask(aimg, bgr_fake)
|
||||
# save_img_debug(cv2_to_pil(bgr_fake), "Before Mask")
|
||||
bgr_fake = merge_images_with_mask(aimg, bgr_fake, mask)
|
||||
# save_img_debug(cv2_to_pil(bgr_fake), "After Mask")
|
||||
|
||||
fake_diff = compute_diff(bgr_fake, aimg=aimg)
|
||||
|
||||
assert (
|
||||
fake_diff is not None
|
||||
), "fake diff is None, this should not happen"
|
||||
|
||||
logger.info("*" * 80)
|
||||
|
||||
else:
|
||||
@@ -266,6 +277,7 @@ class UpscaledINSwapper(INSwapper):
|
||||
(target_img.shape[1], target_img.shape[0]),
|
||||
borderValue=0.0,
|
||||
)
|
||||
|
||||
fake_diff = cv2.warpAffine(
|
||||
fake_diff,
|
||||
IM,
|
||||
|
||||
@@ -15,18 +15,19 @@ def postprocessing_ui() -> List[gr.components.Component]:
|
||||
face_restorer_name = gr.Radio(
|
||||
label="Restore Face",
|
||||
choices=["None"] + [x.name() for x in shared.face_restorers],
|
||||
value=lambda: get_sd_option(
|
||||
value=get_sd_option(
|
||||
"faceswaplab_pp_default_face_restorer",
|
||||
shared.face_restorers[0].name(),
|
||||
),
|
||||
type="value",
|
||||
elem_id="faceswaplab_pp_face_restorer",
|
||||
)
|
||||
|
||||
with gr.Column():
|
||||
face_restorer_visibility = gr.Slider(
|
||||
0,
|
||||
1,
|
||||
value=lambda: get_sd_option(
|
||||
value=get_sd_option(
|
||||
"faceswaplab_pp_default_face_restorer_visibility", 1
|
||||
),
|
||||
step=0.001,
|
||||
@@ -36,7 +37,7 @@ def postprocessing_ui() -> List[gr.components.Component]:
|
||||
codeformer_weight = gr.Slider(
|
||||
0,
|
||||
1,
|
||||
value=lambda: get_sd_option(
|
||||
value=get_sd_option(
|
||||
"faceswaplab_pp_default_face_restorer_weight", 1
|
||||
),
|
||||
step=0.001,
|
||||
@@ -45,7 +46,7 @@ def postprocessing_ui() -> List[gr.components.Component]:
|
||||
)
|
||||
upscaler_name = gr.Dropdown(
|
||||
choices=[upscaler.name for upscaler in shared.sd_upscalers],
|
||||
value=lambda: get_sd_option("faceswaplab_pp_default_upscaler", "None"),
|
||||
value=get_sd_option("faceswaplab_pp_default_upscaler", "None"),
|
||||
label="Upscaler",
|
||||
elem_id="faceswaplab_pp_upscaler",
|
||||
)
|
||||
@@ -60,9 +61,7 @@ def postprocessing_ui() -> List[gr.components.Component]:
|
||||
upscaler_visibility = gr.Slider(
|
||||
0,
|
||||
1,
|
||||
value=lambda: get_sd_option(
|
||||
"faceswaplab_pp_default_upscaler_visibility", 1
|
||||
),
|
||||
value=get_sd_option("faceswaplab_pp_default_upscaler_visibility", 1),
|
||||
step=0.1,
|
||||
label="Upscaler visibility (if scale = 1)",
|
||||
elem_id="faceswaplab_pp_upscaler_visibility",
|
||||
@@ -123,7 +122,7 @@ def postprocessing_ui() -> List[gr.components.Component]:
|
||||
label="sd model (experimental)",
|
||||
elem_id="faceswaplab_pp_inpainting_sd_model",
|
||||
)
|
||||
return [
|
||||
components = [
|
||||
face_restorer_name,
|
||||
face_restorer_visibility,
|
||||
codeformer_weight,
|
||||
@@ -138,3 +137,8 @@ def postprocessing_ui() -> List[gr.components.Component]:
|
||||
inpainting_sampler,
|
||||
inpaiting_model,
|
||||
]
|
||||
|
||||
# Ask sd to not store in ui-config.json
|
||||
for component in components:
|
||||
setattr(component, "do_not_save_to_config", True)
|
||||
return components
|
||||
|
||||
@@ -17,7 +17,7 @@ def faceswap_unit_advanced_options(
|
||||
face_restorer_name = gr.Radio(
|
||||
label="Restore Face",
|
||||
choices=["None"] + [x.name() for x in shared.face_restorers],
|
||||
value=lambda: get_sd_option(
|
||||
value=get_sd_option(
|
||||
"faceswaplab_default_upscaled_swapper_face_restorer",
|
||||
"None",
|
||||
),
|
||||
@@ -28,7 +28,7 @@ def faceswap_unit_advanced_options(
|
||||
face_restorer_visibility = gr.Slider(
|
||||
0,
|
||||
1,
|
||||
value=lambda: get_sd_option(
|
||||
value=get_sd_option(
|
||||
"faceswaplab_default_upscaled_swapper_face_restorer_visibility",
|
||||
1.0,
|
||||
),
|
||||
@@ -39,7 +39,7 @@ def faceswap_unit_advanced_options(
|
||||
codeformer_weight = gr.Slider(
|
||||
0,
|
||||
1,
|
||||
value=lambda: get_sd_option(
|
||||
value=get_sd_option(
|
||||
"faceswaplab_default_upscaled_swapper_face_restorer_weight", 1.0
|
||||
),
|
||||
step=0.001,
|
||||
@@ -48,33 +48,25 @@ def faceswap_unit_advanced_options(
|
||||
)
|
||||
upscaler_name = gr.Dropdown(
|
||||
choices=[upscaler.name for upscaler in shared.sd_upscalers],
|
||||
value=lambda: get_sd_option(
|
||||
"faceswaplab_default_upscaled_swapper_upscaler", ""
|
||||
),
|
||||
value=get_sd_option("faceswaplab_default_upscaled_swapper_upscaler", ""),
|
||||
label="Upscaler",
|
||||
elem_id=f"{id_prefix}_face{unit_num}_upscaler",
|
||||
)
|
||||
|
||||
improved_mask = gr.Checkbox(
|
||||
lambda: get_sd_option(
|
||||
"faceswaplab_default_upscaled_swapper_improved_mask", False
|
||||
),
|
||||
get_sd_option("faceswaplab_default_upscaled_swapper_improved_mask", False),
|
||||
interactive=True,
|
||||
label="Use improved segmented mask (use pastenet to mask only the face)",
|
||||
elem_id=f"{id_prefix}_face{unit_num}_improved_mask",
|
||||
)
|
||||
color_corrections = gr.Checkbox(
|
||||
lambda: get_sd_option(
|
||||
"faceswaplab_default_upscaled_swapper_fixcolor", False
|
||||
),
|
||||
get_sd_option("faceswaplab_default_upscaled_swapper_fixcolor", False),
|
||||
interactive=True,
|
||||
label="Use color corrections",
|
||||
elem_id=f"{id_prefix}_face{unit_num}_color_corrections",
|
||||
)
|
||||
sharpen_face = gr.Checkbox(
|
||||
lambda: get_sd_option(
|
||||
"faceswaplab_default_upscaled_swapper_sharpen", False
|
||||
),
|
||||
get_sd_option("faceswaplab_default_upscaled_swapper_sharpen", False),
|
||||
interactive=True,
|
||||
label="sharpen face",
|
||||
elem_id=f"{id_prefix}_face{unit_num}_sharpen_face",
|
||||
@@ -82,7 +74,7 @@ def faceswap_unit_advanced_options(
|
||||
erosion_factor = gr.Slider(
|
||||
0.0,
|
||||
10.0,
|
||||
lambda: get_sd_option("faceswaplab_default_upscaled_swapper_erosion", 1.0),
|
||||
get_sd_option("faceswaplab_default_upscaled_swapper_erosion", 1.0),
|
||||
step=0.01,
|
||||
label="Upscaled swapper mask erosion factor, 1 = default behaviour.",
|
||||
elem_id=f"{id_prefix}_face{unit_num}_erosion_factor",
|
||||
@@ -137,7 +129,7 @@ def faceswap_unit_ui(
|
||||
elem_id=f"{id_prefix}_face{unit_num}_refresh_checkpoints",
|
||||
)
|
||||
|
||||
def refresh_fn(selected: str) -> None:
|
||||
def refresh_fn(selected: str):
|
||||
return gr.Dropdown.update(
|
||||
value=selected, choices=get_face_checkpoints()
|
||||
)
|
||||
@@ -289,6 +281,10 @@ Otherwise, read the [doc](https://glucauze.github.io/sd-webui-faceswaplab/doc/)
|
||||
+ post_inpainting
|
||||
)
|
||||
|
||||
# Ask sd to not store in ui-config.json
|
||||
for component in gradio_components:
|
||||
setattr(component, "do_not_save_to_config", True)
|
||||
|
||||
# If changed, you need to change FaceSwapUnitSettings accordingly
|
||||
# ORDER of parameters is IMPORTANT. It should match the result of FaceSwapUnitSettings
|
||||
return gradio_components
|
||||
|
||||
@@ -5,7 +5,6 @@ import cv2
|
||||
import numpy as np
|
||||
from math import isqrt, ceil
|
||||
import torch
|
||||
from ifnude import detect
|
||||
from modules import processing
|
||||
import base64
|
||||
from collections import Counter
|
||||
@@ -31,6 +30,8 @@ def check_against_nsfw(img: PILImage) -> bool:
|
||||
if NSFW_SCORE_THRESHOLD >= 1:
|
||||
return False
|
||||
|
||||
from ifnude import detect
|
||||
|
||||
shapes: List[bool] = []
|
||||
chunks: List[Dict[str, Union[int, float]]] = detect(img)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user