Spaces:
Paused
Paused
shweaung
commited on
Update app.py
Browse files
app.py
CHANGED
@@ -1,4 +1,4 @@
|
|
1 |
-
#
|
2 |
import gradio as gr
|
3 |
import asyncio
|
4 |
import fal_client
|
@@ -8,146 +8,226 @@ from io import BytesIO
|
|
8 |
import time
|
9 |
import base64
|
10 |
import json
|
|
|
|
|
11 |
import os
|
12 |
from dotenv import load_dotenv
|
13 |
|
14 |
-
# Load environment variables
|
15 |
load_dotenv()
|
16 |
FAL_KEY = os.getenv("FAL_KEY")
|
17 |
|
18 |
with open("examples/examples.json") as f:
|
19 |
examples = json.load(f)
|
20 |
|
21 |
-
#
|
22 |
-
PREDEFINED_USERNAME = "wl@ai"
|
23 |
-
PREDEFINED_PASSWORD = "mk@653"
|
24 |
-
|
25 |
-
# Global variable to store login status
|
26 |
-
user_logged_in = False
|
27 |
-
|
28 |
-
# Functions for each workflow (as in the initial code)
|
29 |
async def submit_ic_light_bria(image_data, positive_prompt, negative_prompt, lightsource_start_color, lightsource_end_color):
|
30 |
-
|
31 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
32 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
33 |
async def submit_sdxl_rembg(image_data, positive_prompt, negative_prompt):
|
34 |
-
|
35 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
36 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
37 |
async def submit_sv3d(image_data, fps, loop_frames_count, gif_loop):
|
38 |
-
|
39 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
40 |
|
41 |
def convert_image_to_base64(image):
|
42 |
buffered = BytesIO()
|
43 |
image.save(buffered, format="PNG")
|
44 |
return "data:image/png;base64," + base64.b64encode(buffered.getvalue()).decode()
|
45 |
|
46 |
-
# Synchronous wrapper functions
|
47 |
def submit_sync_ic_light_bria(image_upload, positive_prompt, negative_prompt, lightsource_start_color, lightsource_end_color):
|
48 |
-
|
49 |
-
|
50 |
|
51 |
def submit_sync_sdxl_rembg(image_upload, positive_prompt, negative_prompt):
|
52 |
-
|
53 |
-
|
54 |
|
55 |
def submit_sync_sv3d(image_upload, fps, loop_frames_count, gif_loop):
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
# Login validation function
|
60 |
-
def validate_login(username, password):
|
61 |
-
global user_logged_in
|
62 |
-
if username == PREDEFINED_USERNAME and password == PREDEFINED_PASSWORD:
|
63 |
-
user_logged_in = True
|
64 |
-
return "Login successful! Welcome."
|
65 |
-
else:
|
66 |
-
return "Invalid username or password. Please try again."
|
67 |
-
|
68 |
-
# Main app interface function
|
69 |
def run_gradio_app():
|
70 |
with gr.Blocks() as demo:
|
71 |
-
|
72 |
-
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
-
|
81 |
-
|
82 |
-
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
|
91 |
-
|
92 |
-
|
93 |
-
|
94 |
-
|
95 |
-
|
96 |
-
|
97 |
-
|
98 |
-
|
99 |
-
|
100 |
-
|
101 |
-
|
102 |
-
|
103 |
-
|
104 |
-
|
105 |
-
|
106 |
-
|
107 |
-
|
108 |
-
|
109 |
-
|
110 |
-
|
111 |
-
|
112 |
-
|
113 |
-
|
114 |
-
|
115 |
-
|
116 |
-
|
117 |
-
|
118 |
-
|
119 |
-
|
120 |
-
|
121 |
-
workflow.change(fn=update_ui, inputs=workflow, outputs=[positive_prompt, negative_prompt, lightsource_start_color, lightsource_end_color, fps, loop_frames_count, gif_loop])
|
122 |
-
|
123 |
-
# Submission function
|
124 |
-
def on_submit(image_upload, positive_prompt, negative_prompt, lightsource_start_color, lightsource_end_color, fps, loop_frames_count, gif_loop, workflow):
|
125 |
-
# Submission logic here (unchanged)
|
126 |
-
pass
|
127 |
-
|
128 |
-
submit_btn.click(
|
129 |
-
fn=on_submit,
|
130 |
-
inputs=[image_upload, positive_prompt, negative_prompt, lightsource_start_color, lightsource_end_color, fps, loop_frames_count, gif_loop, workflow],
|
131 |
-
outputs=[output_logs, output_result]
|
132 |
-
)
|
133 |
-
|
134 |
-
# Add examples for demonstration
|
135 |
-
gr.Examples(
|
136 |
-
examples=[
|
137 |
-
# Example entries here
|
138 |
-
],
|
139 |
-
inputs=[image_upload, positive_prompt, negative_prompt, lightsource_start_color, lightsource_end_color, fps, loop_frames_count, gif_loop, workflow],
|
140 |
-
outputs=[output_logs, output_result],
|
141 |
-
fn=on_submit,
|
142 |
-
cache_examples=True
|
143 |
-
)
|
144 |
|
145 |
-
|
146 |
-
|
147 |
-
|
148 |
-
|
149 |
-
|
150 |
-
|
|
|
|
|
|
|
151 |
)
|
152 |
|
153 |
demo.launch()
|
|
|
1 |
+
# HF Spaces
|
2 |
import gradio as gr
|
3 |
import asyncio
|
4 |
import fal_client
|
|
|
8 |
import time
|
9 |
import base64
|
10 |
import json
|
11 |
+
|
12 |
+
# Local Dev
|
13 |
import os
|
14 |
from dotenv import load_dotenv
|
15 |
|
|
|
16 |
load_dotenv()
|
17 |
FAL_KEY = os.getenv("FAL_KEY")
|
18 |
|
19 |
with open("examples/examples.json") as f:
|
20 |
examples = json.load(f)
|
21 |
|
22 |
+
# IC Light, Replace Background
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
23 |
async def submit_ic_light_bria(image_data, positive_prompt, negative_prompt, lightsource_start_color, lightsource_end_color):
|
24 |
+
if not lightsource_start_color.startswith("#"):
|
25 |
+
lightsource_start_color = f"#{lightsource_start_color}"
|
26 |
+
if not lightsource_end_color.startswith("#"):
|
27 |
+
lightsource_end_color = f"#{lightsource_end_color}"
|
28 |
+
|
29 |
+
retries = 3
|
30 |
+
for attempt in range(retries):
|
31 |
+
try:
|
32 |
+
handler = await fal_client.submit_async(
|
33 |
+
"comfy/martintmv-git/ic-light-bria",
|
34 |
+
arguments={
|
35 |
+
"loadimage_1": image_data,
|
36 |
+
"Positive Prompt": positive_prompt,
|
37 |
+
"Negative Prompt": negative_prompt,
|
38 |
+
"lightsource_start_color": lightsource_start_color,
|
39 |
+
"lightsource_end_color": lightsource_end_color
|
40 |
+
},
|
41 |
+
)
|
42 |
|
43 |
+
log_index = 0
|
44 |
+
output_logs = []
|
45 |
+
async for event in handler.iter_events(with_logs=True):
|
46 |
+
if isinstance(event, fal_client.InProgress):
|
47 |
+
if event.logs:
|
48 |
+
new_logs = event.logs[log_index:]
|
49 |
+
for log in new_logs:
|
50 |
+
output_logs.append(log["message"])
|
51 |
+
log_index = len(event.logs)
|
52 |
+
|
53 |
+
result = await handler.get()
|
54 |
+
output_logs.append("Processing completed")
|
55 |
+
|
56 |
+
# Debug log
|
57 |
+
print("API Result:", result)
|
58 |
+
|
59 |
+
# Extract the image URL
|
60 |
+
image_url = result["outputs"]["9"]["images"][0]["url"]
|
61 |
+
response = requests.get(image_url)
|
62 |
+
image = Image.open(BytesIO(response.content))
|
63 |
+
return output_logs, image
|
64 |
+
except Exception as e:
|
65 |
+
print(f"Attempt {attempt + 1} failed: {e}")
|
66 |
+
if attempt < retries - 1:
|
67 |
+
time.sleep(2) # HTTP req retry mechanism
|
68 |
+
else:
|
69 |
+
return [f"Error: {str(e)}"], None
|
70 |
+
|
71 |
+
# SDXL, Depth Anything, Replace Background
|
72 |
async def submit_sdxl_rembg(image_data, positive_prompt, negative_prompt):
|
73 |
+
retries = 3
|
74 |
+
for attempt in range(retries):
|
75 |
+
try:
|
76 |
+
handler = await fal_client.submit_async(
|
77 |
+
"comfy/martintmv-git/sdxl-depthanything-rembg",
|
78 |
+
arguments={
|
79 |
+
"loadimage_1": image_data,
|
80 |
+
"Positive prompt": positive_prompt,
|
81 |
+
"Negative prompt": negative_prompt
|
82 |
+
},
|
83 |
+
)
|
84 |
|
85 |
+
log_index = 0
|
86 |
+
output_logs = []
|
87 |
+
async for event in handler.iter_events(with_logs=True):
|
88 |
+
if isinstance(event, fal_client.InProgress):
|
89 |
+
if event.logs:
|
90 |
+
new_logs = event.logs[log_index:]
|
91 |
+
for log in new_logs:
|
92 |
+
output_logs.append(log["message"])
|
93 |
+
log_index = len(event.logs)
|
94 |
+
|
95 |
+
result = await handler.get()
|
96 |
+
output_logs.append("Processing completed")
|
97 |
+
|
98 |
+
# Debug log
|
99 |
+
print("API Result:", result)
|
100 |
+
|
101 |
+
# Extract the image URL
|
102 |
+
image_url = result["outputs"]["9"]["images"][0]["url"]
|
103 |
+
response = requests.get(image_url)
|
104 |
+
image = Image.open(BytesIO(response.content))
|
105 |
+
return output_logs, image
|
106 |
+
except Exception as e:
|
107 |
+
print(f"Attempt {attempt + 1} failed: {e}")
|
108 |
+
if attempt < retries - 1:
|
109 |
+
time.sleep(2) # HTTP req retry mechanism
|
110 |
+
else:
|
111 |
+
return [f"Error: {str(e)}"], None
|
112 |
+
|
113 |
+
# SV3D, AnimateDiff
|
114 |
async def submit_sv3d(image_data, fps, loop_frames_count, gif_loop):
|
115 |
+
retries = 3
|
116 |
+
for attempt in range(retries):
|
117 |
+
try:
|
118 |
+
handler = await fal_client.submit_async(
|
119 |
+
"comfy/martintmv-git/sv3d",
|
120 |
+
arguments={
|
121 |
+
"loadimage_1": image_data,
|
122 |
+
"FPS (bigger number = more speed)": fps,
|
123 |
+
"Loop Frames Count": loop_frames_count,
|
124 |
+
"GIF Loop": gif_loop
|
125 |
+
},
|
126 |
+
)
|
127 |
+
|
128 |
+
log_index = 0
|
129 |
+
output_logs = []
|
130 |
+
async for event in handler.iter_events(with_logs=True):
|
131 |
+
if isinstance(event, fal_client.InProgress):
|
132 |
+
if event.logs:
|
133 |
+
new_logs = event.logs[log_index:]
|
134 |
+
for log in new_logs:
|
135 |
+
output_logs.append(log["message"])
|
136 |
+
log_index = len(event.logs)
|
137 |
+
|
138 |
+
result = await handler.get()
|
139 |
+
output_logs.append("Processing completed")
|
140 |
+
|
141 |
+
print("API Result:", result)
|
142 |
+
|
143 |
+
gif_url = result["outputs"]["15"]["gifs"][0]["url"]
|
144 |
+
return output_logs, gif_url
|
145 |
+
except Exception as e:
|
146 |
+
print(f"Attempt {attempt + 1} failed: {e}")
|
147 |
+
if attempt < retries - 1:
|
148 |
+
time.sleep(2)
|
149 |
+
else:
|
150 |
+
return [f"Error: {str(e)}"], None
|
151 |
|
152 |
def convert_image_to_base64(image):
|
153 |
buffered = BytesIO()
|
154 |
image.save(buffered, format="PNG")
|
155 |
return "data:image/png;base64," + base64.b64encode(buffered.getvalue()).decode()
|
156 |
|
|
|
157 |
def submit_sync_ic_light_bria(image_upload, positive_prompt, negative_prompt, lightsource_start_color, lightsource_end_color):
|
158 |
+
image_data = convert_image_to_base64(Image.open(image_upload))
|
159 |
+
return asyncio.run(submit_ic_light_bria(image_data, positive_prompt, negative_prompt, lightsource_start_color, lightsource_end_color))
|
160 |
|
161 |
def submit_sync_sdxl_rembg(image_upload, positive_prompt, negative_prompt):
|
162 |
+
image_data = convert_image_to_base64(Image.open(image_upload))
|
163 |
+
return asyncio.run(submit_sdxl_rembg(image_data, positive_prompt, negative_prompt))
|
164 |
|
165 |
def submit_sync_sv3d(image_upload, fps, loop_frames_count, gif_loop):
|
166 |
+
image_data = convert_image_to_base64(Image.open(image_upload))
|
167 |
+
return asyncio.run(submit_sv3d(image_data, fps, loop_frames_count, gif_loop))
|
168 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
169 |
def run_gradio_app():
|
170 |
with gr.Blocks() as demo:
|
171 |
+
gr.Markdown("Walone AI Product Photo")
|
172 |
+
gr.Markdown("Product ကြော်ငြာပုံ AI")
|
173 |
+
gr.Markdown("####Infinity Tech")
|
174 |
+
gr.Markdown("#### Support the project:")
|
175 |
+
|
176 |
+
|
177 |
+
|
178 |
+
with gr.Row():
|
179 |
+
with gr.Column(scale=1):
|
180 |
+
workflow = gr.Dropdown(label="Select Workflow", choices=["IC Light, Replace Background", "SDXL, Depth Anything, Replace Background", "SV3D"], value="IC Light, Replace Background")
|
181 |
+
image_upload = gr.Image(label="Upload Image", type="filepath")
|
182 |
+
positive_prompt = gr.Textbox(label="Positive Prompt", visible=True)
|
183 |
+
negative_prompt = gr.Textbox(label="Negative Prompt", value="Watermark", visible=True)
|
184 |
+
lightsource_start_color = gr.ColorPicker(label="Start Color", value="#FFFFFF", visible=True)
|
185 |
+
lightsource_end_color = gr.ColorPicker(label="End Color", value="#000000", visible=True)
|
186 |
+
fps = gr.Slider(label="FPS (bigger number = more speed)", minimum=1, maximum=60, step=1, value=8, visible=False)
|
187 |
+
loop_frames_count = gr.Slider(label="Loop Frames Count", minimum=1, maximum=100, step=1, value=30, visible=False)
|
188 |
+
gif_loop = gr.Checkbox(label="GIF Loop", value=True, visible=False)
|
189 |
+
submit_btn = gr.Button("Submit")
|
190 |
+
|
191 |
+
with gr.Column(scale=2):
|
192 |
+
output_logs = gr.Textbox(label="Logs")
|
193 |
+
output_result = gr.Image(label="Result")
|
194 |
+
|
195 |
+
def update_ui(workflow):
|
196 |
+
if workflow == "IC Light, Replace Background":
|
197 |
+
return [gr.update(visible=True), gr.update(visible=True), gr.update(visible=True), gr.update(visible=True), gr.update(visible=False), gr.update(visible=False), gr.update(visible=False)]
|
198 |
+
elif workflow == "SDXL, Depth Anything, Replace Background":
|
199 |
+
return [gr.update(visible=True), gr.update(visible=True), gr.update(visible=False), gr.update(visible=False), gr.update(visible=False), gr.update(visible=False), gr.update(visible=False)]
|
200 |
+
elif workflow == "SV3D":
|
201 |
+
return [gr.update(visible=False), gr.update(visible=False), gr.update(visible=False), gr.update(visible=False), gr.update(visible=True), gr.update(visible=True), gr.update(visible=True)]
|
202 |
+
|
203 |
+
workflow.change(fn=update_ui, inputs=workflow, outputs=[positive_prompt, negative_prompt, lightsource_start_color, lightsource_end_color, fps, loop_frames_count, gif_loop])
|
204 |
+
|
205 |
+
def on_submit(image_upload, positive_prompt, negative_prompt, lightsource_start_color, lightsource_end_color, fps, loop_frames_count, gif_loop, workflow):
|
206 |
+
if workflow == "IC Light, Replace Background":
|
207 |
+
logs, image = submit_sync_ic_light_bria(image_upload, positive_prompt, negative_prompt, lightsource_start_color, lightsource_end_color)
|
208 |
+
return logs, image
|
209 |
+
elif workflow == "SDXL, Depth Anything, Replace Background":
|
210 |
+
logs, image = submit_sync_sdxl_rembg(image_upload, positive_prompt, negative_prompt)
|
211 |
+
return logs, image
|
212 |
+
elif workflow == "SV3D":
|
213 |
+
logs, gif_url = submit_sync_sv3d(image_upload, fps, loop_frames_count, gif_loop)
|
214 |
+
return logs, gif_url
|
215 |
+
|
216 |
+
submit_btn.click(
|
217 |
+
fn=on_submit,
|
218 |
+
inputs=[image_upload, positive_prompt, negative_prompt, lightsource_start_color, lightsource_end_color, fps, loop_frames_count, gif_loop, workflow],
|
219 |
+
outputs=[output_logs, output_result]
|
220 |
+
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
221 |
|
222 |
+
gr.Examples(
|
223 |
+
examples=[
|
224 |
+
[example['input_image'], example['positive_prompt'], example['negative_prompt'], example.get('lightsource_start_color', "#FFFFFF"), example.get('lightsource_end_color', "#000000"), example.get('fps', 8), example.get('loop_frames_count', 30), example.get('gif_loop', True), example['workflow']]
|
225 |
+
for example in examples
|
226 |
+
],
|
227 |
+
inputs=[image_upload, positive_prompt, negative_prompt, lightsource_start_color, lightsource_end_color, fps, loop_frames_count, gif_loop, workflow],
|
228 |
+
outputs=[output_logs, output_result],
|
229 |
+
fn=on_submit,
|
230 |
+
cache_examples=True
|
231 |
)
|
232 |
|
233 |
demo.launch()
|