multimodalart HF Staff commited on
Commit
e68e968
·
verified ·
1 Parent(s): fdd8db5

Add support to MCP

Browse files
Files changed (1) hide show
  1. gradio_app.py +146 -1
gradio_app.py CHANGED
@@ -285,6 +285,38 @@ def _gen_shape(
285
  num_chunks=200000,
286
  randomize_seed: bool = False,
287
  ):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
288
  if not MV_MODE and image is None and caption is None:
289
  raise gr.Error("Please provide either a caption or an image.")
290
  if MV_MODE:
@@ -394,6 +426,36 @@ def generation_all(
394
  num_chunks=200000,
395
  randomize_seed: bool = False,
396
  ):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
397
  start_time_0 = time.time()
398
  mesh, image, save_folder, stats, seed = _gen_shape(
399
  caption,
@@ -476,6 +538,34 @@ def shape_generation(
476
  num_chunks=200000,
477
  randomize_seed: bool = False,
478
  ):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
479
  start_time_0 = time.time()
480
  mesh, image, save_folder, stats, seed = _gen_shape(
481
  caption,
@@ -716,6 +806,22 @@ Fast for very complex cases, Standard seldom use.',
716
  )
717
 
718
  def on_gen_mode_change(value):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
719
  if value == 'Turbo':
720
  return gr.update(value=5)
721
  elif value == 'Fast':
@@ -726,6 +832,22 @@ Fast for very complex cases, Standard seldom use.',
726
  gen_mode.change(on_gen_mode_change, inputs=[gen_mode], outputs=[num_steps])
727
 
728
  def on_decode_mode_change(value):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
729
  if value == 'Low':
730
  return gr.update(value=196)
731
  elif value == 'Standard':
@@ -738,6 +860,29 @@ Fast for very complex cases, Standard seldom use.',
738
 
739
  def on_export_click(file_out, file_out2, file_type,
740
  reduce_face, export_texture, target_face_num):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
741
  if file_out is None:
742
  raise gr.Error('Please generate a mesh first.')
743
 
@@ -917,7 +1062,7 @@ if __name__ == '__main__':
917
  torch.cuda.empty_cache()
918
 
919
  demo = build_app()
920
- app = gr.mount_gradio_app(app, demo, path="/")
921
 
922
  if ENV == 'Huggingface':
923
  # for Zerogpu
 
285
  num_chunks=200000,
286
  randomize_seed: bool = False,
287
  ):
288
+ """
289
+ Generate a 3D shape from text caption or image input using Hunyuan3D pipeline.
290
+
291
+ This function handles the core 3D shape generation process, including image preprocessing,
292
+ background removal, and 3D mesh generation from various input modalities.
293
+
294
+ Args:
295
+ caption (str, optional): Text description for shape generation. Defaults to None.
296
+ image (PIL.Image, optional): Input image for image-to-3D generation. Defaults to None.
297
+ mv_image_front (PIL.Image, optional): Front view image for multi-view mode. Defaults to None.
298
+ mv_image_back (PIL.Image, optional): Back view image for multi-view mode. Defaults to None.
299
+ mv_image_left (PIL.Image, optional): Left view image for multi-view mode. Defaults to None.
300
+ mv_image_right (PIL.Image, optional): Right view image for multi-view mode. Defaults to None.
301
+ steps (int, optional): Number of inference steps. Defaults to 50.
302
+ guidance_scale (float, optional): Guidance scale for diffusion process. Defaults to 7.5.
303
+ seed (int, optional): Random seed for reproducibility. Defaults to 1234.
304
+ octree_resolution (int, optional): Resolution for octree representation. Defaults to 256.
305
+ check_box_rembg (bool, optional): Whether to remove background from input images. Defaults to False.
306
+ num_chunks (int, optional): Number of chunks for processing. Defaults to 200000.
307
+ randomize_seed (bool, optional): Whether to randomize the seed. Defaults to False.
308
+
309
+ Returns:
310
+ tuple: Contains (mesh, main_image, save_folder, stats, seed)
311
+ - mesh: Generated 3D mesh object
312
+ - main_image: Primary input image used for generation
313
+ - save_folder: Directory where outputs are saved
314
+ - stats: Generation statistics and metadata
315
+ - seed: Final seed value used for generation
316
+
317
+ Raises:
318
+ gr.Error: If no input (caption or image) is provided in single-view mode, or no view images in multi-view mode.
319
+ """
320
  if not MV_MODE and image is None and caption is None:
321
  raise gr.Error("Please provide either a caption or an image.")
322
  if MV_MODE:
 
426
  num_chunks=200000,
427
  randomize_seed: bool = False,
428
  ):
429
+ """
430
+ Complete pipeline for generating both 3D shape and textured mesh from user inputs.
431
+
432
+ This function orchestrates the entire generation process including shape generation,
433
+ face reduction, texture painting, and GLB export. It's triggered when users click
434
+ the "Gen Textured Shape" button.
435
+
436
+ Args:
437
+ caption (str, optional): Text description for shape generation. Defaults to None.
438
+ image (PIL.Image, optional): Input image for image-to-3D generation. Defaults to None.
439
+ mv_image_front (PIL.Image, optional): Front view image for multi-view mode. Defaults to None.
440
+ mv_image_back (PIL.Image, optional): Back view image for multi-view mode. Defaults to None.
441
+ mv_image_left (PIL.Image, optional): Left view image for multi-view mode. Defaults to None.
442
+ mv_image_right (PIL.Image, optional): Right view image for multi-view mode. Defaults to None.
443
+ steps (int, optional): Number of inference steps. Defaults to 50.
444
+ guidance_scale (float, optional): Guidance scale for diffusion process. Defaults to 7.5.
445
+ seed (int, optional): Random seed for reproducibility. Defaults to 1234.
446
+ octree_resolution (int, optional): Resolution for octree representation. Defaults to 256.
447
+ check_box_rembg (bool, optional): Whether to remove background from input images. Defaults to False.
448
+ num_chunks (int, optional): Number of chunks for processing. Defaults to 200000.
449
+ randomize_seed (bool, optional): Whether to randomize the seed. Defaults to False.
450
+
451
+ Returns:
452
+ tuple: Contains (file_out, glb_path_textured, model_viewer_html_textured, stats, seed)
453
+ - file_out: Path to the generated white mesh file
454
+ - glb_path_textured: Path to the textured GLB file
455
+ - model_viewer_html_textured: HTML content for 3D model viewer
456
+ - stats: Generation statistics and timing information
457
+ - seed: Final seed value used for generation
458
+ """
459
  start_time_0 = time.time()
460
  mesh, image, save_folder, stats, seed = _gen_shape(
461
  caption,
 
538
  num_chunks=200000,
539
  randomize_seed: bool = False,
540
  ):
541
+ """
542
+ Generate a 3D shape without texturing from user inputs.
543
+
544
+ This function handles shape generation only, creating a white/untextured 3D mesh.
545
+ It's triggered when users click the "Gen Shape" button.
546
+
547
+ Args:
548
+ caption (str, optional): Text description for shape generation. Defaults to None.
549
+ image (PIL.Image, optional): Input image for image-to-3D generation. Defaults to None.
550
+ mv_image_front (PIL.Image, optional): Front view image for multi-view mode. Defaults to None.
551
+ mv_image_back (PIL.Image, optional): Back view image for multi-view mode. Defaults to None.
552
+ mv_image_left (PIL.Image, optional): Left view image for multi-view mode. Defaults to None.
553
+ mv_image_right (PIL.Image, optional): Right view image for multi-view mode. Defaults to None.
554
+ steps (int, optional): Number of inference steps. Defaults to 50.
555
+ guidance_scale (float, optional): Guidance scale for diffusion process. Defaults to 7.5.
556
+ seed (int, optional): Random seed for reproducibility. Defaults to 1234.
557
+ octree_resolution (int, optional): Resolution for octree representation. Defaults to 256.
558
+ check_box_rembg (bool, optional): Whether to remove background from input images. Defaults to False.
559
+ num_chunks (int, optional): Number of chunks for processing. Defaults to 200000.
560
+ randomize_seed (bool, optional): Whether to randomize the seed. Defaults to False.
561
+
562
+ Returns:
563
+ tuple: Contains (file_out, model_viewer_html, stats, seed)
564
+ - file_out: Gradio update with path to the generated mesh file
565
+ - model_viewer_html: HTML content for 3D model viewer
566
+ - stats: Generation statistics and timing information
567
+ - seed: Final seed value used for generation
568
+ """
569
  start_time_0 = time.time()
570
  mesh, image, save_folder, stats, seed = _gen_shape(
571
  caption,
 
806
  )
807
 
808
  def on_gen_mode_change(value):
809
+ """
810
+ Update the number of inference steps based on the selected generation mode.
811
+
812
+ This function is triggered when the user changes the generation mode radio button
813
+ in the Options tab. It automatically adjusts the number of steps for optimal
814
+ performance based on the selected mode.
815
+
816
+ Args:
817
+ value (str): The selected generation mode ('Turbo', 'Fast', or 'Standard')
818
+
819
+ Returns:
820
+ gr.update: Gradio update object with the new number of steps value
821
+ - Turbo: 5 steps (fastest)
822
+ - Fast: 10 steps (balanced)
823
+ - Standard: 30 steps (highest quality)
824
+ """
825
  if value == 'Turbo':
826
  return gr.update(value=5)
827
  elif value == 'Fast':
 
832
  gen_mode.change(on_gen_mode_change, inputs=[gen_mode], outputs=[num_steps])
833
 
834
  def on_decode_mode_change(value):
835
+ """
836
+ Update the octree resolution based on the selected decoding mode.
837
+
838
+ This function is triggered when the user changes the decoding mode radio button
839
+ in the Options tab. It automatically adjusts the octree resolution to match
840
+ the selected quality level for mesh export.
841
+
842
+ Args:
843
+ value (str): The selected decoding mode ('Low', 'Standard', or 'High')
844
+
845
+ Returns:
846
+ gr.update: Gradio update object with the new octree resolution value
847
+ - Low: 196 resolution (faster processing, lower quality)
848
+ - Standard: 256 resolution (balanced)
849
+ - High: 384 resolution (slower processing, higher quality)
850
+ """
851
  if value == 'Low':
852
  return gr.update(value=196)
853
  elif value == 'Standard':
 
860
 
861
  def on_export_click(file_out, file_out2, file_type,
862
  reduce_face, export_texture, target_face_num):
863
+ """
864
+ Handle mesh export with user-specified options and format conversion.
865
+
866
+ This function is triggered when the user clicks the "Transform" button in the Export tab.
867
+ It processes the generated mesh according to user preferences, applies post-processing
868
+ operations, and exports to the desired format.
869
+
870
+ Args:
871
+ file_out (str): Path to the base generated mesh file
872
+ file_out2 (str): Path to the textured mesh file (if available)
873
+ file_type (str): Desired export format ('glb', 'obj', 'ply', 'stl')
874
+ reduce_face (bool): Whether to apply mesh simplification
875
+ export_texture (bool): Whether to export textured version
876
+ target_face_num (int): Target number of faces for mesh simplification
877
+
878
+ Returns:
879
+ tuple: Contains (model_viewer_html, file_export)
880
+ - model_viewer_html: Updated HTML for 3D model preview
881
+ - file_export: Gradio update with path to the exported file
882
+
883
+ Raises:
884
+ gr.Error: If no mesh has been generated yet
885
+ """
886
  if file_out is None:
887
  raise gr.Error('Please generate a mesh first.')
888
 
 
1062
  torch.cuda.empty_cache()
1063
 
1064
  demo = build_app()
1065
+ app = gr.mount_gradio_app(app, demo, mcp_server=True, path="/")
1066
 
1067
  if ENV == 'Huggingface':
1068
  # for Zerogpu