Spaces:
Sleeping
Sleeping
Update gradio_app.py
Browse files- gradio_app.py +39 -78
gradio_app.py
CHANGED
@@ -18,8 +18,6 @@ import sys
|
|
18 |
sys.path.insert(0, './hy3dshape')
|
19 |
sys.path.insert(0, './hy3dpaint')
|
20 |
|
21 |
-
pythonpath = sys.executable
|
22 |
-
print(pythonpath)
|
23 |
|
24 |
try:
|
25 |
from torchvision_fix import apply_fix
|
@@ -52,7 +50,7 @@ from hy3dpaint.convert_utils import create_glb_with_pbr_materials
|
|
52 |
|
53 |
|
54 |
MAX_SEED = 1e7
|
55 |
-
ENV = "
|
56 |
if ENV == 'Huggingface':
|
57 |
"""
|
58 |
Setup environment for running on Huggingface platform.
|
@@ -67,65 +65,11 @@ if ENV == 'Huggingface':
|
|
67 |
with the specified directory structure.
|
68 |
"""
|
69 |
import os, spaces, subprocess, sys, shlex
|
70 |
-
|
71 |
-
|
72 |
-
|
73 |
-
|
74 |
-
|
75 |
-
CUDA_TOOLKIT_FILE = "/tmp/%s" % os.path.basename(CUDA_TOOLKIT_URL)
|
76 |
-
subprocess.call(["wget", "-q", CUDA_TOOLKIT_URL, "-O", CUDA_TOOLKIT_FILE])
|
77 |
-
subprocess.call(["chmod", "+x", CUDA_TOOLKIT_FILE])
|
78 |
-
subprocess.call([CUDA_TOOLKIT_FILE, "--silent", "--toolkit"])
|
79 |
-
|
80 |
-
os.environ["CUDA_HOME"] = "/usr/local/cuda"
|
81 |
-
os.environ["PATH"] = "%s/bin:%s" % (os.environ["CUDA_HOME"], os.environ["PATH"])
|
82 |
-
os.environ["LD_LIBRARY_PATH"] = "%s/lib:%s" % (
|
83 |
-
os.environ["CUDA_HOME"],
|
84 |
-
"" if "LD_LIBRARY_PATH" not in os.environ else os.environ["LD_LIBRARY_PATH"],
|
85 |
-
)
|
86 |
-
# Fix: arch_list[-1] += '+PTX'; IndexError: list index out of range
|
87 |
-
os.environ["TORCH_CUDA_ARCH_LIST"] = "8.0;8.6"
|
88 |
-
|
89 |
-
def prepare_env():
|
90 |
-
# print('install custom')
|
91 |
-
# os.system(f"cd /home/user/app/hy3dpaint/custom_rasterizer && {pythonpath} -m pip install -e .")
|
92 |
-
# os.system(f"cd /home/user/app/hy3dpaint/packages/custom_rasterizer && pip install -e .")
|
93 |
-
subprocess.run(shlex.split("pip install custom_rasterizer-0.1-cp310-cp310-linux_x86_64.whl"), check=True)
|
94 |
-
|
95 |
-
print("cd /home/user/app/hy3dpaint/differentiable_renderer/ && bash compile_mesh_painter.sh")
|
96 |
-
os.system("cd /home/user/app/hy3dpaint/DifferentiableRenderer && bash compile_mesh_painter.sh")
|
97 |
-
# print("wget https://github.com/xinntao/Real-ESRGAN/releases/download/v0.1.0/RealESRGAN_x4plus.pth -P /home/user/app/hy3dpaint/ckpt")
|
98 |
-
# os.system("wget https://github.com/xinntao/Real-ESRGAN/releases/download/v0.1.0/RealESRGAN_x4plus.pth -P /home/user/app/hy3dpaint/ckpt")
|
99 |
-
|
100 |
-
def check():
|
101 |
-
import custom_rasterizer
|
102 |
-
print(type(custom_rasterizer))
|
103 |
-
print(dir(custom_rasterizer))
|
104 |
-
print(getattr(custom_rasterizer, '__file__', None))
|
105 |
-
|
106 |
-
package_dir = None
|
107 |
-
if hasattr(custom_rasterizer, '__file__') and custom_rasterizer.__file__:
|
108 |
-
package_dir = os.path.dirname(custom_rasterizer.__file__)
|
109 |
-
elif hasattr(custom_rasterizer, '__path__'):
|
110 |
-
package_dir = list(custom_rasterizer.__path__)[0]
|
111 |
-
else:
|
112 |
-
raise RuntimeError("Cannot determine package path")
|
113 |
-
print(package_dir)
|
114 |
-
|
115 |
-
for root, dirs, files in os.walk(package_dir):
|
116 |
-
level = root.replace(package_dir, '').count(os.sep)
|
117 |
-
indent = ' ' * 4 * level
|
118 |
-
print(f"{indent}{os.path.basename(root)}/")
|
119 |
-
subindent = ' ' * 4 * (level + 1)
|
120 |
-
for f in files:
|
121 |
-
print(f"{subindent}{f}")
|
122 |
-
|
123 |
-
# print(torch.__version__)
|
124 |
-
# install_cuda_toolkit()
|
125 |
-
print(torch.__version__)
|
126 |
-
prepare_env()
|
127 |
-
check()
|
128 |
-
|
129 |
else:
|
130 |
"""
|
131 |
Define a dummy `spaces` module with a GPU decorator class for local environment.
|
@@ -378,7 +322,7 @@ def _gen_shape(
|
|
378 |
main_image = image if not MV_MODE else image['front']
|
379 |
return mesh, main_image, save_folder, stats, seed
|
380 |
|
381 |
-
@spaces.GPU(duration=
|
382 |
def generation_all(
|
383 |
caption=None,
|
384 |
image=None,
|
@@ -395,6 +339,8 @@ def generation_all(
|
|
395 |
randomize_seed: bool = False,
|
396 |
):
|
397 |
start_time_0 = time.time()
|
|
|
|
|
398 |
mesh, image, save_folder, stats, seed = _gen_shape(
|
399 |
caption,
|
400 |
image,
|
@@ -410,8 +356,12 @@ def generation_all(
|
|
410 |
num_chunks=num_chunks,
|
411 |
randomize_seed=randomize_seed,
|
412 |
)
|
|
|
|
|
413 |
path = export_mesh(mesh, save_folder, textured=False)
|
414 |
|
|
|
|
|
415 |
|
416 |
print(path)
|
417 |
print('='*40)
|
@@ -423,10 +373,18 @@ def generation_all(
|
|
423 |
# stats['time']['postprocessing'] = time.time() - tmp_time
|
424 |
|
425 |
tmp_time = time.time()
|
|
|
|
|
426 |
mesh = face_reduce_worker(mesh)
|
|
|
|
|
427 |
|
428 |
# path = export_mesh(mesh, save_folder, textured=False, type='glb')
|
|
|
|
|
429 |
path = export_mesh(mesh, save_folder, textured=False, type='obj') # 这样操作也会 core dump
|
|
|
|
|
430 |
|
431 |
logger.info("---Face Reduction takes %s seconds ---" % (time.time() - tmp_time))
|
432 |
stats['time']['face reduction'] = time.time() - tmp_time
|
@@ -434,7 +392,11 @@ def generation_all(
|
|
434 |
tmp_time = time.time()
|
435 |
|
436 |
text_path = os.path.join(save_folder, f'textured_mesh.obj')
|
|
|
|
|
437 |
path_textured = tex_pipeline(mesh_path=path, image_path=image, output_mesh_path=text_path, save_glb=False)
|
|
|
|
|
438 |
|
439 |
logger.info("---Texture Generation takes %s seconds ---" % (time.time() - tmp_time))
|
440 |
stats['time']['texture generation'] = time.time() - tmp_time
|
@@ -442,7 +404,11 @@ def generation_all(
|
|
442 |
tmp_time = time.time()
|
443 |
# Convert textured OBJ to GLB using obj2gltf with PBR support
|
444 |
glb_path_textured = os.path.join(save_folder, 'textured_mesh.glb')
|
|
|
|
|
445 |
conversion_success = quick_convert_with_obj2gltf(path_textured, glb_path_textured)
|
|
|
|
|
446 |
|
447 |
logger.info("---Convert textured OBJ to GLB takes %s seconds ---" % (time.time() - tmp_time))
|
448 |
stats['time']['convert textured OBJ to GLB'] = time.time() - tmp_time
|
@@ -797,7 +763,7 @@ if __name__ == '__main__':
|
|
797 |
parser.add_argument('--host', type=str, default='0.0.0.0')
|
798 |
parser.add_argument('--device', type=str, default='cuda')
|
799 |
parser.add_argument('--mc_algo', type=str, default='mc')
|
800 |
-
parser.add_argument('--cache-path', type=str, default='
|
801 |
parser.add_argument('--enable_t23d', action='store_true')
|
802 |
parser.add_argument('--disable_tex', action='store_true')
|
803 |
parser.add_argument('--enable_flashvdm', action='store_true')
|
@@ -869,24 +835,26 @@ if __name__ == '__main__':
|
|
869 |
HAS_TEXTUREGEN = True
|
870 |
|
871 |
except Exception as e:
|
|
|
|
|
872 |
print(f"Error loading texture generator: {e}")
|
873 |
print("Failed to load texture generator.")
|
874 |
print('Please try to install requirements by following README.md')
|
875 |
HAS_TEXTUREGEN = False
|
876 |
|
877 |
-
|
878 |
-
|
879 |
-
|
880 |
|
881 |
-
|
882 |
-
|
883 |
|
884 |
from hy3dshape import FaceReducer, FloaterRemover, DegenerateFaceRemover, MeshSimplifier, \
|
885 |
Hunyuan3DDiTFlowMatchingPipeline
|
886 |
from hy3dshape.pipelines import export_to_trimesh
|
887 |
-
from hy3dshape.
|
888 |
|
889 |
-
rmbg_worker =
|
890 |
i23d_worker = Hunyuan3DDiTFlowMatchingPipeline.from_pretrained(
|
891 |
args.model_path,
|
892 |
subfolder=args.subfolder,
|
@@ -915,13 +883,6 @@ if __name__ == '__main__':
|
|
915 |
|
916 |
if args.low_vram_mode:
|
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
|
924 |
-
from spaces import zero
|
925 |
-
zero.startup()
|
926 |
-
|
927 |
uvicorn.run(app, host=args.host, port=args.port)
|
|
|
18 |
sys.path.insert(0, './hy3dshape')
|
19 |
sys.path.insert(0, './hy3dpaint')
|
20 |
|
|
|
|
|
21 |
|
22 |
try:
|
23 |
from torchvision_fix import apply_fix
|
|
|
50 |
|
51 |
|
52 |
MAX_SEED = 1e7
|
53 |
+
ENV = "Local" # "Huggingface"
|
54 |
if ENV == 'Huggingface':
|
55 |
"""
|
56 |
Setup environment for running on Huggingface platform.
|
|
|
65 |
with the specified directory structure.
|
66 |
"""
|
67 |
import os, spaces, subprocess, sys, shlex
|
68 |
+
print("cd /home/user/app/hy3dgen/texgen/differentiable_renderer/ && bash compile_mesh_painter.sh")
|
69 |
+
os.system("cd /home/user/app/hy3dgen/texgen/differentiable_renderer/ && bash compile_mesh_painter.sh")
|
70 |
+
print('install custom')
|
71 |
+
subprocess.run(shlex.split("pip install custom_rasterizer-0.1-cp310-cp310-linux_x86_64.whl"),
|
72 |
+
check=True)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
73 |
else:
|
74 |
"""
|
75 |
Define a dummy `spaces` module with a GPU decorator class for local environment.
|
|
|
322 |
main_image = image if not MV_MODE else image['front']
|
323 |
return mesh, main_image, save_folder, stats, seed
|
324 |
|
325 |
+
@spaces.GPU(duration=60)
|
326 |
def generation_all(
|
327 |
caption=None,
|
328 |
image=None,
|
|
|
339 |
randomize_seed: bool = False,
|
340 |
):
|
341 |
start_time_0 = time.time()
|
342 |
+
print("DEBUG: Starting generation_all...")
|
343 |
+
sys.stdout.flush()
|
344 |
mesh, image, save_folder, stats, seed = _gen_shape(
|
345 |
caption,
|
346 |
image,
|
|
|
356 |
num_chunks=num_chunks,
|
357 |
randomize_seed=randomize_seed,
|
358 |
)
|
359 |
+
print("DEBUG: _gen_shape finished.")
|
360 |
+
sys.stdout.flush()
|
361 |
path = export_mesh(mesh, save_folder, textured=False)
|
362 |
|
363 |
+
print("DEBUG: Initial export_mesh finished.")
|
364 |
+
sys.stdout.flush()
|
365 |
|
366 |
print(path)
|
367 |
print('='*40)
|
|
|
373 |
# stats['time']['postprocessing'] = time.time() - tmp_time
|
374 |
|
375 |
tmp_time = time.time()
|
376 |
+
print("DEBUG: Starting face_reduce_worker...")
|
377 |
+
sys.stdout.flush()
|
378 |
mesh = face_reduce_worker(mesh)
|
379 |
+
print("DEBUG: face_reduce_worker finished.")
|
380 |
+
sys.stdout.flush()
|
381 |
|
382 |
# path = export_mesh(mesh, save_folder, textured=False, type='glb')
|
383 |
+
print("DEBUG: Starting second export_mesh (obj)...")
|
384 |
+
sys.stdout.flush()
|
385 |
path = export_mesh(mesh, save_folder, textured=False, type='obj') # 这样操作也会 core dump
|
386 |
+
print("DEBUG: Second export_mesh (obj) finished.")
|
387 |
+
sys.stdout.flush()
|
388 |
|
389 |
logger.info("---Face Reduction takes %s seconds ---" % (time.time() - tmp_time))
|
390 |
stats['time']['face reduction'] = time.time() - tmp_time
|
|
|
392 |
tmp_time = time.time()
|
393 |
|
394 |
text_path = os.path.join(save_folder, f'textured_mesh.obj')
|
395 |
+
print("DEBUG: Starting tex_pipeline...")
|
396 |
+
sys.stdout.flush()
|
397 |
path_textured = tex_pipeline(mesh_path=path, image_path=image, output_mesh_path=text_path, save_glb=False)
|
398 |
+
print("DEBUG: tex_pipeline finished.")
|
399 |
+
sys.stdout.flush()
|
400 |
|
401 |
logger.info("---Texture Generation takes %s seconds ---" % (time.time() - tmp_time))
|
402 |
stats['time']['texture generation'] = time.time() - tmp_time
|
|
|
404 |
tmp_time = time.time()
|
405 |
# Convert textured OBJ to GLB using obj2gltf with PBR support
|
406 |
glb_path_textured = os.path.join(save_folder, 'textured_mesh.glb')
|
407 |
+
print("DEBUG: Starting quick_convert_with_obj2gltf...")
|
408 |
+
sys.stdout.flush()
|
409 |
conversion_success = quick_convert_with_obj2gltf(path_textured, glb_path_textured)
|
410 |
+
print("DEBUG: quick_convert_with_obj2gltf finished.")
|
411 |
+
sys.stdout.flush()
|
412 |
|
413 |
logger.info("---Convert textured OBJ to GLB takes %s seconds ---" % (time.time() - tmp_time))
|
414 |
stats['time']['convert textured OBJ to GLB'] = time.time() - tmp_time
|
|
|
763 |
parser.add_argument('--host', type=str, default='0.0.0.0')
|
764 |
parser.add_argument('--device', type=str, default='cuda')
|
765 |
parser.add_argument('--mc_algo', type=str, default='mc')
|
766 |
+
parser.add_argument('--cache-path', type=str, default='./save_dir')
|
767 |
parser.add_argument('--enable_t23d', action='store_true')
|
768 |
parser.add_argument('--disable_tex', action='store_true')
|
769 |
parser.add_argument('--enable_flashvdm', action='store_true')
|
|
|
835 |
HAS_TEXTUREGEN = True
|
836 |
|
837 |
except Exception as e:
|
838 |
+
import traceback
|
839 |
+
traceback.print_exc()
|
840 |
print(f"Error loading texture generator: {e}")
|
841 |
print("Failed to load texture generator.")
|
842 |
print('Please try to install requirements by following README.md')
|
843 |
HAS_TEXTUREGEN = False
|
844 |
|
845 |
+
HAS_T2I = True
|
846 |
+
if args.enable_t23d:
|
847 |
+
from hy3dgen.text2image import HunyuanDiTPipeline
|
848 |
|
849 |
+
t2i_worker = HunyuanDiTPipeline('Tencent-Hunyuan/HunyuanDiT-v1.1-Diffusers-Distilled')
|
850 |
+
HAS_T2I = True
|
851 |
|
852 |
from hy3dshape import FaceReducer, FloaterRemover, DegenerateFaceRemover, MeshSimplifier, \
|
853 |
Hunyuan3DDiTFlowMatchingPipeline
|
854 |
from hy3dshape.pipelines import export_to_trimesh
|
855 |
+
from hy3dshape.birefnet_rembg import BiRefNetRemover
|
856 |
|
857 |
+
rmbg_worker = BiRefNetRemover()
|
858 |
i23d_worker = Hunyuan3DDiTFlowMatchingPipeline.from_pretrained(
|
859 |
args.model_path,
|
860 |
subfolder=args.subfolder,
|
|
|
883 |
|
884 |
if args.low_vram_mode:
|
885 |
torch.cuda.empty_cache()
|
|
|
886 |
demo = build_app()
|
887 |
app = gr.mount_gradio_app(app, demo, path="/")
|
|
|
|
|
|
|
|
|
|
|
|
|
888 |
uvicorn.run(app, host=args.host, port=args.port)
|