Chris4K's picture
Update app.py
dd260ca verified
import gradio as gr
from diffusers import DiffusionPipeline
import torch
from PIL import Image, ImageDraw
class ChatbotIconGenerator:
def __init__(self):
# Predefined size options
self.SIZE_OPTIONS = {
"Small (128x128)": 128,
"Medium (256x256)": 256,
"Large (512x512)": 512,
"Extra Large (1024x1024)": 1024
}
# Predefined prompt templates
self.PROMPT_TEMPLATES = [
"Cute cartoon chatbot mascot, big eyes, friendly smile, pastel colors, kawaii style",
"Professional AI chatbot avatar, minimalist design, sleek geometric shapes, corporate blue and white",
"Futuristic AI chatbot icon, glowing circuit patterns, metallic blue and silver",
"Abstract geometric chatbot avatar, clean lines, single color gradient background",
"Watercolor style chatbot icon, soft brush strokes, dreamy color blend",
"Adorable robot character avatar, round shape, soft colors, playful expression",
"Ultra-minimalist chatbot icon, simple geometric face, monochrome color scheme",
"Cyberpunk chatbot avatar, neon accents, digital glitch effects",
"Elegant corporate chatbot icon, modern flat design, clean lines",
"Sketch-style chatbot avatar, hand-drawn look, pencil texture"
]
# Rounding options
self.CORNER_OPTIONS = {
"No Rounding": 0,
"Slight Rounding": 20,
"Medium Rounding": 50,
"Full Rounded": 100
}
# Load the model
self.model = self.load_image_generator()
def load_image_generator(self):
try:
# Use a more lightweight model
model = DiffusionPipeline.from_pretrained(
"runwayml/stable-diffusion-v1-5", # kopyl/ui-icons-256
torch_dtype=torch.float16,
safety_checker=None, # Disable safety checker to reduce load
requires_safety_checker=False
)
return model.to("cpu")
except Exception as e:
print(f"Error loading model: {e}")
return None
def round_image_corners(self, image, corner_radius):
# Create a rounded corner mask
if corner_radius == 0:
return image
# Create a new image with an alpha channel
rounded_image = Image.new('RGBA', image.size, (0, 0, 0, 0))
# Create a mask for rounded corners
mask = Image.new('L', image.size, 255)
draw = ImageDraw.Draw(mask)
# Draw rounded rectangle
draw.rounded_rectangle(
[0, 0, image.width-1, image.height-1],
radius=corner_radius,
fill=255
)
# Paste the original image with the mask
rounded_image.paste(image, mask=mask)
return rounded_image
def generate_chatbot_icon(
self,
prompt,
size,
corner_rounding,
negative_prompt="low quality, bad composition, blurry, ugly, deformed",
num_inference_steps=20,
guidance_scale=7.5
):
if self.model is None:
raise ValueError("Model failed to load. Please check your dependencies.")
try:
# Generate the image
generated_image = self.model(
prompt=prompt,
negative_prompt=negative_prompt,
num_inference_steps=num_inference_steps,
guidance_scale=guidance_scale,
height=size,
width=size
).images[0]
# Resize and round corners
generated_image = generated_image.resize((size, size))
rounded_image = self.round_image_corners(generated_image,
self.CORNER_OPTIONS[corner_rounding])
return rounded_image
except Exception as e:
print(f"Error generating image: {e}")
raise
def create_gradio_interface(self):
with gr.Blocks(title="πŸ€– Chatbot Icon Generator") as demo:
gr.Markdown("# πŸ€– Chatbot Icon Generator")
with gr.Row():
with gr.Column():
# Prompt selection
prompt_dropdown = gr.Dropdown(
label="Quick Templates",
choices=self.PROMPT_TEMPLATES,
allow_custom_value=True
)
# Custom prompt input
custom_prompt = gr.Textbox(
label="Custom Prompt (Optional)",
placeholder="Enter your own detailed description..."
)
# Size selection
size_dropdown = gr.Dropdown(
label="Icon Size",
choices=list(self.SIZE_OPTIONS.keys()),
value="Medium (256x256)"
)
# Corner rounding
corner_dropdown = gr.Dropdown(
label="Corner Rounding",
choices=list(self.CORNER_OPTIONS.keys()),
value="Slight Rounding"
)
# Generate button
generate_btn = gr.Button("Generate Icon", variant="primary")
with gr.Column():
# Output image
output_image = gr.Image(label="Generated Chatbot Icon")
# Logic for prompt selection
def update_prompt(template):
return template
prompt_dropdown.change(
fn=update_prompt,
inputs=[prompt_dropdown],
outputs=[custom_prompt]
)
# Generate button logic
generate_btn.click(
fn=lambda prompt, size, corners: self.generate_chatbot_icon(
prompt or "Cute minimalist chatbot avatar, clean design, friendly expression",
self.SIZE_OPTIONS[size],
corners
),
inputs=[custom_prompt, size_dropdown, corner_dropdown],
outputs=[output_image]
)
return demo
# Launch the app
def main():
generator = ChatbotIconGenerator()
demo = generator.create_gradio_interface()
demo.launch()
if __name__ == "__main__":
main()