from diffusers import StableDiffusionInpaintPipeline import torch from PIL import Image import os from torch.multiprocessing import set_start_method import gc def setup_model(model_path): # Clear CUDA memory torch.cuda.empty_cache() gc.collect() pipe = StableDiffusionInpaintPipeline.from_single_file( model_path, torch_dtype=torch.float16, safety_checker=None ).to("cuda") # Enable memory optimizations without xformers pipe.enable_attention_slicing(slice_size="max") pipe.enable_sequential_cpu_offload() return pipe def prepare_images(image_path, mask_path=None): # Load and prepare the original image original_image = Image.open(image_path) # Resize to a multiple of 8 (required by Stable Diffusion) width, height = (dim - dim % 8 for dim in original_image.size) original_image = original_image.resize((width, height)) if mask_path: mask_image = Image.open(mask_path) mask_image = mask_image.resize((width, height)) mask_image = mask_image.convert("L") else: # Create a simple rectangular mask in the center mask_image = Image.new("L", (width, height), 0) mask_width = width // 3 mask_height = height // 3 x1 = (width - mask_width) // 2 y1 = (height - mask_height) // 2 x2 = x1 + mask_width y2 = y1 + mask_height for y in range(y1, y2): for x in range(x1, x2): mask_image.putpixel((x, y), 255) return original_image, mask_image def main(): # Setup paths using raw strings model_path = "realisticVisionV60B1_v51VAE-inpainting.safetensors" image_path = r"C:\Users\M. Y\Downloads\t2.png" print(f"CUDA available: {torch.cuda.is_available()}") if torch.cuda.is_available(): print(f"GPU: {torch.cuda.get_device_name()}") print(f"Memory allocated: {torch.cuda.memory_allocated()/1024**2:.2f}MB") # Initialize model print("Loading model...") pipe = setup_model(model_path) # Prepare images print("Preparing images...") original_image, mask_image = prepare_images(image_path) # Save mask for verification mask_image.save("generated_mask.png") mask_image_1 = Image.open("generated_mask_1.png") # Define your prompt prompt = "add some flowers and a fountain" negative_prompt = "blurry, low quality, distorted" print("Performing inpainting...") with torch.cuda.amp.autocast(): # Use automatic mixed precision output_image = pipe( prompt=prompt, negative_prompt=negative_prompt, image=original_image, mask_image=mask_image_1, num_inference_steps=20, # Reduced steps for faster generation guidance_scale=7.5, ).images[0] # Save the result output_image.save("inpainted_result.png") print("Inpainting completed! Check 'inpainted_result.png' for the result.") # Clean up torch.cuda.empty_cache() gc.collect() if __name__ == "__main__": try: set_start_method('spawn') except RuntimeError: pass main()