Spaces:
				
			
			
	
			
			
		Running
		
			on 
			
			Zero
	
	
	
			
			
	
	
	
	
		
		
		Running
		
			on 
			
			Zero
	Commit 
							
							·
						
						168b252
	
0
								Parent(s):
							
							
clean code
Browse filesThis view is limited to 50 files because it contains too many changes.  
							See raw diff
- .gitattributes +36 -0
- README.md +16 -0
- app.py +231 -0
- assets/example_image/T.png +0 -0
- assets/example_image/typical_building_building.png +0 -0
- assets/example_image/typical_building_castle.png +0 -0
- assets/example_image/typical_building_colorful_cottage.png +0 -0
- assets/example_image/typical_building_maya_pyramid.png +0 -0
- assets/example_image/typical_building_mushroom.png +0 -0
- assets/example_image/typical_building_space_station.png +0 -0
- assets/example_image/typical_creature_dragon.png +0 -0
- assets/example_image/typical_creature_elephant.png +0 -0
- assets/example_image/typical_creature_furry.png +0 -0
- assets/example_image/typical_creature_quadruped.png +0 -0
- assets/example_image/typical_creature_robot_crab.png +0 -0
- assets/example_image/typical_creature_robot_dinosour.png +0 -0
- assets/example_image/typical_creature_rock_monster.png +0 -0
- assets/example_image/typical_humanoid_block_robot.png +0 -0
- assets/example_image/typical_humanoid_dragonborn.png +0 -0
- assets/example_image/typical_humanoid_dwarf.png +0 -0
- assets/example_image/typical_humanoid_goblin.png +0 -0
- assets/example_image/typical_humanoid_mech.png +0 -0
- assets/example_image/typical_misc_crate.png +0 -0
- assets/example_image/typical_misc_fireplace.png +0 -0
- assets/example_image/typical_misc_gate.png +0 -0
- assets/example_image/typical_misc_lantern.png +0 -0
- assets/example_image/typical_misc_magicbook.png +0 -0
- assets/example_image/typical_misc_mailbox.png +0 -0
- assets/example_image/typical_misc_monster_chest.png +0 -0
- assets/example_image/typical_misc_paper_machine.png +0 -0
- assets/example_image/typical_misc_phonograph.png +0 -0
- assets/example_image/typical_misc_portal2.png +0 -0
- assets/example_image/typical_misc_storage_chest.png +0 -0
- assets/example_image/typical_misc_telephone.png +0 -0
- assets/example_image/typical_misc_television.png +0 -0
- assets/example_image/typical_misc_workbench.png +0 -0
- assets/example_image/typical_vehicle_biplane.png +0 -0
- assets/example_image/typical_vehicle_bulldozer.png +0 -0
- assets/example_image/typical_vehicle_cart.png +0 -0
- assets/example_image/typical_vehicle_excavator.png +0 -0
- assets/example_image/typical_vehicle_helicopter.png +0 -0
- assets/example_image/typical_vehicle_locomotive.png +0 -0
- assets/example_image/typical_vehicle_pirate_ship.png +0 -0
- assets/example_image/weatherworn_misc_paper_machine3.png +0 -0
- assets/example_multi_image/character_1.png +0 -0
- assets/example_multi_image/character_2.png +0 -0
- assets/example_multi_image/character_3.png +0 -0
- assets/example_multi_image/mushroom_1.png +0 -0
- assets/example_multi_image/mushroom_2.png +0 -0
- assets/example_multi_image/mushroom_3.png +0 -0
    	
        .gitattributes
    ADDED
    
    | @@ -0,0 +1,36 @@ | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
|  | |
| 1 | 
            +
            *.7z filter=lfs diff=lfs merge=lfs -text
         | 
| 2 | 
            +
            *.arrow filter=lfs diff=lfs merge=lfs -text
         | 
| 3 | 
            +
            *.bin filter=lfs diff=lfs merge=lfs -text
         | 
| 4 | 
            +
            *.bz2 filter=lfs diff=lfs merge=lfs -text
         | 
| 5 | 
            +
            *.ckpt filter=lfs diff=lfs merge=lfs -text
         | 
| 6 | 
            +
            *.ftz filter=lfs diff=lfs merge=lfs -text
         | 
| 7 | 
            +
            *.gz filter=lfs diff=lfs merge=lfs -text
         | 
| 8 | 
            +
            *.h5 filter=lfs diff=lfs merge=lfs -text
         | 
| 9 | 
            +
            *.joblib filter=lfs diff=lfs merge=lfs -text
         | 
| 10 | 
            +
            *.lfs.* filter=lfs diff=lfs merge=lfs -text
         | 
| 11 | 
            +
            *.mlmodel filter=lfs diff=lfs merge=lfs -text
         | 
| 12 | 
            +
            *.model filter=lfs diff=lfs merge=lfs -text
         | 
| 13 | 
            +
            *.msgpack filter=lfs diff=lfs merge=lfs -text
         | 
| 14 | 
            +
            *.npy filter=lfs diff=lfs merge=lfs -text
         | 
| 15 | 
            +
            *.npz filter=lfs diff=lfs merge=lfs -text
         | 
| 16 | 
            +
            *.onnx filter=lfs diff=lfs merge=lfs -text
         | 
| 17 | 
            +
            *.ot filter=lfs diff=lfs merge=lfs -text
         | 
| 18 | 
            +
            *.parquet filter=lfs diff=lfs merge=lfs -text
         | 
| 19 | 
            +
            *.pb filter=lfs diff=lfs merge=lfs -text
         | 
| 20 | 
            +
            *.pickle filter=lfs diff=lfs merge=lfs -text
         | 
| 21 | 
            +
            *.pkl filter=lfs diff=lfs merge=lfs -text
         | 
| 22 | 
            +
            *.pt filter=lfs diff=lfs merge=lfs -text
         | 
| 23 | 
            +
            *.pth filter=lfs diff=lfs merge=lfs -text
         | 
| 24 | 
            +
            *.rar filter=lfs diff=lfs merge=lfs -text
         | 
| 25 | 
            +
            *.safetensors filter=lfs diff=lfs merge=lfs -text
         | 
| 26 | 
            +
            saved_model/**/* filter=lfs diff=lfs merge=lfs -text
         | 
| 27 | 
            +
            *.tar.* filter=lfs diff=lfs merge=lfs -text
         | 
| 28 | 
            +
            *.tar filter=lfs diff=lfs merge=lfs -text
         | 
| 29 | 
            +
            *.tflite filter=lfs diff=lfs merge=lfs -text
         | 
| 30 | 
            +
            *.tgz filter=lfs diff=lfs merge=lfs -text
         | 
| 31 | 
            +
            *.wasm filter=lfs diff=lfs merge=lfs -text
         | 
| 32 | 
            +
            *.xz filter=lfs diff=lfs merge=lfs -text
         | 
| 33 | 
            +
            *.zip filter=lfs diff=lfs merge=lfs -text
         | 
| 34 | 
            +
            *.zst filter=lfs diff=lfs merge=lfs -text
         | 
| 35 | 
            +
            *tfevents* filter=lfs diff=lfs merge=lfs -text
         | 
| 36 | 
            +
            wheels/nvdiffrast-0.3.3-cp310-cp310-linux_x86_64.whl filter=lfs diff=lfs merge=lfs -text
         | 
    	
        README.md
    ADDED
    
    | @@ -0,0 +1,16 @@ | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
|  | |
| 1 | 
            +
            ---
         | 
| 2 | 
            +
            title: TRELLIS
         | 
| 3 | 
            +
            emoji: 🏢
         | 
| 4 | 
            +
            colorFrom: indigo
         | 
| 5 | 
            +
            colorTo: blue
         | 
| 6 | 
            +
            sdk: gradio
         | 
| 7 | 
            +
            sdk_version: 4.44.1
         | 
| 8 | 
            +
            app_file: app.py
         | 
| 9 | 
            +
            pinned: false
         | 
| 10 | 
            +
            license: mit
         | 
| 11 | 
            +
            short_description: Scalable and Versatile 3D Generation from images
         | 
| 12 | 
            +
            ---
         | 
| 13 | 
            +
             | 
| 14 | 
            +
            Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
         | 
| 15 | 
            +
             | 
| 16 | 
            +
            Paper: https://huggingface.co/papers/2412.01506
         | 
    	
        app.py
    ADDED
    
    | @@ -0,0 +1,231 @@ | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
|  | |
| 1 | 
            +
            import gradio as gr
         | 
| 2 | 
            +
            import spaces
         | 
| 3 | 
            +
            from gradio_litmodel3d import LitModel3D
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            import os
         | 
| 6 | 
            +
            import shutil
         | 
| 7 | 
            +
            os.environ['SPCONV_ALGO'] = 'native'
         | 
| 8 | 
            +
            from typing import *
         | 
| 9 | 
            +
            import torch
         | 
| 10 | 
            +
            import numpy as np
         | 
| 11 | 
            +
            import imageio
         | 
| 12 | 
            +
            from PIL import Image
         | 
| 13 | 
            +
            from trellis.pipelines import TrellisImageTo3DPipeline
         | 
| 14 | 
            +
            from trellis.utils import render_utils
         | 
| 15 | 
            +
            import trimesh
         | 
| 16 | 
            +
            import tempfile
         | 
| 17 | 
            +
             | 
| 18 | 
            +
            MAX_SEED = np.iinfo(np.int32).max
         | 
| 19 | 
            +
            TMP_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'tmp')
         | 
| 20 | 
            +
            os.makedirs(TMP_DIR, exist_ok=True)
         | 
| 21 | 
            +
             | 
| 22 | 
            +
            def preprocess_mesh(mesh_prompt):
         | 
| 23 | 
            +
                print("Processing mesh")
         | 
| 24 | 
            +
                trimesh_mesh = trimesh.load_mesh(mesh_prompt)
         | 
| 25 | 
            +
                trimesh_mesh.export(mesh_prompt+'.glb')
         | 
| 26 | 
            +
                return mesh_prompt+'.glb'
         | 
| 27 | 
            +
             | 
| 28 | 
            +
            def preprocess_image(image):
         | 
| 29 | 
            +
                if image is None:
         | 
| 30 | 
            +
                    return None
         | 
| 31 | 
            +
                image = pipeline.preprocess_image(image, resolution=1024)
         | 
| 32 | 
            +
                return image
         | 
| 33 | 
            +
             | 
| 34 | 
            +
            @spaces.GPU
         | 
| 35 | 
            +
            def generate_3d(image, seed=-1,  
         | 
| 36 | 
            +
                            ss_guidance_strength=3, ss_sampling_steps=50,
         | 
| 37 | 
            +
                            slat_guidance_strength=3, slat_sampling_steps=6,):
         | 
| 38 | 
            +
                if image is None:
         | 
| 39 | 
            +
                    return None, None, None
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                if seed == -1:
         | 
| 42 | 
            +
                    seed = np.random.randint(0, MAX_SEED)
         | 
| 43 | 
            +
                
         | 
| 44 | 
            +
                image = pipeline.preprocess_image(image, resolution=1024)
         | 
| 45 | 
            +
                #normal_image = normal_predictor(image, resolution=768, match_input_resolution=True, data_type='object')
         | 
| 46 | 
            +
                normal_image = image
         | 
| 47 | 
            +
                outputs = pipeline.run(
         | 
| 48 | 
            +
                    normal_image,
         | 
| 49 | 
            +
                    seed=seed,
         | 
| 50 | 
            +
                    formats=["mesh",],
         | 
| 51 | 
            +
                    preprocess_image=False,
         | 
| 52 | 
            +
                    sparse_structure_sampler_params={
         | 
| 53 | 
            +
                        "steps": ss_sampling_steps,
         | 
| 54 | 
            +
                        "cfg_strength": ss_guidance_strength,
         | 
| 55 | 
            +
                    },
         | 
| 56 | 
            +
                    slat_sampler_params={
         | 
| 57 | 
            +
                        "steps": slat_sampling_steps,
         | 
| 58 | 
            +
                        "cfg_strength": slat_guidance_strength,
         | 
| 59 | 
            +
                    },
         | 
| 60 | 
            +
                )
         | 
| 61 | 
            +
                generated_mesh = outputs['mesh'][0]
         | 
| 62 | 
            +
                
         | 
| 63 | 
            +
                # Save outputs
         | 
| 64 | 
            +
                import datetime
         | 
| 65 | 
            +
                output_id = datetime.datetime.now().strftime("%Y%m%d%H%M%S")
         | 
| 66 | 
            +
                os.makedirs(os.path.join(TMP_DIR, output_id), exist_ok=True)
         | 
| 67 | 
            +
                mesh_path = f"{TMP_DIR}/{output_id}/mesh.glb"
         | 
| 68 | 
            +
                
         | 
| 69 | 
            +
                render_results = render_utils.render_video(generated_mesh, resolution=1024, ssaa=1, num_frames=8, pitch=0.25, inverse_direction=True)
         | 
| 70 | 
            +
                def combine_diagonal(color_np, normal_np):
         | 
| 71 | 
            +
                    # Convert images to numpy arrays
         | 
| 72 | 
            +
                    h, w, c = color_np.shape
         | 
| 73 | 
            +
                    # Create a boolean mask that is True for pixels where x > y (diagonally)
         | 
| 74 | 
            +
                    mask = np.fromfunction(lambda y, x: x > y, (h, w))
         | 
| 75 | 
            +
                    mask = mask.astype(bool)
         | 
| 76 | 
            +
                    mask = np.stack([mask] * c, axis=-1)
         | 
| 77 | 
            +
                    # Where mask is True take color, else normal
         | 
| 78 | 
            +
                    combined_np = np.where(mask, color_np, normal_np)
         | 
| 79 | 
            +
                    return Image.fromarray(combined_np)
         | 
| 80 | 
            +
             | 
| 81 | 
            +
                preview_images = [combine_diagonal(c, n) for c, n in zip(render_results['color'], render_results['normal'])]
         | 
| 82 | 
            +
                
         | 
| 83 | 
            +
                # Export mesh
         | 
| 84 | 
            +
                trimesh_mesh = generated_mesh.to_trimesh(transform_pose=True)
         | 
| 85 | 
            +
             | 
| 86 | 
            +
                trimesh_mesh.export(mesh_path)
         | 
| 87 | 
            +
             | 
| 88 | 
            +
                return preview_images, normal_image, mesh_path, mesh_path
         | 
| 89 | 
            +
             | 
| 90 | 
            +
            def convert_mesh(mesh_path, export_format):
         | 
| 91 | 
            +
                """Download the mesh in the selected format."""
         | 
| 92 | 
            +
                if not mesh_path:
         | 
| 93 | 
            +
                    return None
         | 
| 94 | 
            +
                
         | 
| 95 | 
            +
                # Create a temporary file to store the mesh data
         | 
| 96 | 
            +
                temp_file = tempfile.NamedTemporaryFile(suffix=f".{export_format}", delete=False)
         | 
| 97 | 
            +
                temp_file_path = temp_file.name
         | 
| 98 | 
            +
                
         | 
| 99 | 
            +
                new_mesh_path = mesh_path.replace(".glb", f".{export_format}")
         | 
| 100 | 
            +
                mesh = trimesh.load_mesh(mesh_path)
         | 
| 101 | 
            +
                mesh.export(temp_file_path)  # Export to the temporary file
         | 
| 102 | 
            +
                
         | 
| 103 | 
            +
                return temp_file_path # Return the path to the temporary file
         | 
| 104 | 
            +
             | 
| 105 | 
            +
            # Create the Gradio interface with improved layout
         | 
| 106 | 
            +
            with gr.Blocks(css="footer {visibility: hidden}") as demo:
         | 
| 107 | 
            +
                gr.Markdown(
         | 
| 108 | 
            +
                    """
         | 
| 109 | 
            +
                    <h1 style='text-align: center;'>Hi3DGen: High-fidelity 3D Geometry Generation from Images via Normal Bridging</h1>
         | 
| 110 | 
            +
                    <p style='text-align: center;'>
         | 
| 111 | 
            +
                        <strong>V0.1, Introduced By 
         | 
| 112 | 
            +
                        <a href="https://gaplab.cuhk.edu.cn/" target="_blank">GAP Lab</a> from CUHKSZ and 
         | 
| 113 | 
            +
                        <a href="https://www.nvsgames.cn/" target="_blank">Game-AIGC team</a> From ByteDance</strong>
         | 
| 114 | 
            +
                    </p>
         | 
| 115 | 
            +
                    """
         | 
| 116 | 
            +
                )
         | 
| 117 | 
            +
                
         | 
| 118 | 
            +
                with gr.Row():
         | 
| 119 | 
            +
                    gr.Markdown("""
         | 
| 120 | 
            +
                                <p align="center">
         | 
| 121 | 
            +
                                <a title="Website" href="https://stable-x.github.io/Hi3DGen/" target="_blank" rel="noopener noreferrer" style="display: inline-block;">
         | 
| 122 | 
            +
                                    <img src="https://www.obukhov.ai/img/badges/badge-website.svg">
         | 
| 123 | 
            +
                                </a>
         | 
| 124 | 
            +
                                <a title="arXiv" href="" target="_blank" rel="noopener noreferrer" style="display: inline-block;">
         | 
| 125 | 
            +
                                    <img src="https://www.obukhov.ai/img/badges/badge-pdf.svg">
         | 
| 126 | 
            +
                                </a>
         | 
| 127 | 
            +
                                <a title="Github" href="https://github.com/bytedance/Hi3DGen" target="_blank" rel="noopener noreferrer" style="display: inline-block;">
         | 
| 128 | 
            +
                                    <img src="https://img.shields.io/github/stars/bytedance/Hi3DGen?label=GitHub%20%E2%98%85&logo=github&color=C8C" alt="badge-github-stars">
         | 
| 129 | 
            +
                                </a>
         | 
| 130 | 
            +
                                <a title="Social" href="https://x.com/ychngji6" target="_blank" rel="noopener noreferrer" style="display: inline-block;">
         | 
| 131 | 
            +
                                    <img src="https://www.obukhov.ai/img/badges/badge-social.svg" alt="social">
         | 
| 132 | 
            +
                                </a>
         | 
| 133 | 
            +
                                </p>
         | 
| 134 | 
            +
                                """)
         | 
| 135 | 
            +
             | 
| 136 | 
            +
                with gr.Row():
         | 
| 137 | 
            +
                    with gr.Column(scale=1):
         | 
| 138 | 
            +
                        with gr.Tabs():
         | 
| 139 | 
            +
                            
         | 
| 140 | 
            +
                            with gr.Tab("Single Image"):
         | 
| 141 | 
            +
                                with gr.Row():
         | 
| 142 | 
            +
                                    image_prompt = gr.Image(label="Image Prompt", image_mode="RGBA", type="pil")
         | 
| 143 | 
            +
                                    normal_output = gr.Image(label="Normal Bridge", image_mode="RGBA", type="pil")
         | 
| 144 | 
            +
                                    
         | 
| 145 | 
            +
                            with gr.Tab("Multiple Images"):
         | 
| 146 | 
            +
                                gr.Markdown("<div style='text-align: center; padding: 40px; font-size: 24px;'>Multiple Images functionality is coming soon!</div>")
         | 
| 147 | 
            +
                                    
         | 
| 148 | 
            +
                        with gr.Accordion("Advanced Settings", open=False):
         | 
| 149 | 
            +
                            seed = gr.Slider(-1, MAX_SEED, label="Seed", value=0, step=1)
         | 
| 150 | 
            +
                            gr.Markdown("#### Stage 1: Sparse Structure Generation")
         | 
| 151 | 
            +
                            with gr.Row():
         | 
| 152 | 
            +
                                ss_guidance_strength = gr.Slider(0.0, 10.0, label="Guidance Strength", value=3, step=0.1)
         | 
| 153 | 
            +
                                ss_sampling_steps = gr.Slider(1, 50, label="Sampling Steps", value=50, step=1)
         | 
| 154 | 
            +
                            gr.Markdown("#### Stage 2: Structured Latent Generation")
         | 
| 155 | 
            +
                            with gr.Row():
         | 
| 156 | 
            +
                                slat_guidance_strength = gr.Slider(0.0, 10.0, label="Guidance Strength", value=3.0, step=0.1)
         | 
| 157 | 
            +
                                slat_sampling_steps = gr.Slider(1, 50, label="Sampling Steps", value=6, step=1)
         | 
| 158 | 
            +
                                
         | 
| 159 | 
            +
                        with gr.Group():
         | 
| 160 | 
            +
                            with gr.Row():
         | 
| 161 | 
            +
                                gen_shape_btn = gr.Button("Generate Shape", size="lg", variant="primary")
         | 
| 162 | 
            +
                                    
         | 
| 163 | 
            +
                    # Right column - Output
         | 
| 164 | 
            +
                    with gr.Column(scale=1):
         | 
| 165 | 
            +
                        with gr.Tabs():
         | 
| 166 | 
            +
                            with gr.Tab("Preview"):
         | 
| 167 | 
            +
                                output_gallery = gr.Gallery(label="Examples", columns=4, rows=2, object_fit="contain", height="auto",show_label=False)
         | 
| 168 | 
            +
                            with gr.Tab("3D Model"):
         | 
| 169 | 
            +
                                with gr.Column():
         | 
| 170 | 
            +
                                    model_output = LitModel3D(label="3D Model Preview", exposure=10.0, height=300)
         | 
| 171 | 
            +
                                with gr.Column():
         | 
| 172 | 
            +
                                    export_format = gr.Dropdown(
         | 
| 173 | 
            +
                                        choices=["obj", "glb", "ply", "stl"],
         | 
| 174 | 
            +
                                        value="glb",
         | 
| 175 | 
            +
                                        label="File Format"
         | 
| 176 | 
            +
                                    )
         | 
| 177 | 
            +
                                    download_btn = gr.DownloadButton(label="Export Mesh", interactive=False)
         | 
| 178 | 
            +
                
         | 
| 179 | 
            +
                image_prompt.upload(
         | 
| 180 | 
            +
                    preprocess_image,
         | 
| 181 | 
            +
                    inputs=[image_prompt],
         | 
| 182 | 
            +
                    outputs=[image_prompt]
         | 
| 183 | 
            +
                )
         | 
| 184 | 
            +
                
         | 
| 185 | 
            +
                gen_shape_btn.click(
         | 
| 186 | 
            +
                    generate_3d,
         | 
| 187 | 
            +
                    inputs=[
         | 
| 188 | 
            +
                        image_prompt, seed,  
         | 
| 189 | 
            +
                        ss_guidance_strength, ss_sampling_steps,
         | 
| 190 | 
            +
                        slat_guidance_strength, slat_sampling_steps
         | 
| 191 | 
            +
                    ],
         | 
| 192 | 
            +
                    outputs=[output_gallery, normal_output, model_output, download_btn]
         | 
| 193 | 
            +
                ).then(
         | 
| 194 | 
            +
                    lambda: gr.Button(interactive=True),
         | 
| 195 | 
            +
                    outputs=[download_btn],
         | 
| 196 | 
            +
                )
         | 
| 197 | 
            +
                
         | 
| 198 | 
            +
                
         | 
| 199 | 
            +
                def update_download_button(mesh_path, export_format):
         | 
| 200 | 
            +
                    if not mesh_path:
         | 
| 201 | 
            +
                        return gr.File.update(value=None, interactive=False)
         | 
| 202 | 
            +
                    
         | 
| 203 | 
            +
                    download_path = convert_mesh(mesh_path, export_format)
         | 
| 204 | 
            +
                    return download_path
         | 
| 205 | 
            +
                
         | 
| 206 | 
            +
                export_format.change(
         | 
| 207 | 
            +
                    update_download_button,
         | 
| 208 | 
            +
                    inputs=[model_output, export_format],
         | 
| 209 | 
            +
                    outputs=[download_btn]
         | 
| 210 | 
            +
                ).then(
         | 
| 211 | 
            +
                    lambda: gr.Button(interactive=True),
         | 
| 212 | 
            +
                    outputs=[download_btn],
         | 
| 213 | 
            +
                )
         | 
| 214 | 
            +
                
         | 
| 215 | 
            +
                examples = gr.Examples(
         | 
| 216 | 
            +
                    examples=[
         | 
| 217 | 
            +
                        f'assets/example_image/{image}'
         | 
| 218 | 
            +
                        for image in os.listdir("assets/example_image")
         | 
| 219 | 
            +
                    ],
         | 
| 220 | 
            +
                    inputs=image_prompt,
         | 
| 221 | 
            +
                )
         | 
| 222 | 
            +
             | 
| 223 | 
            +
            if __name__ == "__main__":
         | 
| 224 | 
            +
                # Initialize pipeline
         | 
| 225 | 
            +
                pipeline = TrellisImageTo3DPipeline.from_pretrained("JeffreyXiang/TRELLIS-image-large")
         | 
| 226 | 
            +
                
         | 
| 227 | 
            +
                # Initialize normal predictor
         | 
| 228 | 
            +
                # normal_predictor = torch.hub.load("hugoycj/StableNormal", "StableNormal_turbo", trust_repo=True, yoso_version='yoso-normal-v1-8-1')
         | 
| 229 | 
            +
                
         | 
| 230 | 
            +
                # Launch the app
         | 
| 231 | 
            +
                demo.launch()
         | 
    	
        assets/example_image/T.png
    ADDED
    
    |   | 
    	
        assets/example_image/typical_building_building.png
    ADDED
    
    |   | 
    	
        assets/example_image/typical_building_castle.png
    ADDED
    
    |   | 
    	
        assets/example_image/typical_building_colorful_cottage.png
    ADDED
    
    |   | 
    	
        assets/example_image/typical_building_maya_pyramid.png
    ADDED
    
    |   | 
    	
        assets/example_image/typical_building_mushroom.png
    ADDED
    
    |   | 
    	
        assets/example_image/typical_building_space_station.png
    ADDED
    
    |   | 
    	
        assets/example_image/typical_creature_dragon.png
    ADDED
    
    |   | 
    	
        assets/example_image/typical_creature_elephant.png
    ADDED
    
    |   | 
    	
        assets/example_image/typical_creature_furry.png
    ADDED
    
    |   | 
    	
        assets/example_image/typical_creature_quadruped.png
    ADDED
    
    |   | 
    	
        assets/example_image/typical_creature_robot_crab.png
    ADDED
    
    |   | 
    	
        assets/example_image/typical_creature_robot_dinosour.png
    ADDED
    
    |   | 
    	
        assets/example_image/typical_creature_rock_monster.png
    ADDED
    
    |   | 
    	
        assets/example_image/typical_humanoid_block_robot.png
    ADDED
    
    |   | 
    	
        assets/example_image/typical_humanoid_dragonborn.png
    ADDED
    
    |   | 
    	
        assets/example_image/typical_humanoid_dwarf.png
    ADDED
    
    |   | 
    	
        assets/example_image/typical_humanoid_goblin.png
    ADDED
    
    |   | 
    	
        assets/example_image/typical_humanoid_mech.png
    ADDED
    
    |   | 
    	
        assets/example_image/typical_misc_crate.png
    ADDED
    
    |   | 
    	
        assets/example_image/typical_misc_fireplace.png
    ADDED
    
    |   | 
    	
        assets/example_image/typical_misc_gate.png
    ADDED
    
    |   | 
    	
        assets/example_image/typical_misc_lantern.png
    ADDED
    
    |   | 
    	
        assets/example_image/typical_misc_magicbook.png
    ADDED
    
    |   | 
    	
        assets/example_image/typical_misc_mailbox.png
    ADDED
    
    |   | 
    	
        assets/example_image/typical_misc_monster_chest.png
    ADDED
    
    |   | 
    	
        assets/example_image/typical_misc_paper_machine.png
    ADDED
    
    |   | 
    	
        assets/example_image/typical_misc_phonograph.png
    ADDED
    
    |   | 
    	
        assets/example_image/typical_misc_portal2.png
    ADDED
    
    |   | 
    	
        assets/example_image/typical_misc_storage_chest.png
    ADDED
    
    |   | 
    	
        assets/example_image/typical_misc_telephone.png
    ADDED
    
    |   | 
    	
        assets/example_image/typical_misc_television.png
    ADDED
    
    |   | 
    	
        assets/example_image/typical_misc_workbench.png
    ADDED
    
    |   | 
    	
        assets/example_image/typical_vehicle_biplane.png
    ADDED
    
    |   | 
    	
        assets/example_image/typical_vehicle_bulldozer.png
    ADDED
    
    |   | 
    	
        assets/example_image/typical_vehicle_cart.png
    ADDED
    
    |   | 
    	
        assets/example_image/typical_vehicle_excavator.png
    ADDED
    
    |   | 
    	
        assets/example_image/typical_vehicle_helicopter.png
    ADDED
    
    |   | 
    	
        assets/example_image/typical_vehicle_locomotive.png
    ADDED
    
    |   | 
    	
        assets/example_image/typical_vehicle_pirate_ship.png
    ADDED
    
    |   | 
    	
        assets/example_image/weatherworn_misc_paper_machine3.png
    ADDED
    
    |   | 
    	
        assets/example_multi_image/character_1.png
    ADDED
    
    |   | 
    	
        assets/example_multi_image/character_2.png
    ADDED
    
    |   | 
    	
        assets/example_multi_image/character_3.png
    ADDED
    
    |   | 
    	
        assets/example_multi_image/mushroom_1.png
    ADDED
    
    |   | 
    	
        assets/example_multi_image/mushroom_2.png
    ADDED
    
    |   | 
    	
        assets/example_multi_image/mushroom_3.png
    ADDED
    
    |   | 
