yanranxiaoxi commited on
Commit
85838a0
·
verified ·
1 Parent(s): c60e0e6
Files changed (1) hide show
  1. app.py +30 -37
app.py CHANGED
@@ -177,7 +177,7 @@ def _default_render_cameras(batch_size: int = 1):
177
  return render_cameras.unsqueeze(0).repeat(batch_size, 1, 1)
178
 
179
  @spaces.GPU
180
- def generate_mesh(image, source_size=512, render_size=384, mesh_size=512, export_mesh=False, export_video=False, fps=30):
181
  image = preprocess_image(image, source_size).to(model_wrapper.device)
182
  source_camera = _default_source_camera(batch_size=1).to(model_wrapper.device)
183
 
@@ -196,7 +196,7 @@ def generate_mesh(image, source_size=512, render_size=384, mesh_size=512, export
196
  mesh_path = "xiaoxis_mesh.obj"
197
  mesh.export(mesh_path, 'obj')
198
 
199
- return planes, mesh_path
200
 
201
  if export_video:
202
  render_cameras = _default_render_cameras(batch_size=1).to(model_wrapper.device)
@@ -220,23 +220,20 @@ def generate_mesh(image, source_size=512, render_size=384, mesh_size=512, export
220
  video_path = "xiaoxis_video.mp4"
221
  imageio.mimwrite(video_path, frames, fps=fps)
222
 
223
- return planes, video_path
224
-
225
- return planes, None
226
 
227
  return None, None
228
 
229
- def step_1_generate_planes(image):
230
- planes_path, _ = generate_mesh(image)
231
- return planes_path.shape
232
-
233
- def step_2_generate_obj(image):
234
- _, mesh_path = generate_mesh(image, export_mesh=True)
235
- return planes_path.shape, mesh_path, mesh_path
236
 
237
- def step_3_generate_video(image):
238
  _, video_path = generate_mesh(image, export_video=True)
239
- return planes_path.shape, video_path
 
 
 
240
 
241
  # 从 assets 文件夹中设置示例文件,并限制最多读取 10 个文件
242
  example_folder = "assets"
@@ -255,27 +252,21 @@ with gr.Blocks() as demo:
255
  with gr.Row():
256
  with gr.Column():
257
  img_input = gr.Image(type="pil", label="输入图像")
258
- examples_component = gr.Examples(examples=examples, inputs=img_input, outputs=None, examples_per_page=5)
259
- generate_planes_button = gr.Button("生成平面图")
260
  generate_mesh_button = gr.Button("生成模型")
261
  generate_video_button = gr.Button("生成视频")
262
  with gr.Column():
263
- planes_output = gr.Image(
264
- label="平面图",
265
- type="pil",
266
- interactive=False
267
- )
268
  model_output = LitModel3D(
269
  clear_color=[0, 0, 0, 0], # 可调整背景颜色,以获得更好的对比度
270
  label="模型可视化",
271
  scale=1.0,
272
- tonemapping="aces", # 可使用 aces 色调映射,使灯光更逼真
273
- exposure=1.1, # 可调节曝光以控制亮度
274
- contrast=1.1, # 可略微增加对比度,以获得更好的深度
275
- camera_position=(0, 0, 2), # 将设置初始摄像机位置,使模型居中
276
- zoom_speed=0.5, # 将调整变焦速度,以便更好地控制
277
- pan_speed=0.5, # 将调整摇摄速度,以便更好地控制
278
- interactive=False # 这样用户就可以与模型进行交互
279
  )
280
 
281
  with gr.Row():
@@ -287,18 +278,20 @@ with gr.Blocks() as demo:
287
 
288
  # 清除输出
289
  def clear_model_viewer():
290
- """在加载新模型前重置 Gradio。"""
291
- update_output = gr.update(value=None)
292
- return update_output, update_output
 
 
 
293
 
294
- # 首先清除输出的数据
295
- img_input.change(clear_model_viewer, inputs=None, outputs=[planes_output, model_output])
296
 
297
  # 然后生成模型和视频
298
- generate_planes_button.click(step_1_generate_planes, inputs=img_input, outputs=planes_output)
299
- generate_mesh_button.click(step_2_generate_obj, inputs=img_input, outputs=[planes_output, obj_file_output, model_output])
300
- generate_video_button.click(step_3_generate_video, inputs=img_input, outputs=[planes_output, video_file_output])
301
 
302
  demo.launch(
303
  auth=(os.environ.get('AUTH_USERNAME'), os.environ.get('AUTH_PASSWORD'))
304
- )
 
177
  return render_cameras.unsqueeze(0).repeat(batch_size, 1, 1)
178
 
179
  @spaces.GPU
180
+ def generate_mesh(image, source_size=512, render_size=384, mesh_size=512, export_mesh=False, export_video=True, fps=30):
181
  image = preprocess_image(image, source_size).to(model_wrapper.device)
182
  source_camera = _default_source_camera(batch_size=1).to(model_wrapper.device)
183
 
 
196
  mesh_path = "xiaoxis_mesh.obj"
197
  mesh.export(mesh_path, 'obj')
198
 
199
+ return mesh_path, mesh_path
200
 
201
  if export_video:
202
  render_cameras = _default_render_cameras(batch_size=1).to(model_wrapper.device)
 
220
  video_path = "xiaoxis_video.mp4"
221
  imageio.mimwrite(video_path, frames, fps=fps)
222
 
223
+ return None, video_path
 
 
224
 
225
  return None, None
226
 
227
+ def step_1_generate_obj(image):
228
+ mesh_path, _ = generate_mesh(image, export_mesh=True)
229
+ return mesh_path, mesh_path
 
 
 
 
230
 
231
+ def step_2_generate_video(image):
232
  _, video_path = generate_mesh(image, export_video=True)
233
+ return video_path
234
+
235
+ def step_3_display_3d_model(mesh_file):
236
+ return mesh_file
237
 
238
  # 从 assets 文件夹中设置示例文件,并限制最多读取 10 个文件
239
  example_folder = "assets"
 
252
  with gr.Row():
253
  with gr.Column():
254
  img_input = gr.Image(type="pil", label="输入图像")
255
+ examples_component = gr.Examples(examples=examples, inputs=img_input, outputs=None, examples_per_page=3)
 
256
  generate_mesh_button = gr.Button("生成模型")
257
  generate_video_button = gr.Button("生成视频")
258
  with gr.Column():
 
 
 
 
 
259
  model_output = LitModel3D(
260
  clear_color=[0, 0, 0, 0], # 可调整背景颜色,以获得更好的对比度
261
  label="模型可视化",
262
  scale=1.0,
263
+ tonemapping="aces", # 可使用 aces 色调映射,使灯光更逼真
264
+ exposure=1.1, # 可调节曝光以控制亮度
265
+ contrast=1.1, # 可略微增加对比度,以获得更好的深度
266
+ camera_position=(0, 0, 2), # 将设置初始摄像机位置,使模型居中
267
+ zoom_speed=0.5, # 将调整变焦速度,以便更好地控制
268
+ pan_speed=0.5, # 将调整摇摄速度,以便更好地控制
269
+ interactive=False # 这样用户就可以与模型进行交互
270
  )
271
 
272
  with gr.Row():
 
278
 
279
  # 清除输出
280
  def clear_model_viewer():
281
+ """在加载新模型前重置 Model3D 组件。"""
282
+ return gr.update(value=None)
283
+
284
+ def generate_and_visualize(image):
285
+ mesh_path = step_1_generate_obj(image)
286
+ return mesh_path, mesh_path
287
 
288
+ # 首先清除输出的 3D 模型
289
+ img_input.change(clear_model_viewer, inputs=None, outputs=model_output)
290
 
291
  # 然后生成模型和视频
292
+ generate_mesh_button.click(step_1_generate_obj, inputs=img_input, outputs=[obj_file_output, model_output])
293
+ generate_video_button.click(step_2_generate_video, inputs=img_input, outputs=video_file_output)
 
294
 
295
  demo.launch(
296
  auth=(os.environ.get('AUTH_USERNAME'), os.environ.get('AUTH_PASSWORD'))
297
+ )