shweaung commited on
Commit
6a82ec7
·
verified ·
1 Parent(s): d5a3f62

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +193 -113
app.py CHANGED
@@ -1,4 +1,4 @@
1
- # Import necessary modules
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
- # Define the predefined username and password
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
- # Function logic here (unchanged)
31
- pass
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
32
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
33
  async def submit_sdxl_rembg(image_data, positive_prompt, negative_prompt):
34
- # Function logic here (unchanged)
35
- pass
 
 
 
 
 
 
 
 
 
36
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
37
  async def submit_sv3d(image_data, fps, loop_frames_count, gif_loop):
38
- # Function logic here (unchanged)
39
- pass
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
- # Function logic here (unchanged)
49
- pass
50
 
51
  def submit_sync_sdxl_rembg(image_upload, positive_prompt, negative_prompt):
52
- # Function logic here (unchanged)
53
- pass
54
 
55
  def submit_sync_sv3d(image_upload, fps, loop_frames_count, gif_loop):
56
- # Function logic here (unchanged)
57
- pass
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
- # Login Interface
72
- login_status = gr.State(value=False)
73
- with gr.Tab("Login"):
74
- gr.Markdown("### Please Log In")
75
- username = gr.Textbox(label="Username")
76
- password = gr.Textbox(label="Password", type="password")
77
- login_button = gr.Button("Log In")
78
- login_message = gr.Textbox(label="Login Message", interactive=False)
79
-
80
- def login_click(username, password):
81
- message = validate_login(username, password)
82
- if user_logged_in:
83
- login_status.set_value(True) # Set login status to True
84
- return message
85
-
86
- login_button.click(
87
- fn=login_click,
88
- inputs=[username, password],
89
- outputs=login_message
90
- )
91
-
92
- # Main Application Interface (only if logged in)
93
- with gr.Tab("App") as app_tab:
94
- gr.Markdown("# Comfy Anything 🐈")
95
- gr.Markdown("### Community ComfyUI workflows running on [fal.ai](https://fal.ai)")
96
- gr.Markdown("#### Support the project:")
97
- gr.Markdown("🧡 Bitcoin address - bc1qs3q0rjpr9fvn9knjy5aktfr8w5duvvjpezkgt9")
98
-
99
- with gr.Row():
100
- with gr.Column(scale=1):
101
- workflow = gr.Dropdown(label="Select Workflow", choices=["IC Light, Replace Background", "SDXL, Depth Anything, Replace Background", "SV3D"], value="IC Light, Replace Background")
102
- image_upload = gr.Image(label="Upload Image", type="filepath")
103
- positive_prompt = gr.Textbox(label="Positive Prompt", visible=True)
104
- negative_prompt = gr.Textbox(label="Negative Prompt", value="Watermark", visible=True)
105
- lightsource_start_color = gr.ColorPicker(label="Start Color", value="#FFFFFF", visible=True)
106
- lightsource_end_color = gr.ColorPicker(label="End Color", value="#000000", visible=True)
107
- fps = gr.Slider(label="FPS (bigger number = more speed)", minimum=1, maximum=60, step=1, value=8, visible=False)
108
- loop_frames_count = gr.Slider(label="Loop Frames Count", minimum=1, maximum=100, step=1, value=30, visible=False)
109
- gif_loop = gr.Checkbox(label="GIF Loop", value=True, visible=False)
110
- submit_btn = gr.Button("Submit")
111
-
112
- with gr.Column(scale=2):
113
- output_logs = gr.Textbox(label="Logs")
114
- output_result = gr.Image(label="Result")
115
-
116
- # Workflow selection and UI update function
117
- def update_ui(workflow):
118
- # UI updating logic here (unchanged)
119
- pass
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
- # Conditional display of the main application tab based on login status
146
- demo.load(
147
- fn=lambda: login_status.get_value(),
148
- inputs=[],
149
- outputs=[app_tab],
150
- _js="(status) => { return status; }"
 
 
 
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()