Spaces:
Paused
Paused
Update app.py
Browse files
app.py
CHANGED
@@ -1,4 +1,5 @@
|
|
1 |
import gradio as gr
|
|
|
2 |
import tempfile
|
3 |
import os
|
4 |
import numpy as np
|
@@ -48,6 +49,7 @@ def preprocess(input_image, do_remove_background, foreground_ratio):
|
|
48 |
|
49 |
# Функция генерации 3D модели
|
50 |
def generate(image):
|
|
|
51 |
scene_codes = model(image, device=device)
|
52 |
mesh = model.extract_mesh(scene_codes)[0]
|
53 |
mesh = to_gradio_3d_orientation(mesh)
|
@@ -56,38 +58,28 @@ def generate(image):
|
|
56 |
return mesh_path2.name
|
57 |
|
58 |
|
59 |
-
#
|
60 |
-
|
61 |
-
|
62 |
-
super().__init__()
|
63 |
-
self.primary_hue = "#191a1e"
|
64 |
-
self.background_fill_primary = "#191a1e"
|
65 |
-
self.background_fill_secondary = "#191a1e"
|
66 |
-
self.background_fill_tertiary = "#191a1e"
|
67 |
-
self.text_color_primary = "#FFFFFF"
|
68 |
-
self.text_color_secondary = "#FFFFFF"
|
69 |
-
self.text_color_tertiary = "#FFFFFF"
|
70 |
-
self.input_background_fill = "#191a1e"
|
71 |
-
self.input_text_color = "#FFFFFF"
|
72 |
|
73 |
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
height: 0;
|
78 |
-
margin: 0;
|
79 |
-
padding: 0;
|
80 |
-
overflow: hidden;
|
81 |
-
}
|
82 |
|
|
|
|
|
|
|
83 |
body, .gr-block, .gr-container {
|
84 |
-
font-family: 'Poppins', sans-serif !important;
|
85 |
background-color: #191a1e !important;
|
86 |
color: #FFFFFF !important;
|
|
|
87 |
}
|
88 |
|
89 |
-
|
|
|
90 |
color: #FFFFFF !important;
|
|
|
91 |
}
|
92 |
|
93 |
/* Стили кнопки Generate */
|
@@ -105,44 +97,36 @@ h1, h2, h3, h4, h5, h6, p, label, .gr-button {
|
|
105 |
color: #FFFFFF !important;
|
106 |
}
|
107 |
|
108 |
-
/*
|
109 |
gr-image-upload {
|
110 |
background-color: #191a1e !important;
|
111 |
border: 1px dashed #FFFFFF !important;
|
112 |
}
|
113 |
|
|
|
|
|
|
|
|
|
|
|
114 |
.gr-image-upload .dropzone::before {
|
115 |
content: 'Drop Image Here';
|
116 |
color: #FFFFFF !important;
|
117 |
font-size: 1rem;
|
118 |
font-weight: bold;
|
119 |
text-align: center;
|
120 |
-
position: absolute;
|
121 |
-
top: 50%;
|
122 |
-
left: 50%;
|
123 |
-
transform: translate(-50%, -50%);
|
124 |
}
|
125 |
|
126 |
-
|
127 |
-
|
128 |
-
|
129 |
-
}
|
130 |
-
|
131 |
-
/* Слайдер и контейнеры */
|
132 |
-
.gr-slider {
|
133 |
-
background-color: #191a1e !important;
|
134 |
-
color: #FFFFFF !important;
|
135 |
}
|
136 |
|
137 |
-
.gr-
|
138 |
color: #FFFFFF !important;
|
|
|
139 |
}
|
140 |
|
141 |
-
|
142 |
-
background-color: #191a1e !important;
|
143 |
-
border: 1px solid #FFFFFF !important;
|
144 |
-
}
|
145 |
-
|
146 |
.gr-tab {
|
147 |
background-color: #191a1e !important;
|
148 |
border: 1px solid #FFFFFF !important;
|
@@ -152,12 +136,33 @@ gr-image-upload {
|
|
152 |
|
153 |
.gr-tab label {
|
154 |
color: #FFFFFF !important;
|
155 |
-
font-weight: bold;
|
156 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
157 |
"""
|
158 |
|
159 |
# Интерфейс
|
160 |
-
with gr.Blocks(
|
161 |
with gr.Column():
|
162 |
gr.Markdown("**Upload and Process Your Image**")
|
163 |
with gr.Row():
|
@@ -187,10 +192,15 @@ with gr.Blocks(theme=CustomTheme(), css=css) as demo:
|
|
187 |
value=True,
|
188 |
)
|
189 |
submit = gr.Button("Generate")
|
|
|
190 |
output_model = gr.Model3D(label="Generated GLB Model", interactive=False)
|
191 |
|
192 |
# Обработка кликов
|
193 |
submit.click(
|
|
|
|
|
|
|
|
|
194 |
fn=check_input_image,
|
195 |
inputs=[input_image],
|
196 |
outputs=[]
|
@@ -202,6 +212,10 @@ with gr.Blocks(theme=CustomTheme(), css=css) as demo:
|
|
202 |
fn=generate,
|
203 |
inputs=[processed_image],
|
204 |
outputs=[output_model]
|
|
|
|
|
|
|
|
|
205 |
)
|
206 |
|
207 |
# Запуск приложения
|
|
|
1 |
import gradio as gr
|
2 |
+
import time # Для эмуляции времени загрузки
|
3 |
import tempfile
|
4 |
import os
|
5 |
import numpy as np
|
|
|
49 |
|
50 |
# Функция генерации 3D модели
|
51 |
def generate(image):
|
52 |
+
time.sleep(3) # Эмуляция времени обработки
|
53 |
scene_codes = model(image, device=device)
|
54 |
mesh = model.extract_mesh(scene_codes)[0]
|
55 |
mesh = to_gradio_3d_orientation(mesh)
|
|
|
58 |
return mesh_path2.name
|
59 |
|
60 |
|
61 |
+
# Функция для отображения загрузки
|
62 |
+
def start_loading():
|
63 |
+
return "visible"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
64 |
|
65 |
|
66 |
+
def stop_loading():
|
67 |
+
return "hidden"
|
68 |
+
|
|
|
|
|
|
|
|
|
|
|
69 |
|
70 |
+
# Настройка темы и CSS
|
71 |
+
css = """
|
72 |
+
/* Фон для всей страницы */
|
73 |
body, .gr-block, .gr-container {
|
|
|
74 |
background-color: #191a1e !important;
|
75 |
color: #FFFFFF !important;
|
76 |
+
font-family: 'Poppins', sans-serif !important;
|
77 |
}
|
78 |
|
79 |
+
/* Цвет текста для заголовков и меток */
|
80 |
+
h1, h2, h3, h4, h5, h6, p, label, .gr-slider-label, .gr-checkbox {
|
81 |
color: #FFFFFF !important;
|
82 |
+
font-weight: bold !important;
|
83 |
}
|
84 |
|
85 |
/* Стили кнопки Generate */
|
|
|
97 |
color: #FFFFFF !important;
|
98 |
}
|
99 |
|
100 |
+
/* Фон и границы для областей изображений */
|
101 |
gr-image-upload {
|
102 |
background-color: #191a1e !important;
|
103 |
border: 1px dashed #FFFFFF !important;
|
104 |
}
|
105 |
|
106 |
+
.gr-image-upload .dropzone {
|
107 |
+
background-color: #191a1e !important;
|
108 |
+
border: 1px dashed #FFFFFF !important;
|
109 |
+
}
|
110 |
+
|
111 |
.gr-image-upload .dropzone::before {
|
112 |
content: 'Drop Image Here';
|
113 |
color: #FFFFFF !important;
|
114 |
font-size: 1rem;
|
115 |
font-weight: bold;
|
116 |
text-align: center;
|
|
|
|
|
|
|
|
|
117 |
}
|
118 |
|
119 |
+
/* Значение слайдера */
|
120 |
+
.gr-slider input[type="range"]::-webkit-slider-thumb {
|
121 |
+
background-color: #5271FF !important;
|
|
|
|
|
|
|
|
|
|
|
|
|
122 |
}
|
123 |
|
124 |
+
.gr-slider span {
|
125 |
color: #FFFFFF !important;
|
126 |
+
font-weight: bold !important;
|
127 |
}
|
128 |
|
129 |
+
/* Фон и текст в вкладках */
|
|
|
|
|
|
|
|
|
130 |
.gr-tab {
|
131 |
background-color: #191a1e !important;
|
132 |
border: 1px solid #FFFFFF !important;
|
|
|
136 |
|
137 |
.gr-tab label {
|
138 |
color: #FFFFFF !important;
|
139 |
+
font-weight: bold !important;
|
140 |
}
|
141 |
+
/* Прогресс-бар */
|
142 |
+
#loading-bar {
|
143 |
+
visibility: hidden;
|
144 |
+
position: absolute;
|
145 |
+
top: 50%;
|
146 |
+
left: 50%;
|
147 |
+
transform: translate(-50%, -50%);
|
148 |
+
width: 100px;
|
149 |
+
height: 100px;
|
150 |
+
border: 10px solid #f3f3f3;
|
151 |
+
border-top: 10px solid #5271FF;
|
152 |
+
border-radius: 50%;
|
153 |
+
animation: spin 1s linear infinite;
|
154 |
+
}
|
155 |
+
|
156 |
+
/* Анимация вращения */
|
157 |
+
@keyframes spin {
|
158 |
+
0% { transform: translate(-50%, -50%) rotate(0deg); }
|
159 |
+
100% { transform: translate(-50%, -50%) rotate(360deg); }
|
160 |
+
}
|
161 |
+
|
162 |
"""
|
163 |
|
164 |
# Интерфейс
|
165 |
+
with gr.Blocks(css=css) as demo:
|
166 |
with gr.Column():
|
167 |
gr.Markdown("**Upload and Process Your Image**")
|
168 |
with gr.Row():
|
|
|
192 |
value=True,
|
193 |
)
|
194 |
submit = gr.Button("Generate")
|
195 |
+
loading_bar = gr.HTML("<div id='loading-bar'></div>")
|
196 |
output_model = gr.Model3D(label="Generated GLB Model", interactive=False)
|
197 |
|
198 |
# Обработка кликов
|
199 |
submit.click(
|
200 |
+
fn=start_loading, # Включить прогресс-бар
|
201 |
+
inputs=[],
|
202 |
+
outputs=[loading_bar],
|
203 |
+
).then(
|
204 |
fn=check_input_image,
|
205 |
inputs=[input_image],
|
206 |
outputs=[]
|
|
|
212 |
fn=generate,
|
213 |
inputs=[processed_image],
|
214 |
outputs=[output_model]
|
215 |
+
).then(
|
216 |
+
fn=stop_loading, # Отключить прогресс-бар
|
217 |
+
inputs=[],
|
218 |
+
outputs=[loading_bar],
|
219 |
)
|
220 |
|
221 |
# Запуск приложения
|