Stable-X commited on
Commit
168b252
·
0 Parent(s):

clean code

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .gitattributes +36 -0
  2. README.md +16 -0
  3. app.py +231 -0
  4. assets/example_image/T.png +0 -0
  5. assets/example_image/typical_building_building.png +0 -0
  6. assets/example_image/typical_building_castle.png +0 -0
  7. assets/example_image/typical_building_colorful_cottage.png +0 -0
  8. assets/example_image/typical_building_maya_pyramid.png +0 -0
  9. assets/example_image/typical_building_mushroom.png +0 -0
  10. assets/example_image/typical_building_space_station.png +0 -0
  11. assets/example_image/typical_creature_dragon.png +0 -0
  12. assets/example_image/typical_creature_elephant.png +0 -0
  13. assets/example_image/typical_creature_furry.png +0 -0
  14. assets/example_image/typical_creature_quadruped.png +0 -0
  15. assets/example_image/typical_creature_robot_crab.png +0 -0
  16. assets/example_image/typical_creature_robot_dinosour.png +0 -0
  17. assets/example_image/typical_creature_rock_monster.png +0 -0
  18. assets/example_image/typical_humanoid_block_robot.png +0 -0
  19. assets/example_image/typical_humanoid_dragonborn.png +0 -0
  20. assets/example_image/typical_humanoid_dwarf.png +0 -0
  21. assets/example_image/typical_humanoid_goblin.png +0 -0
  22. assets/example_image/typical_humanoid_mech.png +0 -0
  23. assets/example_image/typical_misc_crate.png +0 -0
  24. assets/example_image/typical_misc_fireplace.png +0 -0
  25. assets/example_image/typical_misc_gate.png +0 -0
  26. assets/example_image/typical_misc_lantern.png +0 -0
  27. assets/example_image/typical_misc_magicbook.png +0 -0
  28. assets/example_image/typical_misc_mailbox.png +0 -0
  29. assets/example_image/typical_misc_monster_chest.png +0 -0
  30. assets/example_image/typical_misc_paper_machine.png +0 -0
  31. assets/example_image/typical_misc_phonograph.png +0 -0
  32. assets/example_image/typical_misc_portal2.png +0 -0
  33. assets/example_image/typical_misc_storage_chest.png +0 -0
  34. assets/example_image/typical_misc_telephone.png +0 -0
  35. assets/example_image/typical_misc_television.png +0 -0
  36. assets/example_image/typical_misc_workbench.png +0 -0
  37. assets/example_image/typical_vehicle_biplane.png +0 -0
  38. assets/example_image/typical_vehicle_bulldozer.png +0 -0
  39. assets/example_image/typical_vehicle_cart.png +0 -0
  40. assets/example_image/typical_vehicle_excavator.png +0 -0
  41. assets/example_image/typical_vehicle_helicopter.png +0 -0
  42. assets/example_image/typical_vehicle_locomotive.png +0 -0
  43. assets/example_image/typical_vehicle_pirate_ship.png +0 -0
  44. assets/example_image/weatherworn_misc_paper_machine3.png +0 -0
  45. assets/example_multi_image/character_1.png +0 -0
  46. assets/example_multi_image/character_2.png +0 -0
  47. assets/example_multi_image/character_3.png +0 -0
  48. assets/example_multi_image/mushroom_1.png +0 -0
  49. assets/example_multi_image/mushroom_2.png +0 -0
  50. 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