ControlNet / app.py
oshita-n's picture
upd
92a1c24
import gradio as gr
import cv2
import requests
import numpy as np
from PIL import Image
from io import BytesIO
from rembg import remove
from diffusers import StableDiffusionControlNetPipeline, ControlNetModel
import torch
from diffusers import UniPCMultistepScheduler
def remove_background(input_image: Image.Image, to_grayscale: bool) -> Image.Image:
output_image = remove(input_image)
if to_grayscale:
output_image = convert_to_grayscale(output_image)
return output_image
def convert_to_grayscale(image: Image.Image) -> Image.Image:
return image.convert("L")
def canny_image(image: Image.Image) -> Image.Image:
np_image = np.array(image)
low_threshold = 100
high_threshold = 200
np_image = cv2.Canny(np_image, low_threshold, high_threshold)
np_image = np_image[:, :, None]
np_image = np.concatenate([np_image, np_image, np_image], axis=2)
return Image.fromarray(np_image)
def process_image(input_image: Image.Image, to_grayscale: bool, prompt: str) -> Image.Image:
output_image = remove_background(input_image, to_grayscale)
canny_output = canny_image(output_image)
controlnet = ControlNetModel.from_pretrained("lllyasviel/sd-controlnet-canny", torch_dtype=torch.float32)
pipe = StableDiffusionControlNetPipeline.from_pretrained(
"runwayml/stable-diffusion-v1-5", controlnet=controlnet, torch_dtype=torch.float32
)
pipe.enable_model_cpu_offload()
pipe.scheduler = UniPCMultistepScheduler.from_config(pipe.scheduler.config)
pipe.enable_xformers_memory_efficient_attention()
generator = torch.manual_seed(2)
output = pipe(
prompt,
canny_output,
negative_prompt="monochrome, lowres, bad anatomy, worst quality, low quality",
generator=generator,
num_inference_steps=20,
)
return output.images[0]
image_input = gr.components.Image(label="Input Image")
grayscale_checkbox = gr.components.Checkbox(label="Convert output to grayscale", default=False)
prompt_input = gr.components.Textbox(lines=1, label="Prompt")
image_output = gr.components.Image(label="Output Image", type="pil")
gr.Interface(
fn=process_image,
inputs=[image_input, grayscale_checkbox, prompt_input],
outputs=image_output,
title="ControlNet",
description="Upload an image and a prompt to generate an image with the prompt in the style of the input image.",
).launch()