MetricMogul commited on
Commit
aee5e75
·
verified ·
1 Parent(s): fc5d0c2

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +257 -0
app.py ADDED
@@ -0,0 +1,257 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+
3
+ from canvas_editor import (
4
+ HTML_TEMPLATE,
5
+ CSS_TEMPLATE,
6
+ JS_ON_LOAD,
7
+ payload_append,
8
+ payload_reset,
9
+ empty_canvas_payload,
10
+ )
11
+ from shape_e_service import (
12
+ DEVICE,
13
+ EXAMPLES,
14
+ clear_saved_assets,
15
+ generate_and_add_asset,
16
+ next_view,
17
+ prev_view,
18
+ select_asset,
19
+ selected_view_path,
20
+ set_prompt,
21
+ )
22
+
23
+ CSS = """
24
+ #title-wrap {
25
+ text-align: center;
26
+ margin-bottom: 10px;
27
+ }
28
+ #subtitle {
29
+ color: #9ca3af;
30
+ font-size: 14px;
31
+ }
32
+ #device-badge {
33
+ display: inline-block;
34
+ margin-top: 8px;
35
+ padding: 6px 10px;
36
+ border-radius: 999px;
37
+ background: #111827;
38
+ border: 1px solid #374151;
39
+ font-size: 13px;
40
+ }
41
+ """
42
+
43
+
44
+ def add_selected_view_to_canvas(saved_assets, selected_asset_index):
45
+ path = selected_view_path(saved_assets, selected_asset_index)
46
+ if not path:
47
+ raise gr.Error("Select an asset first.")
48
+ return payload_append([path])
49
+
50
+
51
+ def reset_canvas_with_selected_view(saved_assets, selected_asset_index):
52
+ path = selected_view_path(saved_assets, selected_asset_index)
53
+ if not path:
54
+ raise gr.Error("Select an asset first.")
55
+ return payload_reset([path])
56
+
57
+
58
+ def clear_canvas():
59
+ return empty_canvas_payload()
60
+
61
+
62
+ with gr.Blocks(css=CSS, title="Depthpaint Studio") as demo:
63
+ saved_assets_state = gr.State([])
64
+ selected_asset_index_state = gr.State(None)
65
+
66
+ gr.HTML(
67
+ f"""
68
+ <div id="title-wrap">
69
+ <h1>Depthpaint Studio</h1>
70
+ <div id="subtitle">Generate Shap-E assets, browse their views, then send the selected view into the canvas</div>
71
+ <div id="device-badge">Device: {DEVICE}</div>
72
+ </div>
73
+ """
74
+ )
75
+
76
+ with gr.Tab("Assets"):
77
+ with gr.Row():
78
+ with gr.Column(scale=1):
79
+ prompt = gr.Textbox(
80
+ label="Prompt",
81
+ lines=3,
82
+ value="A fantasy treasure chest with gold trim",
83
+ placeholder="Describe a 3D object...",
84
+ )
85
+
86
+ gr.Markdown("**Prompt ideas**")
87
+ with gr.Row():
88
+ ex1 = gr.Button("Robot")
89
+ ex2 = gr.Button("Treasure chest")
90
+ ex3 = gr.Button("Dragon toy")
91
+ with gr.Row():
92
+ ex4 = gr.Button("Medieval house")
93
+ ex5 = gr.Button("Owl teapot")
94
+ ex6 = gr.Button("Submarine")
95
+
96
+ with gr.Row():
97
+ steps = gr.Slider(
98
+ minimum=8,
99
+ maximum=64,
100
+ step=1,
101
+ value=24 if DEVICE == "cpu" else 32,
102
+ label="Inference steps",
103
+ )
104
+ guidance_scale = gr.Slider(
105
+ minimum=1.0,
106
+ maximum=20.0,
107
+ step=0.5,
108
+ value=12.0,
109
+ label="Guidance scale",
110
+ )
111
+
112
+ with gr.Row():
113
+ frame_size = gr.Slider(
114
+ minimum=64,
115
+ maximum=256,
116
+ step=32,
117
+ value=64 if DEVICE == "cpu" else 256,
118
+ label="Frame size",
119
+ )
120
+ seed = gr.Number(
121
+ label="Seed",
122
+ value=42,
123
+ precision=0,
124
+ )
125
+
126
+ with gr.Row():
127
+ generate_btn = gr.Button("Generate and add to gallery", variant="primary")
128
+ clear_saved_btn = gr.Button("Clear gallery")
129
+
130
+ gr.Markdown(
131
+ "CPU mode is much slower. Start with smaller frame size and fewer steps."
132
+ )
133
+
134
+ with gr.Column(scale=1):
135
+ current_view = gr.Image(label="Selected asset view", type="filepath")
136
+ view_text = gr.Markdown("No asset selected.")
137
+
138
+ with gr.Row():
139
+ prev_btn = gr.Button("← Prev view", interactive=False)
140
+ next_btn = gr.Button("Next view →", interactive=False)
141
+
142
+ with gr.Row():
143
+ add_to_canvas_btn = gr.Button("Add selected view to canvas", variant="primary")
144
+ reset_canvas_btn = gr.Button("Reset canvas with selected view")
145
+
146
+ saved_gallery = gr.Gallery(
147
+ label="Saved assets",
148
+ columns=3,
149
+ height="auto",
150
+ preview=False,
151
+ )
152
+
153
+ with gr.Tab("Canvas"):
154
+ gr.Markdown("## Scene canvas")
155
+ gr.Markdown("Selected asset views can be sent here and placed manually.")
156
+
157
+ editor = gr.HTML(
158
+ value='{"render_id": null, "mode": "append", "items": []}',
159
+ html_template=HTML_TEMPLATE,
160
+ css_template=CSS_TEMPLATE,
161
+ js_on_load=JS_ON_LOAD,
162
+ )
163
+
164
+ clear_canvas_btn = gr.Button("Clear canvas")
165
+
166
+ ex1.click(fn=lambda: set_prompt(EXAMPLES[0]), outputs=prompt)
167
+ ex2.click(fn=lambda: set_prompt(EXAMPLES[1]), outputs=prompt)
168
+ ex3.click(fn=lambda: set_prompt(EXAMPLES[2]), outputs=prompt)
169
+ ex4.click(fn=lambda: set_prompt(EXAMPLES[3]), outputs=prompt)
170
+ ex5.click(fn=lambda: set_prompt(EXAMPLES[4]), outputs=prompt)
171
+ ex6.click(fn=lambda: set_prompt(EXAMPLES[5]), outputs=prompt)
172
+
173
+ generate_btn.click(
174
+ fn=generate_and_add_asset,
175
+ inputs=[prompt, steps, guidance_scale, frame_size, seed, saved_assets_state],
176
+ outputs=[
177
+ saved_assets_state,
178
+ selected_asset_index_state,
179
+ saved_gallery,
180
+ current_view,
181
+ view_text,
182
+ prev_btn,
183
+ next_btn,
184
+ ],
185
+ )
186
+
187
+ saved_gallery.select(
188
+ fn=select_asset,
189
+ inputs=[saved_assets_state],
190
+ outputs=[
191
+ selected_asset_index_state,
192
+ saved_gallery,
193
+ current_view,
194
+ view_text,
195
+ prev_btn,
196
+ next_btn,
197
+ ],
198
+ )
199
+
200
+ prev_btn.click(
201
+ fn=prev_view,
202
+ inputs=[saved_assets_state, selected_asset_index_state],
203
+ outputs=[
204
+ saved_assets_state,
205
+ saved_gallery,
206
+ current_view,
207
+ view_text,
208
+ prev_btn,
209
+ next_btn,
210
+ ],
211
+ )
212
+
213
+ next_btn.click(
214
+ fn=next_view,
215
+ inputs=[saved_assets_state, selected_asset_index_state],
216
+ outputs=[
217
+ saved_assets_state,
218
+ saved_gallery,
219
+ current_view,
220
+ view_text,
221
+ prev_btn,
222
+ next_btn,
223
+ ],
224
+ )
225
+
226
+ clear_saved_btn.click(
227
+ fn=clear_saved_assets,
228
+ outputs=[
229
+ saved_assets_state,
230
+ selected_asset_index_state,
231
+ saved_gallery,
232
+ current_view,
233
+ view_text,
234
+ prev_btn,
235
+ next_btn,
236
+ ],
237
+ )
238
+
239
+ add_to_canvas_btn.click(
240
+ fn=add_selected_view_to_canvas,
241
+ inputs=[saved_assets_state, selected_asset_index_state],
242
+ outputs=editor,
243
+ )
244
+
245
+ reset_canvas_btn.click(
246
+ fn=reset_canvas_with_selected_view,
247
+ inputs=[saved_assets_state, selected_asset_index_state],
248
+ outputs=editor,
249
+ )
250
+
251
+ clear_canvas_btn.click(
252
+ fn=clear_canvas,
253
+ outputs=editor,
254
+ )
255
+
256
+ if __name__ == "__main__":
257
+ demo.launch()