SharafeevRavil commited on
Commit
5f2f11a
·
verified ·
1 Parent(s): 8a3e91a

semi-final version

Browse files
Files changed (1) hide show
  1. app.py +188 -100
app.py CHANGED
@@ -7,6 +7,10 @@ from gradio_client import Client, handle_file
7
  import numpy as np
8
  import cv2
9
  import os
 
 
 
 
10
 
11
  # Инициализация моделей
12
  from transformers import OneFormerProcessor, OneFormerForUniversalSegmentation
@@ -22,7 +26,6 @@ oneFormer_model = OneFormerForUniversalSegmentation.from_pretrained("shi-labs/on
22
  # inpainting_client = InferenceClient(model="stabilityai/stable-diffusion-inpainting")
23
  # Функции для обработки изображений
24
  def segment_image(image):
25
- image = Image.fromarray(image)
26
  inputs = oneFormer_processor(image, task_inputs=["panoptic"], return_tensors="pt")
27
 
28
  with torch.no_grad():
@@ -91,7 +94,94 @@ def merge_segments_by_labels(gallery_images, labels_input):
91
  else:
92
  return gallery_images
93
 
 
 
 
 
 
 
94
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
95
  def hunyuan_client(request: gr.Request):
96
  try:
97
  client = Client("tencent/Hunyuan3D-2", headers={"X-IP-Token": request.headers['x-ip-token']})
@@ -110,117 +200,115 @@ def vFusion_client(request: gr.Request):
110
  print("facebook/VFusion3D no token")
111
  return Client("facebook/VFusion3D")
112
 
113
- def generate_3d_model(segment_output, request: gr.Request):
114
- for i, (image_path, label) in enumerate(segment_output):
115
- if label == segment_name:
116
- client = hunyuan_client(request)
117
- result = client.predict(
118
- caption="",
119
- image=handle_file(image_path),
120
- steps=50,
121
- guidance_scale=5.5,
122
- seed=1234,
123
- octree_resolution="256",
124
- check_box_rembg=True,
125
- api_name="/shape_generation"
126
- )
127
- print(result)
128
- return result[0]
129
-
130
- def generate_3d_model_texture(segment_output, segment_name, request: gr.Request):
131
- for i, (image_path, label) in enumerate(segment_output):
132
- if label == segment_name:
133
- client = hunyuan_client(request)
134
- result = client.predict(
135
- caption="",
136
- image=handle_file(image_path),
137
- steps=50,
138
- guidance_scale=5.5,
139
- seed=1234,
140
- octree_resolution="256",
141
- check_box_rembg=True,
142
- api_name="/generation_all"
143
- )
144
- print(result)
145
- return result[1]
146
-
147
- def generate_3d_model2(segment_output, segment_name, request: gr.Request):
148
- for i, (image_path, label) in enumerate(segment_output):
149
- if label == segment_name:
150
- client = vFusion_client(request)
151
- result = client.predict(
152
- image=handle_file(image_path),
153
- api_name="/step_1_generate_obj"
154
- )
155
- print(result)
156
- return result[0]
157
-
158
-
159
- # def classify_segments(segments):
160
- # # Предполагается, что segments - список изображений сегментов
161
- # results = []
162
- # for segment in segments:
163
- # results.append(classification(segment))
164
- # return results # Вернем список классификаций
165
-
166
- # def upscale_segment(segment):
167
- # upscaled = upscaling_client.image_to_image(segment)
168
- # return upscaled
169
-
170
- # def inpaint_image(image, mask, prompt):
171
- # inpainted = inpainting_client.text_to_image(prompt, image=image, mask=mask)
172
- # return inpainted
173
-
174
-
175
 
176
 
177
  ########## GRADIO ##########
178
 
 
179
  with gr.Blocks() as demo:
180
  gr.Markdown("# Анализ и редактирование помещений")
181
-
182
  with gr.Tab("Сканирование"):
183
- with gr.Row():
184
  with gr.Column(scale=5):
185
- image_input = gr.Image()
186
  segment_button = gr.Button("Сегментировать")
187
  with gr.Column(scale=5):
188
- segment_output = gr.Gallery()
189
  merge_segments_input = gr.Textbox(label="Сегменты для объединения (через точку с запятой, например: \"wall_0; tv_0\")")
190
  merge_segments_button = gr.Button("Соединить сегменты")
191
- merge_segments_button.click(merge_segments_by_labels, inputs=[segment_output, merge_segments_input], outputs=segment_output)
192
- with gr.Row():
 
 
 
 
193
  with gr.Column(scale=5):
194
- trellis_input = gr.Textbox(label="Имя сегмента для 3D")
195
- hunyuan_button = gr.Button("Hunyuan3D-2")
196
- hunyuan_button_texture = gr.Button("Hunyuan3D-2 (with texture)")
197
- vFusion_button = gr.Button("VFusion3D")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
198
  with gr.Column(scale=5):
199
  trellis_output = gr.Model3D(label="3D Model")
200
-
201
- hunyuan_button.click(generate_3d_model, inputs=[segment_output, trellis_input], outputs=trellis_output)
202
- hunyuan_button_texture.click(generate_3d_model_texture, inputs=[segment_output, trellis_input], outputs=trellis_output)
203
- vFusion_button.click(generate_3d_model2, inputs=[segment_output, trellis_input], outputs=trellis_output)
204
-
205
- segment_button.click(segment_image, inputs=image_input, outputs=segment_output)
206
- # segment_button.click(segment_full_image, inputs=image_input, outputs=segment_output)
207
-
208
- # with gr.Tab("Редактирование"):
209
- # segment_input = gr.Image()
210
- # upscale_output = gr.Image()
211
- # upscale_button = gr.Button("Upscale")
212
- # upscale_button.click(upscale_segment, inputs=segment_input, outputs=upscale_output)
213
-
214
- # mask_input = gr.Image()
215
- # prompt_input = gr.Textbox()
216
- # inpaint_output = gr.Image()
217
- # inpaint_button = gr.Button("Inpaint")
218
- # inpaint_button.click(inpaint_image, inputs=[segment_input, mask_input, prompt_input], outputs=inpaint_output)
219
-
220
- # with gr.Tab("Создание 3D моделей"):
221
- # segment_input_3d = gr.Image()
222
- # model_output = gr.File()
223
- # model_button = gr.Button("Создать 3D модель")
224
- # model_button.click(generate_3d_model, inputs=segment_input_3d, outputs=model_output)
225
-
226
- demo.launch(debug=True, show_error=True)
 
7
  import numpy as np
8
  import cv2
9
  import os
10
+ import tempfile
11
+ import io
12
+ import base64
13
+ import requests
14
 
15
  # Инициализация моделей
16
  from transformers import OneFormerProcessor, OneFormerForUniversalSegmentation
 
26
  # inpainting_client = InferenceClient(model="stabilityai/stable-diffusion-inpainting")
27
  # Функции для обработки изображений
28
  def segment_image(image):
 
29
  inputs = oneFormer_processor(image, task_inputs=["panoptic"], return_tensors="pt")
30
 
31
  with torch.no_grad():
 
94
  else:
95
  return gallery_images
96
 
97
+ def select_segment(segment_output, segment_name):
98
+ for i, (image_path, label) in enumerate(segment_output):
99
+ if label == segment_name:
100
+ return image_path
101
+
102
+ #Image edit
103
 
104
+ def return_image(imageEditor):
105
+ return imageEditor['composite']
106
+
107
+ def rembg_client(request: gr.Request):
108
+ try:
109
+ client = Client("KenjieDec/RemBG", headers={"X-IP-Token": request.headers['x-ip-token']})
110
+ print("KenjieDec/RemBG Ip token")
111
+ return client
112
+ except:
113
+ print("KenjieDec/RemBG no token")
114
+ return Client("KenjieDec/RemBG")
115
+
116
+ def autocrop_image(imageEditor, border = 0):
117
+ image = imageEditor['composite']
118
+ bbox = image.getbbox()
119
+ image = image.crop(bbox)
120
+ (width, height) = image.size
121
+ width += border * 2
122
+ height += border * 2
123
+ cropped_image = Image.new("RGBA", (width, height), (0,0,0,0))
124
+ cropped_image.paste(image, (border, border))
125
+ return cropped_image
126
+
127
+ def remove_black_make_transparent(imageEditor):
128
+ image_pil = imageEditor['composite']
129
+ if image_pil.mode != "RGBA":
130
+ image_pil = image_pil.convert("RGBA")
131
+ image_np = np.array(image_pil)
132
+ black_pixels_mask = np.all(image_np[:, :, :3] == [0, 0, 0], axis=-1)
133
+ image_np[black_pixels_mask, 3] = 0
134
+ transparent_image = Image.fromarray(image_np)
135
+ return transparent_image
136
+
137
+ def rembg(imageEditor, request: gr.Request):
138
+ with tempfile.NamedTemporaryFile(suffix=".png", delete=False) as temp_file:
139
+ imageEditor['composite'].save(temp_file.name)
140
+ temp_file_path = temp_file.name
141
+ client = rembg_client(request)
142
+ result = client.predict(
143
+ file=handle_file(temp_file_path),
144
+ mask="Default",
145
+ model="birefnet-general-lite",
146
+ x=0,
147
+ y=0,
148
+ api_name="/inference"
149
+ )
150
+ print(result)
151
+ return result
152
+
153
+ def add_transparent_border(imageEditor, border_size=200):
154
+ image = imageEditor['composite']
155
+ width, height = image.size
156
+ new_width = width + 2 * border_size
157
+ new_height = height + 2 * border_size
158
+ new_image = Image.new("RGBA", (new_width, new_height), (0, 0, 0, 0))
159
+ new_image.paste(image, (border_size, border_size))
160
+ return new_image
161
+
162
+ def upscale(imageEditor, scale, request: gr.Request):
163
+ return upscale_image(imageEditor['composite'], version="v1.4", rescaling_factor=scale)
164
+
165
+ def upscale_image(image_pil, version="v1.4", rescaling_factor=None):
166
+ buffered = io.BytesIO()
167
+ image_pil.save(buffered, format="PNG") # Save as PNG
168
+ img_str = base64.b64encode(buffered.getvalue()).decode()
169
+
170
+ # Update the data format for PNG
171
+ data = {"data": [f"data:image/png;base64,{img_str}", version, rescaling_factor]}
172
+ # Send request to the API
173
+ response = requests.post("https://nightfury-image-face-upscale-restoration-gfpgan.hf.space/api/predict", json=data)
174
+ response.raise_for_status()
175
+ # Get the base64 data from the response
176
+ base64_data = response.json()["data"][0]
177
+ base64_data = base64_data.split(",")[1] # remove data:image/png;base64,
178
+ # Convert base64 back to PIL Image
179
+ image_bytes = base64.b64decode(base64_data)
180
+ upscaled_image = Image.open(io.BytesIO(image_bytes))
181
+ return upscaled_image
182
+
183
+
184
+ #3d models
185
  def hunyuan_client(request: gr.Request):
186
  try:
187
  client = Client("tencent/Hunyuan3D-2", headers={"X-IP-Token": request.headers['x-ip-token']})
 
200
  print("facebook/VFusion3D no token")
201
  return Client("facebook/VFusion3D")
202
 
203
+ def generate_3d_model(image_pil, rembg_Hunyuan, request: gr.Request):
204
+ with tempfile.NamedTemporaryFile(suffix=".png", delete=False) as temp_file:
205
+ image_pil.save(temp_file.name)
206
+ temp_file_path = temp_file.name
207
+ client = hunyuan_client(request)
208
+ result = client.predict(
209
+ caption="",
210
+ image=handle_file(temp_file_path),
211
+ steps=50,
212
+ guidance_scale=5.5,
213
+ seed=1234,
214
+ octree_resolution="256",
215
+ check_box_rembg=rembg_Hunyuan,
216
+ api_name="/shape_generation"
217
+ )
218
+ print(result)
219
+ return result[0]
220
+
221
+ def generate_3d_model_texture(image_pil, rembg_Hunyuan, request: gr.Request):
222
+ with tempfile.NamedTemporaryFile(suffix=".png", delete=False) as temp_file:
223
+ image_pil.save(temp_file.name)
224
+ temp_file_path = temp_file.name
225
+ client = hunyuan_client(request)
226
+ result = client.predict(
227
+ caption="",
228
+ image=handle_file(temp_file_path),
229
+ steps=50,
230
+ guidance_scale=5.5,
231
+ seed=1234,
232
+ octree_resolution="256",
233
+ check_box_rembg=rembg_Hunyuan,
234
+ api_name="/generation_all"
235
+ )
236
+ print(result)
237
+ return result[1]
238
+
239
+ def generate_3d_model2(image_pil, request: gr.Request):
240
+ with tempfile.NamedTemporaryFile(suffix=".png", delete=False) as temp_file:
241
+ image_pil.save(temp_file.name)
242
+ temp_file_path = temp_file.name
243
+ client = vFusion_client(request)
244
+ result = client.predict(
245
+ image=handle_file(temp_file_path),
246
+ api_name="/step_1_generate_obj"
247
+ )
248
+ print(result)
249
+ return result[0]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
250
 
251
 
252
  ########## GRADIO ##########
253
 
254
+
255
  with gr.Blocks() as demo:
256
  gr.Markdown("# Анализ и редактирование помещений")
 
257
  with gr.Tab("Сканирование"):
258
+ with gr.Row(equal_height=True):
259
  with gr.Column(scale=5):
260
+ image_input = gr.Image(type="pil", label="Исходное изображение", height = 400)
261
  segment_button = gr.Button("Сегментировать")
262
  with gr.Column(scale=5):
263
+ segments_output = gr.Gallery(label="Сегменты изображения")
264
  merge_segments_input = gr.Textbox(label="Сегменты для объединения (через точку с запятой, например: \"wall_0; tv_0\")")
265
  merge_segments_button = gr.Button("Соединить сегменты")
266
+ merge_segments_button.click(merge_segments_by_labels, inputs=[segments_output, merge_segments_input], outputs=segments_output)
267
+ with gr.Row(equal_height=True):
268
+ segment_text_input = gr.Textbox(label="Имя сегмента для дальнейшего редактирования")
269
+ select_segment_button = gr.Button("Использовать сегмент")
270
+ with gr.Tab("Редактирование"):
271
+ with gr.Row(equal_height=True):
272
  with gr.Column(scale=5):
273
+ segment_input = gr.ImageEditor(type="pil", label="Сегмент для редактирования")
274
+ with gr.Column(scale=5):
275
+ crop_button = gr.Button("Обрезать сегмент")
276
+ with gr.Row(equal_height=True):
277
+ upscale_slider = gr.Slider(minimum=1, maximum=5, value=2, step=0.1, label="во сколько раз")
278
+ upscale_button = gr.Button("Upscale")
279
+ rembg_button = gr.Button("Rembg")
280
+ remove_background_button = gr.Button("Убрать черный задний фон")
281
+ with gr.Row(equal_height=True):
282
+ add_transparent_border_slider = gr.Slider(minimum=10, maximum=500, value=200, step=10, label="в пикселях")
283
+ add_transparent_border_button = gr.Button("Добавить прозрачные края")
284
+ use_button = gr.Button("Использовать сегмент для 3D")
285
+
286
+ with gr.Tab("Создание 3D"):
287
+ with gr.Row(equal_height=True):
288
+ with gr.Column(scale=5):
289
+ segment_3d_input = gr.Image(type="pil", image_mode="RGBA", label="Сегмент для 3D", height = 600)
290
+ rembg_Hunyuan = gr.Checkbox(label="Hunyuan3D-2 rembg Enabled", info="Включить rembg для Hunyuan3D-2?")
291
+ hunyuan_button = gr.Button("Hunyuan3D-2 (no texture) [ZeroGPU = 100s]")
292
+ hunyuan_button_texture = gr.Button("Hunyuan3D-2 (with texture) [ZeroGPU = 150s]")
293
+ vFusion_button = gr.Button("VFusion3D [если у вас совсем все грустно по ZeroGPU]")
294
  with gr.Column(scale=5):
295
  trellis_output = gr.Model3D(label="3D Model")
296
+
297
+ #tab1
298
+ segment_button.click(segment_image, inputs=image_input, outputs=segments_output)
299
+ select_segment_button.click(select_segment, inputs=[segments_output, segment_text_input], outputs=segment_input)
300
+
301
+ #tab2
302
+ crop_button.click(autocrop_image, inputs=segment_input, outputs=segment_input)
303
+ upscale_button.click(upscale, inputs=[segment_input, upscale_slider], outputs=segment_input)
304
+ rembg_button.click(rembg, inputs=segment_input, outputs=segment_input)
305
+ remove_background_button.click(remove_black_make_transparent, inputs=segment_input, outputs=segment_input)
306
+ add_transparent_border_button.click(add_transparent_border, inputs=[segment_input, add_transparent_border_slider], outputs=segment_input)
307
+ use_button.click(return_image, inputs=segment_input, outputs=segment_3d_input)
308
+
309
+ #3d buttons
310
+ hunyuan_button.click(generate_3d_model, inputs=[segment_3d_input, rembg_Hunyuan], outputs=trellis_output)
311
+ hunyuan_button_texture.click(generate_3d_model_texture, inputs=[segment_3d_input, rembg_Hunyuan], outputs=trellis_output)
312
+ vFusion_button.click(generate_3d_model2, inputs=segment_3d_input, outputs=trellis_output)
313
+
314
+ demo.launch(debug=True, show_error=True)