huge changes, inpainting in faces unit, change faces processing, change api, refactor, requires further testing
parent
1d9b3a64dc
commit
ee7f7d09d2
@ -0,0 +1,41 @@
|
||||
from dataclasses import dataclass
|
||||
from typing import List
|
||||
import gradio as gr
|
||||
from client_api import api_utils
|
||||
|
||||
|
||||
@dataclass
|
||||
class InpaintingOptions:
|
||||
inpainting_denoising_strengh: float = 0
|
||||
inpainting_prompt: str = ""
|
||||
inpainting_negative_prompt: str = ""
|
||||
inpainting_steps: int = 20
|
||||
inpainting_sampler: str = "Euler"
|
||||
inpainting_model: str = "Current"
|
||||
|
||||
@staticmethod
|
||||
def from_gradio(components: List[gr.components.Component]) -> "InpaintingOptions":
|
||||
return InpaintingOptions(*components)
|
||||
|
||||
@staticmethod
|
||||
def from_api_dto(dto: api_utils.InpaintingOptions) -> "InpaintingOptions":
|
||||
"""
|
||||
Converts a InpaintingOptions object from an API DTO (Data Transfer Object).
|
||||
|
||||
:param options: An object of api_utils.InpaintingOptions representing the
|
||||
post-processing options as received from the API.
|
||||
:return: A InpaintingOptions instance containing the translated values
|
||||
from the API DTO.
|
||||
"""
|
||||
if dto is None:
|
||||
# Return default values
|
||||
return InpaintingOptions()
|
||||
|
||||
return InpaintingOptions(
|
||||
inpainting_denoising_strengh=dto.inpainting_denoising_strengh,
|
||||
inpainting_prompt=dto.inpainting_prompt,
|
||||
inpainting_negative_prompt=dto.inpainting_negative_prompt,
|
||||
inpainting_steps=dto.inpainting_steps,
|
||||
inpainting_sampler=dto.inpainting_sampler,
|
||||
inpainting_model=dto.inpainting_model,
|
||||
)
|
@ -0,0 +1,68 @@
|
||||
from typing import List
|
||||
import gradio as gr
|
||||
from modules.shared import opts
|
||||
from modules import sd_models, sd_samplers
|
||||
|
||||
|
||||
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",
|
||||
)
|
||||
|
||||
inpainting_denoising_prompt = gr.Textbox(
|
||||
opts.data.get(
|
||||
"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(
|
||||
opts.data.get(
|
||||
"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_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",
|
||||
)
|
||||
|
||||
gradio_components: List[gr.components.Component] = [
|
||||
inpainting_denoising_strength,
|
||||
inpainting_denoising_prompt,
|
||||
inpainting_denoising_negative_prompt,
|
||||
inpainting_denoising_steps,
|
||||
inpainting_sampler,
|
||||
inpaiting_model,
|
||||
]
|
||||
|
||||
return gradio_components
|
@ -0,0 +1,10 @@
|
||||
from typing import Tuple
|
||||
from numpy import uint8
|
||||
from numpy.typing import NDArray
|
||||
from insightface.app.common import Face as IFace
|
||||
from PIL import Image
|
||||
|
||||
PILImage = Image.Image
|
||||
CV2ImgU8 = NDArray[uint8]
|
||||
Face = IFace
|
||||
BoxCoords = Tuple[int, int, int, int]
|
@ -0,0 +1,39 @@
|
||||
from dataclasses import fields, is_dataclass
|
||||
from typing import *
|
||||
|
||||
|
||||
def dataclass_from_flat_list(cls: type, values: Tuple[Any, ...]) -> Any:
|
||||
if not is_dataclass(cls):
|
||||
raise TypeError(f"{cls} is not a dataclass")
|
||||
|
||||
idx = 0
|
||||
init_values = {}
|
||||
for field in fields(cls):
|
||||
if is_dataclass(field.type):
|
||||
inner_values = [values[idx + i] for i in range(len(fields(field.type)))]
|
||||
init_values[field.name] = field.type(*inner_values)
|
||||
idx += len(inner_values)
|
||||
else:
|
||||
value = values[idx]
|
||||
init_values[field.name] = value
|
||||
idx += 1
|
||||
return cls(**init_values)
|
||||
|
||||
|
||||
def dataclasses_from_flat_list(
|
||||
classes_mapping: List[type], values: Tuple[Any, ...]
|
||||
) -> List[Any]:
|
||||
instances = []
|
||||
idx = 0
|
||||
for cls in classes_mapping:
|
||||
num_fields = sum(
|
||||
len(fields(field.type)) if is_dataclass(field.type) else 1
|
||||
for field in fields(cls)
|
||||
)
|
||||
instance = dataclass_from_flat_list(cls, values[idx : idx + num_fields])
|
||||
instances.append(instance)
|
||||
idx += num_fields
|
||||
assert [
|
||||
isinstance(i, t) for i, t in zip(instances, classes_mapping)
|
||||
], "Instances should match types"
|
||||
return instances
|
Loading…
Reference in New Issue