snackshell commited on
Commit
61b9893
·
verified ·
1 Parent(s): a798939

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +104 -62
app.py CHANGED
@@ -1,95 +1,133 @@
1
  import os
2
- import torch
3
  import gradio as gr
4
- from diffusers import DiffusionPipeline
5
  from PIL import Image, ImageDraw, ImageFont
 
 
 
6
 
7
- # ===== FREE-TIER CONFIG =====
 
 
 
 
8
  WATERMARK_TEXT = "SelamGPT"
9
- MODEL_NAME = "DeepFloyd/IF-II-L-v1.0"
 
 
10
 
11
- # Initialize pipeline (lazy load later)
12
- pipe = None
13
-
14
- def load_model():
15
- global pipe
16
- if pipe is None:
17
- pipe = DiffusionPipeline.from_pretrained(
18
- MODEL_NAME,
19
- torch_dtype=torch.float16,
20
- variant="fp16"
21
- )
22
- pipe.to("cuda")
23
-
24
- # ===== OPTIMIZED WATERMARK =====
25
- def add_watermark(image):
26
  try:
 
27
  draw = ImageDraw.Draw(image)
28
- font = ImageFont.load_default(20)
 
 
 
 
 
 
29
  text_width = draw.textlength(WATERMARK_TEXT, font=font)
30
- draw.text(
31
- (image.width - text_width - 15, image.height - 30),
32
- WATERMARK_TEXT,
33
- font=font,
34
- fill=(255, 255, 255)
35
- )
36
- return image
37
- except Exception:
38
- return image
 
 
 
 
 
39
 
40
- # ===== GENERATION FUNCTION =====
41
  def generate_image(prompt):
42
  if not prompt.strip():
43
  return None, "⚠️ Please enter a prompt"
44
 
45
- try:
46
- load_model()
47
-
48
- result = pipe(
49
- prompt=prompt,
50
- output_type="pil",
51
- generator=torch.Generator(device="cuda").manual_seed(42),
52
- num_inference_steps=30,
53
- guidance_scale=7.0
 
 
 
 
 
54
  )
55
-
56
- return add_watermark(result.images[0]), "✔️ Generation successful"
57
- except torch.cuda.OutOfMemoryError:
58
- return None, "⚠️ Out of memory - Try a simpler prompt"
59
- except Exception as e:
60
- return None, f"⚠️ Error: {str(e)[:200]}"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
61
 
62
  # ===== GRADIO INTERFACE =====
63
- with gr.Blocks(title="SelamGPT Pro") as demo:
64
  gr.Markdown("""
65
- # 🎨 SelamGPT (DeepFloyd IF-II-L)
66
- *Free Tier Optimized - May take 2-3 minutes for first generation*
67
  """)
68
 
69
  with gr.Row():
70
- with gr.Column():
71
  prompt_input = gr.Textbox(
72
  label="Describe your image",
73
- placeholder="A traditional Ethiopian market scene...",
74
- lines=3
 
75
  )
76
- generate_btn = gr.Button("Generate", variant="primary")
 
 
77
 
78
  gr.Examples(
79
  examples=[
80
- ["Habesha cultural dress with gold embroidery, studio lighting"],
81
- ["Lalibela churches at sunrise, foggy morning"],
82
- ["Futuristic Addis Ababa with Ethiopian architecture"]
83
  ],
84
  inputs=prompt_input
85
  )
86
 
87
- with gr.Column():
88
  output_image = gr.Image(
89
  label="Generated Image",
90
  type="pil",
91
- format="webp",
92
- height=400
93
  )
94
  status_output = gr.Textbox(
95
  label="Status",
@@ -99,11 +137,15 @@ with gr.Blocks(title="SelamGPT Pro") as demo:
99
  generate_btn.click(
100
  fn=generate_image,
101
  inputs=prompt_input,
 
 
 
 
 
 
102
  outputs=[output_image, status_output]
103
  )
104
 
105
  if __name__ == "__main__":
106
- demo.launch(
107
- server_name="0.0.0.0",
108
- server_port=7860
109
- )
 
1
  import os
2
+ import requests
3
  import gradio as gr
 
4
  from PIL import Image, ImageDraw, ImageFont
5
+ import io
6
+ import time
7
+ from concurrent.futures import ThreadPoolExecutor
8
 
9
+ # ===== CONFIGURATION =====
10
+ HF_API_TOKEN = os.environ.get("HF_API_TOKEN")
11
+ MODEL_NAME = "stabilityai/stable-diffusion-xl-base-1.0"
12
+ API_URL = f"https://api-inference.huggingface.co/models/{MODEL_NAME}"
13
+ headers = {"Authorization": f"Bearer {HF_API_TOKEN}"}
14
  WATERMARK_TEXT = "SelamGPT"
15
+ MAX_RETRIES = 3
16
+ TIMEOUT = 60
17
+ EXECUTOR = ThreadPoolExecutor(max_workers=2)
18
 
19
+ # ===== WATERMARK FUNCTION =====
20
+ def add_watermark(image_bytes):
21
+ """Add watermark with optimized PNG output"""
 
 
 
 
 
 
 
 
 
 
 
 
22
  try:
23
+ image = Image.open(io.BytesIO(image_bytes)).convert("RGB")
24
  draw = ImageDraw.Draw(image)
25
+
26
+ font_size = 24
27
+ try:
28
+ font = ImageFont.truetype("Roboto-Bold.ttf", font_size)
29
+ except:
30
+ font = ImageFont.load_default(font_size)
31
+
32
  text_width = draw.textlength(WATERMARK_TEXT, font=font)
33
+ x = image.width - text_width - 10
34
+ y = image.height - 34
35
+
36
+ draw.text((x+1, y+1), WATERMARK_TEXT, font=font, fill=(0, 0, 0, 128))
37
+ draw.text((x, y), WATERMARK_TEXT, font=font, fill=(255, 255, 255))
38
+
39
+ # Convert to optimized PNG
40
+ img_byte_arr = io.BytesIO()
41
+ image.save(img_byte_arr, format='PNG', optimize=True, quality=85)
42
+ img_byte_arr.seek(0)
43
+ return Image.open(img_byte_arr)
44
+ except Exception as e:
45
+ print(f"Watermark error: {str(e)}")
46
+ return Image.open(io.BytesIO(image_bytes))
47
 
48
+ # ===== IMAGE GENERATION =====
49
  def generate_image(prompt):
50
  if not prompt.strip():
51
  return None, "⚠️ Please enter a prompt"
52
 
53
+ def api_call():
54
+ return requests.post(
55
+ API_URL,
56
+ headers=headers,
57
+ json={
58
+ "inputs": prompt,
59
+ "parameters": {
60
+ "height": 1024,
61
+ "width": 1024,
62
+ "num_inference_steps": 30
63
+ },
64
+ "options": {"wait_for_model": True}
65
+ },
66
+ timeout=TIMEOUT
67
  )
68
+
69
+ for attempt in range(MAX_RETRIES):
70
+ try:
71
+ future = EXECUTOR.submit(api_call)
72
+ response = future.result()
73
+
74
+ if response.status_code == 200:
75
+ return add_watermark(response.content), "✔️ Generation successful"
76
+ elif response.status_code == 503:
77
+ wait_time = (attempt + 1) * 15
78
+ print(f"Model loading, waiting {wait_time}s...")
79
+ time.sleep(wait_time)
80
+ continue
81
+ else:
82
+ return None, f"⚠️ API Error: {response.text[:200]}"
83
+ except requests.Timeout:
84
+ return None, f"⚠️ Timeout: Model took >{TIMEOUT}s to respond"
85
+ except Exception as e:
86
+ return None, f"⚠️ Unexpected error: {str(e)[:200]}"
87
+
88
+ return None, "⚠️ Failed after multiple attempts. Please try later."
89
+
90
+ # ===== GRADIO THEME =====
91
+ theme = gr.themes.Default(
92
+ primary_hue="emerald",
93
+ secondary_hue="amber",
94
+ font=[gr.themes.GoogleFont("Poppins"), "Arial", "sans-serif"]
95
+ )
96
 
97
  # ===== GRADIO INTERFACE =====
98
+ with gr.Blocks(theme=theme, title="SelamGPT Image Generator") as demo:
99
  gr.Markdown("""
100
+ # 🎨 SelamGPT Image Generator
101
+ *Powered by Stable Diffusion XL (1024x1024 PNG output)*
102
  """)
103
 
104
  with gr.Row():
105
+ with gr.Column(scale=3):
106
  prompt_input = gr.Textbox(
107
  label="Describe your image",
108
+ placeholder="A futuristic Ethiopian city with flying cars...",
109
+ lines=3,
110
+ max_lines=5
111
  )
112
+ with gr.Row():
113
+ generate_btn = gr.Button("Generate Image", variant="primary")
114
+ clear_btn = gr.Button("Clear")
115
 
116
  gr.Examples(
117
  examples=[
118
+ ["An ancient Aksumite warrior in cyberpunk armor, 4k detailed"],
119
+ ["Traditional Ethiopian coffee ceremony in zero gravity"],
120
+ ["Portrait of a Habesha queen with golden jewelry"]
121
  ],
122
  inputs=prompt_input
123
  )
124
 
125
+ with gr.Column(scale=2):
126
  output_image = gr.Image(
127
  label="Generated Image",
128
  type="pil",
129
+ format="png",
130
+ height=512
131
  )
132
  status_output = gr.Textbox(
133
  label="Status",
 
137
  generate_btn.click(
138
  fn=generate_image,
139
  inputs=prompt_input,
140
+ outputs=[output_image, status_output],
141
+ queue=True
142
+ )
143
+
144
+ clear_btn.click(
145
+ fn=lambda: [None, ""],
146
  outputs=[output_image, status_output]
147
  )
148
 
149
  if __name__ == "__main__":
150
+ demo.queue(max_size=2)
151
+ demo.launch(server_name="0.0.0.0", server_port=7860)