From 38f46d3f019d43a45044cabb43a96a2c7a68430c Mon Sep 17 00:00:00 2001 From: Tran Xen <137925069+glucauze@users.noreply.github.com> Date: Thu, 24 Aug 2023 23:56:03 +0200 Subject: [PATCH] add seed selection --- CHANGELOG.md | 10 ++ client_api/api_utils.py | 1 + client_api/test.safetensors | Bin 2256 -> 2256 bytes scripts/faceswaplab_globals.py | 2 +- .../faceswaplab_inpainting.py | 2 + scripts/faceswaplab_inpainting/i2i_pp.py | 1 + .../faceswaplab_inpainting_ui.py | 119 +++++++++--------- .../faceswaplab_postprocessing_ui.py | 60 +-------- scripts/faceswaplab_ui/faceswaplab_unit_ui.py | 20 +-- 9 files changed, 92 insertions(+), 123 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4e65354..9b9f919 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,13 @@ +# 1.2.5 + +Allow seed selection in inpainting. + +# 1.2.4 + +Fix default settings by marking only managed field as do_not_save. + +See the discussion here : https://github.com/glucauze/sd-webui-faceswaplab/issues/62 + # 1.2.3 Speed up ui : change the way default settings are manage by not storing them in ui-config.json diff --git a/client_api/api_utils.py b/client_api/api_utils.py index 4847acd..d699469 100644 --- a/client_api/api_utils.py +++ b/client_api/api_utils.py @@ -48,6 +48,7 @@ class InpaintingOptions(BaseModel): inpainting_model: str = Field( description="Inpainting model", examples=["Current"], default="Current" ) + inpainting_seed: int = Field(description="Inpainting Seed", ge=-1, default=-1) class InswappperOptions(BaseModel): diff --git a/client_api/test.safetensors b/client_api/test.safetensors index a24d1b6a2fe97011273f695d28bf97b6b864875c..ebdf37a9c745cfc8a7fd606e571f8de8dc405c13 100644 GIT binary patch delta 2071 zcmV~$2_Th;764#v+>q@RB^42}-XtXdIigo+83}1I?b{^96jHe|wuB<3MV3~Ch)Lu> zM>TXOlBL(Gg@;U|v?wZ5^L>q)jhcrWWqzG*V0Zf^Ja6{^n-pzm{mBZeZ4N_ENjx?^ ziNSPtCDw0E;?x&?f|ZITuMa*Xd^hwH+BBmuLTNU7uF=Lf&_oS$-@tM2*__>I;MCg* zc>h8_Y`K0Ey32J~+WEuDq0JsY7N^18`LD!1DzS8CK10BrqcR$vX2gGY#iGZ()6`-- ziE|?}$iaRd9zU!s#;BA+!8~ueqU?zADVs@U>rngwheOi((y*z5Q?y`b6Wl(1Y0K82`cXc!24!5 zBwfki9^u}cCsCAOPl5>k+pFP zOShlI2aete@pcUy73XnwkrZ(3QiMyeig^j^n=@j$pQhQB`x`Dpd7%2E#4s=#{R}t)&g1QccE-oC{7BSP#t#Sov`D{0nkV?7H2h;3eDOcC5nCD^{b zi?)7OrQk|+Jl1i9k_RnO^|PE5$G;@cVb(a*+lZ&%ABDpl&fs-}7Wis11~Uz68Ek*$ z5Tjl=`)f2G^Q)z8|Ag=%*^wsFlbgb%)I>N^6bIoA=2-sKOc>a+j(+QKL*0>IAm4T} zshX@qmlf7jB6r{&YKG|h>>0l*%V3+i8a$wrh!K~^;v$RvSUp;Ye+j%H+_T?|=MpP~ zL)glK8&dFTK7R{;9KSG)JJesMpKB!COm#yv3lnrYtcK?2ij+u;!Cro zxVd+t(|=YV-jG_t-unvGZpGL6)9K5g91#H5JEy`bt)cuQFA|(x6X@Z!7I^I6fGv)4 zv`dp6Vfo369DhZhbJAYWz_V#sEcih2XLCVOZ6nv0WYAv)YuGu^hr`ELV?=lg^hs~P zYikeG>Wo4Es`<2A>dzGpikR?tKW!hQO1i#fkTJ%X6=JVD)@Yb=@&AHwNTe~D{9Y&e zJnsX=r{?Sz)JNAppN>~?iv-}AdU1256Ug=<-sZQM>daq)D`It+fcjKi_7JyERG=hq7R zc+mAva=EJx)BRU*Xq6>ejar4qt{>5B>rt9ISONEM8=%ROQp~wk3xT@Huz8IOSzTPj zOEyG8xN?t}@9V))y^A?6+XbJGeTGS=w$W$(SjwJh0+N;Pd@KWGyfJ$pH3knC%m=O6 zKqCzg{a8$m2NO6~HU{ceX2K`iAapmg6`VVwF~{{5rR~?`!KQh%FL(zGxG7?JPC32X z7DE?(li2;MIh**8L0`!Ns5ESZ++Q?#`HPdhe{m2!-P=a0sv&&9D4bI5F2c*3wc?FZ znIjnPIVesWJ(J7NZ-wUWaxUvQ3-6=dIM6c)&M28st~`iW6wapSTjSXlyij4vd5V5? zf{rGafLgshyF9F;JNm=Pdtw9^83l06(`4FhG8wwQ)Wfk`lX1JxA(|2u2Z^Z@LH+bJ z3?9`DdZ$vzcC`{F%d}@>@zemwSTTzY6$;^sWGpKeF5#(DKZ5Cj7BNjyh6)-9j&BYZ zP(jxdl0N8yT~`Azcexd2w~oQtKTW{5efx3IkL6h3t|HVX6^n@)Z{h7cA2bY&hpp?P ws53E#^2)A?@7BzrfuSv;bN+|QWrcJ3$&x(OsCW10yQ>H3i{^Q#7&ept1?=GY9smFU delta 2071 zcmWO4iC>M08UWyvrIKioHZ^jHRFX&#+UW&HvkYb^%nbz@;zunj6x za^YBGCYIk#!}ex1mQKv!qY-_=WsPb4)H7EIH1HL?<5E%e(i}`^)5qIZ_o;XPdw5pw z%C(JAGOboXhhd+fNv{Yr&l+&kyFuB&fFsT~E`n7)U81308fkP8e9$YBQ%Tn(Ue}wB z3$%~W!=Ul}hyD?&|KN_b8#P6PB{lGO(sHu1c1E+a(bSPN1V?|pEI1{UQMj(3VB~X! zzdhA}6ABrQi1y=xA7=9O2urMgV<3y_h=%fS{nY+>C;oa}L$Lc?#iiM~BwKSHg69uH zqiZK@a+T-e$MC%%9rup@I_k`a&W_*=e<_bXTm>2JJ<#N-&5`PIc6hv!O9EstB231G zgBeug)CQrieR$4COYu~$BPP9^PAdMEw0U0)4Lphkb%z7!eny3gvRY(*l0;M)a$5*2 zi-zH!I>9ToghMl*g7l9j+8~!*JY&-Fa`v-nO~Bb>m1-&E21pC{-uM=JYssvULq zs8e3-1Ktx*jIlAOz;9r)4O7&Ws# zk*`}9dGE>LK%++X%FM)o^@h02FbK5;H;S~*VfmUT<>HuN56l&9@ZE<75Hs>2O8Sqm zZ&nEuOZ4H?)hCqVI9b+fVui~xrf}z!5Z=(WoApc|35$PJWn;A(c)T>3!-rQvY}HB# z3~UzLV=ejXt$dc=xkon-dvUW_DH*)FDy+RF;}|b>l&Hz6FWid1A6zA;aCsy+nY(fK z&&8NuaEh;o`qDlzhgT=KlEIWF_`XWXG4qVL;C(*M(E{bU^7liloey4wFEpVXQzNK(`>mfq0q zo>8Q;Qw#BBJ_Q@v;MM=!pzZU1r>#NLaY^bVt_>Q6V}noPhH(#|*J3OhDH=I$PXhZr z?14Aa6}V6i%rxsMR(m0Br z|5+p2*T1IIiRFTQ)=>Cv+A-*iw-Va|baCXp7S5UA0fDOO_%S(&Q=}hg*3uWGy}LoF ztLMtzZq<+;^j>+qRUHlbgL$rcK3ql(j>?+Jrj3cTs@0h5>yqV|KHQh)U8saN+DkY* zs+la*Dg~}cGX(LH8aK3@c}T|#sZhw1)!n# z44J!&D$7g>#%?`-75U6PAX`w-Ax@0_W`_HaL}O%?-F{a8Ns8zF5~oTjISo_hw6KEFiGKo z`%BYs(RdH?GYw(5r;5%_JIOj^BrT9$0IxiAPDx(nqRgGbf2GEu&&erN8P_7t&=`RA zQY#L=-%po}k5jk&ytYtMc$6dDcW{@r56`@N6mCB0gk3M~x%y%idaj><*M1McS5Xq- zrz4(R)UuN`r{2X_wHe@eXEoa@C2TO-8ExwrPH#-350dGa9I1(8?$+_qo7c&&dMOoL zI0?Ep-B5kZH&MmNiN9<}V$a@kdNC`K<&w4+w5unBcx@sixMZM>lMl+g&3KVLTfsc`{w7l7iEo@Ri z5z`}{&tJrG7kpXiH5VQFo+7oZCtb%hDhxG;QX>z}%L6%w9!VyrGJhjiH`Y#|kT$3pTYRrCnIKtm^HP~gVB ztQ@f7fg5`Gqu>R4%kP5qP8~k-w3vfc% zD@6RQXZ{2xAq%-6B^FeEnMBnT$92P8>7ZLCf9vo=H>*?BP*F@9d(T0C z)GSUreT$xL9zu&ucCh`ob$obLE@_mRgXWq$psy#zhuim&OH&4z*H3_i?iuK!+X "InpaintingOptions": @@ -38,4 +39,5 @@ def from_api_dto(dto: Optional[api_utils.InpaintingOptions]) -> "InpaintingOptio inpainting_steps=dto.inpainting_steps, inpainting_sampler=dto.inpainting_sampler, inpainting_model=dto.inpainting_model, + inpainting_seed=dto.inpainting_seed, ) diff --git a/scripts/faceswaplab_inpainting/i2i_pp.py b/scripts/faceswaplab_inpainting/i2i_pp.py index 1826949..4daa41c 100644 --- a/scripts/faceswaplab_inpainting/i2i_pp.py +++ b/scripts/faceswaplab_inpainting/i2i_pp.py @@ -63,6 +63,7 @@ def img2img_diffusion( "prompt": prompt, "negative_prompt": negative_prompt, "denoising_strength": options.inpainting_denoising_strengh, + "seed": options.inpainting_seed, } # Remove the following as they are not always supported on all platform : # "override_settings": { diff --git a/scripts/faceswaplab_ui/faceswaplab_inpainting_ui.py b/scripts/faceswaplab_ui/faceswaplab_inpainting_ui.py index 8bb7180..1c40d82 100644 --- a/scripts/faceswaplab_ui/faceswaplab_inpainting_ui.py +++ b/scripts/faceswaplab_ui/faceswaplab_inpainting_ui.py @@ -4,68 +4,71 @@ from scripts.faceswaplab_utils.sd_utils import get_sd_option -def face_inpainting_ui( - name: str, id_prefix: str = "faceswaplab", description: str = "" -) -> List[gr.components.Component]: - with gr.Accordion(name, open=False): - gr.Markdown(description) - inpainting_denoising_strength = gr.Slider( - 0, - 1, - 0, - step=0.01, - elem_id=f"{id_prefix}_pp_inpainting_denoising_strength", - label="Denoising strenght", - ) +def face_inpainting_ui(id_prefix: str = "faceswaplab") -> List[gr.components.Component]: + inpainting_denoising_strength = gr.Slider( + 0, + 1, + 0, + step=0.01, + elem_id=f"{id_prefix}_pp_inpainting_denoising_strength", + label="Denoising strenght", + ) - inpainting_denoising_prompt = gr.Textbox( - get_sd_option( - "faceswaplab_pp_default_inpainting_prompt", "Portrait of a [gender]" - ), - elem_id=f"{id_prefix}_pp_inpainting_denoising_prompt", - label="Inpainting prompt use [gender] instead of men or woman", + inpainting_denoising_prompt = gr.Textbox( + get_sd_option( + "faceswaplab_pp_default_inpainting_prompt", "Portrait of a [gender]" + ), + elem_id=f"{id_prefix}_pp_inpainting_denoising_prompt", + label="Inpainting prompt use [gender] instead of men or woman", + ) + inpainting_denoising_negative_prompt = gr.Textbox( + get_sd_option("faceswaplab_pp_default_inpainting_negative_prompt", "blurry"), + elem_id=f"{id_prefix}_pp_inpainting_denoising_neg_prompt", + label="Inpainting negative prompt use [gender] instead of men or woman", + ) + with gr.Row(): + samplers_names = [s.name for s in sd_samplers.all_samplers] + inpainting_sampler = gr.Dropdown( + choices=samplers_names, + value=[samplers_names[0]], + label="Inpainting Sampler", + elem_id=f"{id_prefix}_pp_inpainting_sampler", ) - inpainting_denoising_negative_prompt = gr.Textbox( - get_sd_option( - "faceswaplab_pp_default_inpainting_negative_prompt", "blurry" - ), - elem_id=f"{id_prefix}_pp_inpainting_denoising_neg_prompt", - label="Inpainting negative prompt use [gender] instead of men or woman", + inpainting_denoising_steps = gr.Slider( + 1, + 150, + 20, + step=1, + label="Inpainting steps", + elem_id=f"{id_prefix}_pp_inpainting_steps", ) - with gr.Row(): - samplers_names = [s.name for s in sd_samplers.all_samplers] - inpainting_sampler = gr.Dropdown( - choices=samplers_names, - value=[samplers_names[0]], - label="Inpainting Sampler", - elem_id=f"{id_prefix}_pp_inpainting_sampler", - ) - inpainting_denoising_steps = gr.Slider( - 1, - 150, - 20, - step=1, - label="Inpainting steps", - elem_id=f"{id_prefix}_pp_inpainting_steps", - ) - inpaiting_model = gr.Dropdown( - choices=["Current"] + sd_models.checkpoint_tiles(), - default="Current", - label="sd model (experimental)", - elem_id=f"{id_prefix}_pp_inpainting_sd_model", - ) + inpaiting_model = gr.Dropdown( + choices=["Current"] + sd_models.checkpoint_tiles(), + default="Current", + label="sd model (experimental)", + elem_id=f"{id_prefix}_pp_inpainting_sd_model", + ) + + inpaiting_seed = gr.Number( + label="Inpainting seed", + value=0, + minimum=0, + precision=0, + elem_id=f"{id_prefix}_pp_inpainting_seed", + ) - gradio_components: List[gr.components.Component] = [ - inpainting_denoising_strength, - inpainting_denoising_prompt, - inpainting_denoising_negative_prompt, - inpainting_denoising_steps, - inpainting_sampler, - inpaiting_model, - ] + gradio_components: List[gr.components.Component] = [ + inpainting_denoising_strength, + inpainting_denoising_prompt, + inpainting_denoising_negative_prompt, + inpainting_denoising_steps, + inpainting_sampler, + inpaiting_model, + inpaiting_seed, + ] - for component in gradio_components: - setattr(component, "do_not_save_to_config", True) + for component in gradio_components: + setattr(component, "do_not_save_to_config", True) - return gradio_components + return gradio_components diff --git a/scripts/faceswaplab_ui/faceswaplab_postprocessing_ui.py b/scripts/faceswaplab_ui/faceswaplab_postprocessing_ui.py index a741809..e173c92 100644 --- a/scripts/faceswaplab_ui/faceswaplab_postprocessing_ui.py +++ b/scripts/faceswaplab_ui/faceswaplab_postprocessing_ui.py @@ -4,6 +4,7 @@ from modules import shared, sd_models from scripts.faceswaplab_postprocessing.postprocessing_options import InpaintingWhen from scripts.faceswaplab_utils.sd_utils import get_sd_option +from scripts.faceswaplab_ui.faceswaplab_inpainting_ui import face_inpainting_ui def postprocessing_ui() -> List[gr.components.Component]: @@ -66,9 +67,10 @@ def postprocessing_ui() -> List[gr.components.Component]: label="Upscaler visibility (if scale = 1)", elem_id="faceswaplab_pp_upscaler_visibility", ) - with gr.Accordion(f"Post Inpainting", open=True): + + with gr.Accordion(label="Global-Inpainting (all faces)", open=False): gr.Markdown( - """Inpainting sends image to inpainting with a mask on face (once for each faces).""" + "Inpainting sends image to inpainting with a mask on face (once for each faces)." ) inpainting_when = gr.Dropdown( elem_id="faceswaplab_pp_inpainting_when", @@ -76,52 +78,8 @@ def postprocessing_ui() -> List[gr.components.Component]: value=[InpaintingWhen.BEFORE_RESTORE_FACE.value], label="Enable/When", ) - inpainting_denoising_strength = gr.Slider( - 0, - 1, - 0, - step=0.01, - elem_id="faceswaplab_pp_inpainting_denoising_strength", - label="Denoising strenght (will send face to img2img after processing)", - ) + global_inpainting = face_inpainting_ui("faceswaplab_gpp") - inpainting_denoising_prompt = gr.Textbox( - get_sd_option( - "faceswaplab_pp_default_inpainting_prompt", "Portrait of a [gender]" - ), - elem_id="faceswaplab_pp_inpainting_denoising_prompt", - label="Inpainting prompt use [gender] instead of men or woman", - ) - inpainting_denoising_negative_prompt = gr.Textbox( - get_sd_option( - "faceswaplab_pp_default_inpainting_negative_prompt", "blurry" - ), - elem_id="faceswaplab_pp_inpainting_denoising_neg_prompt", - label="Inpainting negative prompt use [gender] instead of men or woman", - ) - with gr.Row(): - samplers_names = [s.name for s in modules.sd_samplers.all_samplers] # type: ignore - inpainting_sampler = gr.Dropdown( - choices=samplers_names, - value=[samplers_names[0]], - label="Inpainting Sampler", - elem_id="faceswaplab_pp_inpainting_sampler", - ) - inpainting_denoising_steps = gr.Slider( - 1, - 150, - 20, - step=1, - label="Inpainting steps", - elem_id="faceswaplab_pp_inpainting_steps", - ) - - inpaiting_model = gr.Dropdown( - choices=["Current"] + sd_models.checkpoint_tiles(), - default="Current", - label="sd model (experimental)", - elem_id="faceswaplab_pp_inpainting_sd_model", - ) components = [ face_restorer_name, face_restorer_visibility, @@ -130,13 +88,7 @@ def postprocessing_ui() -> List[gr.components.Component]: upscaler_scale, upscaler_visibility, inpainting_when, - inpainting_denoising_strength, - inpainting_denoising_prompt, - inpainting_denoising_negative_prompt, - inpainting_denoising_steps, - inpainting_sampler, - inpaiting_model, - ] + ] + global_inpainting # Ask sd to not store in ui-config.json for component in components: diff --git a/scripts/faceswaplab_ui/faceswaplab_unit_ui.py b/scripts/faceswaplab_ui/faceswaplab_unit_ui.py index 20dbacf..df5a803 100644 --- a/scripts/faceswaplab_ui/faceswaplab_unit_ui.py +++ b/scripts/faceswaplab_ui/faceswaplab_unit_ui.py @@ -249,19 +249,19 @@ def refresh_fn(selected: str): elem_id=f"{id_prefix}_face{unit_num}_min_ref_similarity", ) - pre_inpainting = face_inpainting_ui( - name="Pre-Inpainting (Before swapping)", - id_prefix=f"{id_prefix}_face{unit_num}_preinpainting", - description="Pre-inpainting sends face to inpainting before swapping", - ) + with gr.Accordion(label="Pre-Inpainting (before swapping)", open=False): + gr.Markdown("Pre-inpainting sends face to inpainting before swapping") + pre_inpainting = face_inpainting_ui( + id_prefix=f"{id_prefix}_face{unit_num}_preinpainting", + ) options = faceswap_unit_advanced_options(is_img2img, unit_num, id_prefix) - post_inpainting = face_inpainting_ui( - name="Post-Inpainting (After swapping)", - id_prefix=f"{id_prefix}_face{unit_num}_postinpainting", - description="Post-inpainting sends face to inpainting after swapping", - ) + with gr.Accordion(label="Post-Inpainting (After swapping)", open=False): + gr.Markdown("Pre-inpainting sends face to inpainting before swapping") + post_inpainting = face_inpainting_ui( + id_prefix=f"{id_prefix}_face{unit_num}_postinpainting", + ) gradio_components: List[gr.components.Component] = ( [