Spaces:
Runtime error
Runtime error
Update app.py
Browse files
app.py
CHANGED
@@ -1,142 +1,106 @@
|
|
1 |
-
import
|
2 |
-
import
|
|
|
|
|
|
|
|
|
|
|
3 |
import random
|
4 |
-
|
5 |
-
from diffusers import DiffusionPipeline
|
6 |
-
import torch
|
7 |
|
8 |
-
|
9 |
-
model_repo_id = "stabilityai/sdxl-turbo" #Replace to the model you would like to use
|
10 |
|
11 |
-
|
12 |
-
|
13 |
-
|
14 |
-
|
|
|
|
|
15 |
|
16 |
-
|
17 |
-
|
18 |
|
19 |
-
|
20 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
21 |
|
22 |
-
|
23 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
24 |
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
guidance_scale = guidance_scale,
|
34 |
-
num_inference_steps = num_inference_steps,
|
35 |
-
width = width,
|
36 |
-
height = height,
|
37 |
-
generator = generator
|
38 |
-
).images[0]
|
39 |
-
|
40 |
-
return image, seed
|
41 |
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
47 |
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
"""
|
|
|
|
|
|
|
54 |
|
55 |
-
|
56 |
-
|
57 |
-
with gr.Column(elem_id="col-container"):
|
58 |
-
gr.Markdown(f"""
|
59 |
-
# Text-to-Image Gradio Template
|
60 |
-
""")
|
61 |
-
|
62 |
-
with gr.Row():
|
63 |
-
|
64 |
-
prompt = gr.Text(
|
65 |
-
label="Prompt",
|
66 |
-
show_label=False,
|
67 |
-
max_lines=1,
|
68 |
-
placeholder="Enter your prompt",
|
69 |
-
container=False,
|
70 |
-
)
|
71 |
-
|
72 |
-
run_button = gr.Button("Run", scale=0)
|
73 |
-
|
74 |
-
result = gr.Image(label="Result", show_label=False)
|
75 |
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
-
|
81 |
-
|
82 |
-
|
83 |
-
|
84 |
-
|
85 |
-
seed = gr.Slider(
|
86 |
-
label="Seed",
|
87 |
-
minimum=0,
|
88 |
-
maximum=MAX_SEED,
|
89 |
-
step=1,
|
90 |
-
value=0,
|
91 |
-
)
|
92 |
-
|
93 |
-
randomize_seed = gr.Checkbox(label="Randomize seed", value=True)
|
94 |
-
|
95 |
-
with gr.Row():
|
96 |
-
|
97 |
-
width = gr.Slider(
|
98 |
-
label="Width",
|
99 |
-
minimum=256,
|
100 |
-
maximum=MAX_IMAGE_SIZE,
|
101 |
-
step=32,
|
102 |
-
value=1024, #Replace with defaults that work for your model
|
103 |
-
)
|
104 |
-
|
105 |
-
height = gr.Slider(
|
106 |
-
label="Height",
|
107 |
-
minimum=256,
|
108 |
-
maximum=MAX_IMAGE_SIZE,
|
109 |
-
step=32,
|
110 |
-
value=1024, #Replace with defaults that work for your model
|
111 |
-
)
|
112 |
-
|
113 |
-
with gr.Row():
|
114 |
-
|
115 |
-
guidance_scale = gr.Slider(
|
116 |
-
label="Guidance scale",
|
117 |
-
minimum=0.0,
|
118 |
-
maximum=10.0,
|
119 |
-
step=0.1,
|
120 |
-
value=0.0, #Replace with defaults that work for your model
|
121 |
-
)
|
122 |
-
|
123 |
-
num_inference_steps = gr.Slider(
|
124 |
-
label="Number of inference steps",
|
125 |
-
minimum=1,
|
126 |
-
maximum=50,
|
127 |
-
step=1,
|
128 |
-
value=2, #Replace with defaults that work for your model
|
129 |
-
)
|
130 |
-
|
131 |
-
gr.Examples(
|
132 |
-
examples = examples,
|
133 |
-
inputs = [prompt]
|
134 |
-
)
|
135 |
-
gr.on(
|
136 |
-
triggers=[run_button.click, prompt.submit],
|
137 |
-
fn = infer,
|
138 |
-
inputs = [prompt, negative_prompt, seed, randomize_seed, width, height, guidance_scale, num_inference_steps],
|
139 |
-
outputs = [result, seed]
|
140 |
-
)
|
141 |
|
142 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from flask import Flask, request, jsonify
|
2 |
+
import aiohttp
|
3 |
+
import asyncio
|
4 |
+
import io
|
5 |
+
import cloudinary
|
6 |
+
import cloudinary.uploader
|
7 |
+
import cloudinary.api
|
8 |
import random
|
9 |
+
import os
|
|
|
|
|
10 |
|
11 |
+
app = Flask(__name__)
|
|
|
12 |
|
13 |
+
# Configure Cloudinary
|
14 |
+
cloudinary.config(
|
15 |
+
cloud_name='dpnixluze',
|
16 |
+
api_key='417356221754679',
|
17 |
+
api_secret='MjsdHI-8vvYg-yF8p5__aK_8OYs'
|
18 |
+
)
|
19 |
|
20 |
+
API_URL = "https://api-inference.huggingface.co/models/stabilityai/stable-diffusion-xl-base-1.0"
|
21 |
+
HEADERS = {"Authorization": "Bearer "}
|
22 |
|
23 |
+
async def query(session, payload):
|
24 |
+
try:
|
25 |
+
async with session.post(API_URL, headers=HEADERS, json=payload) as response:
|
26 |
+
response.raise_for_status()
|
27 |
+
return await response.read()
|
28 |
+
except aiohttp.ClientError as e:
|
29 |
+
print(f"Error during API request: {e}")
|
30 |
+
return None
|
31 |
|
32 |
+
async def retry_query(payload, retries=5, delay=30):
|
33 |
+
async with aiohttp.ClientSession() as session:
|
34 |
+
for i in range(retries):
|
35 |
+
image_bytes = await query(session, payload)
|
36 |
+
if image_bytes:
|
37 |
+
return image_bytes
|
38 |
+
print(f"Retrying ({i + 1}/{retries})...")
|
39 |
+
await asyncio.sleep(delay)
|
40 |
+
return None
|
41 |
|
42 |
+
@app.route('/generate-image', methods=['POST'])
|
43 |
+
async def generate_image():
|
44 |
+
try:
|
45 |
+
data = request.json # This is synchronous
|
46 |
+
positive_prompt = data.get('positive_prompt', 'emma stone')
|
47 |
+
negative_prompt = data.get('negative_prompt', '[deformed | disfigured] , poorly drawn, [bad : wrong] anatomy, [extra | missing | floating | disconnected] limb, (mutated hands and fingers) , blurry,clothes, bad lighting, low-quality, deformed, text, poorly drawn, holding camera, bad art, bad angle, boring, low-resolution, worst quality, bad composition, disfigured')
|
48 |
+
style = data.get('style','');
|
49 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
50 |
|
51 |
+
if style == "cinematic":
|
52 |
+
style = "cinematic shot, dynamic lighting, 75mm, Technicolor, Panavision, cinemascope, sharp focus, fine details, 8k, HDR, realism, realistic, key visual, film still, superb cinematic color grading, depth of field"
|
53 |
+
elif style == "realistic":
|
54 |
+
style = "realistic style, natural lighting, true-to-life details, high resolution, sharp focus, fine textures, authentic colors, accurate proportions, high dynamic range, clear and photorealistic"
|
55 |
+
elif style == "sci-fi":
|
56 |
+
style = "sci-fi style, futuristic technology, cyberpunk cityscape, neon lights, advanced robotics, alien landscapes, holographic interfaces, space exploration, dystopian themes, high-tech machinery"
|
57 |
+
elif style == "disney":
|
58 |
+
style = "3d, Disney character style, animated, cartoonish, whimsical, colorful, playful, charming, magical, fantastical, cute, endearing, family-friendly, storybook quality, iconic, expressive, vibrant colors, smooth lines, simple shapes, happy and adventurous"
|
59 |
+
else:
|
60 |
+
style = "fantasy style, magical landscapes, mythical creatures, enchanted forests, fairy tale elements, mystical realms, legendary beings, glowing effects, ethereal atmosphere, magical artifacts, ancient ruins"
|
61 |
+
|
62 |
+
seed = random.randint(0, 10000)
|
63 |
|
64 |
+
payload = {
|
65 |
+
"inputs": f"{positive_prompt}, {style}",
|
66 |
+
"negative_prompt": negative_prompt,
|
67 |
+
"options": {
|
68 |
+
"resolution": "4096×2160",
|
69 |
+
"quality": "high",
|
70 |
+
"seed": seed
|
71 |
+
}
|
72 |
+
}
|
73 |
|
74 |
+
image_urls = []
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
75 |
|
76 |
+
for image_count in range(1): # Generate 3 images
|
77 |
+
# Retry mechanism with error handling
|
78 |
+
for attempt in range(3): # Try up to 3 times per image
|
79 |
+
image_bytes = await retry_query(payload)
|
80 |
+
if image_bytes:
|
81 |
+
try:
|
82 |
+
# Upload image to Cloudinary
|
83 |
+
upload_response = cloudinary.uploader.upload(io.BytesIO(image_bytes), resource_type="image")
|
84 |
+
cloudinary_url = upload_response.get('secure_url')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
85 |
|
86 |
+
if cloudinary_url:
|
87 |
+
image_urls.append(cloudinary_url)
|
88 |
+
break # Break out of retry loop for this image
|
89 |
+
else:
|
90 |
+
raise Exception('Failed to upload image to Cloudinary.')
|
91 |
+
except Exception as upload_exception:
|
92 |
+
print(f"Upload attempt {attempt + 1} failed: {upload_exception}")
|
93 |
+
else:
|
94 |
+
print(f"Image generation attempt {attempt + 1} failed")
|
95 |
+
|
96 |
+
if image_urls:
|
97 |
+
return jsonify({'image_urls': image_urls})
|
98 |
+
else:
|
99 |
+
return jsonify({'error': 'Failed to generate and upload images after multiple attempts.'}), 500
|
100 |
+
|
101 |
+
except Exception as e:
|
102 |
+
print(f"Exception occurred: {e}")
|
103 |
+
return jsonify({'error': 'An unexpected error occurred.'}), 500
|
104 |
+
|
105 |
+
if __name__ == '__main__':
|
106 |
+
app.run(debug=True)
|