Spaces:
Runtime error
Runtime error
| import torch | |
| from diffusers import StableDiffusionControlNetPipeline, ControlNetModel, UniPCMultistepScheduler | |
| from PIL import Image, ImageFilter | |
| import numpy as np | |
| import gradio as gr | |
| import cv2 | |
| # Load pre-trained Stable Diffusion model (frozen part) | |
| model_id = "runwayml/stable-diffusion-v1-5" | |
| controlnet_id = "lllyasviel/control_v11p_sd15_canny" # ControlNet for edge detection-based control | |
| # Load ControlNet model (trainable part) | |
| controlnet = ControlNetModel.from_pretrained(controlnet_id, torch_dtype=torch.float16) | |
| # Load Stable Diffusion pipeline with ControlNet | |
| pipe = StableDiffusionControlNetPipeline.from_pretrained( | |
| model_id, controlnet=controlnet, torch_dtype=torch.float16 | |
| ) | |
| # Use an efficient scheduler | |
| pipe.scheduler = UniPCMultistepScheduler.from_config(pipe.scheduler.config) | |
| # Move pipeline to GPU | |
| device = "cuda" if torch.cuda.is_available() else "cpu" | |
| pipe.to(device) | |
| # Function to generate control image (edge detection using Canny filter) | |
| def generate_control_image(input_image_path): | |
| image = cv2.imread(input_image_path, cv2.IMREAD_GRAYSCALE) | |
| edges = cv2.Canny(image, 100, 200) # Apply Canny edge detection | |
| control_image = Image.fromarray(edges).convert("L") | |
| control_image = control_image.resize((512, 512)) # Resize to match model requirements | |
| control_image.save("control_image.jpg") | |
| return "control_image.jpg" | |
| # Function to apply color change | |
| def apply_color_change(input_image, prompt): | |
| # Save input image temporarily | |
| input_image_path = "input_image.jpg" | |
| input_image.save(input_image_path) | |
| # Generate control image (edges) | |
| control_image_path = generate_control_image(input_image_path) | |
| # Load processed input and control images | |
| input_image = Image.open(input_image_path).convert("RGB").resize((512, 512)) | |
| control_image = Image.open(control_image_path).convert("L") | |
| # Generate the new image using the pipeline | |
| generator = torch.manual_seed(42) # For reproducibility | |
| output_image = pipe( | |
| prompt=prompt, | |
| image=input_image, | |
| control_image=control_image, | |
| generator=generator, | |
| num_inference_steps=30 | |
| ).images[0] | |
| output_image.save("output_color_changed.png") | |
| return "output_color_changed.png" | |
| # Gradio interface | |
| def gradio_interface(input_image, prompt): | |
| output_image_path = apply_color_change(input_image, prompt) | |
| return output_image_path | |
| # Launch the Gradio interface with drag and drop | |
| interface = gr.Interface( | |
| fn=gradio_interface, | |
| inputs=[ | |
| gr.Image(type="pil", label="Upload your image"), # Drag and drop feature | |
| gr.Textbox(label="Enter prompt", placeholder="e.g. A hoodie with blue and white design"), | |
| ], | |
| outputs=gr.Image(label="Color Changed Output"), | |
| title="AI-Powered Clothing Color Changer", | |
| description="Upload an image of clothing, enter a prompt, and get a redesigned color version.", | |
| ) | |
| interface.launch() |