from modules.face_restoration import FaceRestoration from modules.upscaler import UpscalerData from scripts.faceswaplab_utils.faceswaplab_logging import logger from PIL import Image import numpy as np from modules import shared from scripts.faceswaplab_utils import imgutils from modules import shared, processing, codeformer_model from modules.processing import (StableDiffusionProcessingImg2Img) from scripts.faceswaplab_postprocessing.postprocessing_options import PostProcessingOptions, InpaintingWhen from modules import sd_models from scripts.faceswaplab_swapping import swapper def img2img_diffusion(img : Image.Image, pp: PostProcessingOptions) -> Image.Image : if pp.inpainting_denoising_strengh == 0 : return img try : logger.info( f"""Inpainting face Sampler : {pp.inpainting_sampler} inpainting_denoising_strength : {pp.inpainting_denoising_strengh} inpainting_steps : {pp.inpainting_steps} """ ) if not isinstance(pp.inpainting_sampler, str) : pass logger.info("send faces to image to image") img = img.copy() faces = swapper.get_faces(imgutils.pil_to_cv2(img)) if faces: for face in faces: bbox =face.bbox.astype(int) mask = imgutils.create_mask(img, bbox) prompt = pp.inpainting_prompt.replace("[gender]", "man" if face["gender"] == 1 else "woman") negative_prompt = pp.inpainting_negative_prompt.replace("[gender]", "man" if face["gender"] == 1 else "woman") logger.info("Denoising prompt : %s", prompt) logger.info("Denoising strenght : %s", pp.inpainting_denoising_strengh) i2i_kwargs = {"sampler_name" :pp.inpainting_sampler, "do_not_save_samples":True, "steps" :pp.inpainting_steps, "width" : img.width, "inpainting_fill":1, "inpaint_full_res":True, "height" : img.height, "mask": mask, "prompt" : prompt, "negative_prompt" :negative_prompt, "denoising_strength" :pp.inpainting_denoising_strengh} current_model_checkpoint = shared.opts.sd_model_checkpoint if pp.inpainting_model and pp.inpainting_model != "Current" : # Change checkpoint shared.opts.sd_model_checkpoint = pp.inpainting_model sd_models.select_checkpoint sd_models.load_model() i2i_p = StableDiffusionProcessingImg2Img([img], **i2i_kwargs) i2i_processed = processing.process_images(i2i_p) if pp.inpainting_model and pp.inpainting_model != "Current" : # Restore checkpoint shared.opts.sd_model_checkpoint = current_model_checkpoint sd_models.select_checkpoint sd_models.load_model() images = i2i_processed.images if len(images) > 0 : img = images[0] return img except Exception as e : logger.error("Failed to apply img2img to face : %s", e) import traceback traceback.print_exc() raise e