from controlnet_aux import OpenposeDetector from diffusers import StableDiffusionControlNetPipeline, ControlNetModel from diffusers import UniPCMultistepScheduler import gradio as gr import torch from PIL import Image, ImageDraw, ImageFont import os import cv2 import glob from PIL import Image import numpy as np from diffusers.utils import load_image import random # Constants low_threshold = 100 high_threshold = 200 # Models pose_model = OpenposeDetector.from_pretrained("lllyasviel/ControlNet") controlnet = ControlNetModel.from_pretrained( "lllyasviel/sd-controlnet-openpose" ) pipe = StableDiffusionControlNetPipeline.from_pretrained( "runwayml/stable-diffusion-v1-5", controlnet=controlnet, safety_checker=None ) pipe = pipe.to("cpu") def get_pose(image): return pose_model(image) def generate_an_image_from_text(text, text_size_, width, lenght): # Create a blank image image = Image.new('RGB', (width, lenght), color = (255, 255, 255)) # Create a drawing object draw = ImageDraw.Draw(image) # font def dir_path = '' # Get a list of all the font files in the directory print("start generation") font_files = glob.glob(os.path.join(dir_path, '*.ttf')) # Get a list of font paths font_paths = [] for font_file in font_files: font_paths.append(font_file) # Select a random font font_path = random.choice(font_paths) #print(font_path) font = ImageFont.truetype(font_path, text_size_) # Get the text size text_size = draw.textsize(text, font) # Calculate the x and y positions for the text x = (image.width - text_size[0]) / 2 y = (image.height - text_size[1]) / 2 # Draw the text on the image draw.text((x, y), text, fill=(0, 0, 0), font=font) print("end generation") return image def to_Canny(image): print("start canny") # Let's load the popular vermeer image image = np.array(image) low_threshold = 100 high_threshold = 200 image = cv2.Canny(image, low_threshold, high_threshold) image = image[:, :, None] image = np.concatenate([image, image, image], axis=2) canny_image = Image.fromarray(image) print("end canny") return canny_image def inference(prompt,canny_image,number,seed, steps ): print("start inference") pipe.scheduler = UniPCMultistepScheduler.from_config(pipe.scheduler.config) # This command loads the individual model components on GPU on-demand. So, we don't # need to explicitly call pipe.to("cuda"). #pipe.enable_model_cpu_offload() # xformers #pipe.enable_xformers_memory_efficient_attention() # Generator seed, generator = torch.manual_seed(seed) image_ = canny_image prompt = prompt out_image = pipe( prompt, num_inference_steps=steps, generator=generator, image=image_, num_images_per_prompt=number) print('end inference') return out_image def generation(prompt,text,seed,police_size, lenght, width,number,num_inference_steps): img = generate_an_image_from_text(text,police_size,lenght,width) img = to_Canny(img) output = inference(prompt,img, number,seed,num_inference_steps) all_outputs = [] for image in output.images: all_outputs.append(image) return all_outputs gr.Interface(fn=generation, inputs=[gr.Textbox(value="A steampunk Alphabetic Logo, steampunk style, with glowing mecha parts, mecha alphabets, high quality, high res, ultra HD"), gr.Textbox(), gr.Slider(0, 200,value=60), gr.Slider(0, 200, value=90), gr.Slider(0, 1024, value=512), gr.Slider(0, 1024, value=512), gr.Slider(0, 7,value=2, step=1),gr.Slider(0, 20,value=5, step=1)], outputs=gr.Gallery().style(grid=[2], height="auto"), title="Generate a logo using Text ",cache_examples=True, examples=[["A steampunk Alphabetic Logo, steampunk style, with glowing mecha parts, mecha alphabets, high quality, high res, ultra HD", "Logo",60,90,512,512,2,5]]).launch(enable_queue=True)