Spaces:
Runtime error
Runtime error
Chao Xu
commited on
Commit
·
5101aba
1
Parent(s):
2c4ee95
change elev and turn on autocast
Browse files- .gitignore +1 -0
- app.py +24 -33
- env.sh +0 -4
.gitignore
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
weights/
|
app.py
CHANGED
|
@@ -5,23 +5,24 @@ python gradio_new.py 0
|
|
| 5 |
'''
|
| 6 |
import os, sys
|
| 7 |
from huggingface_hub import snapshot_download
|
| 8 |
-
|
| 9 |
-
|
|
|
|
|
|
|
|
|
|
| 10 |
sys.path.append(code_dir)
|
| 11 |
|
| 12 |
elev_est_dir = os.path.join(code_dir, "one2345_elev_est/")
|
| 13 |
sys.path.append(elev_est_dir)
|
| 14 |
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
|
| 20 |
-
|
| 21 |
-
|
| 22 |
-
|
| 23 |
-
os.environ["IABN_FORCE_CUDA"] = "1"
|
| 24 |
-
subprocess.run(["pip", "install", "inplace_abn"])
|
| 25 |
|
| 26 |
import inspect
|
| 27 |
import shutil
|
|
@@ -36,13 +37,12 @@ import sys
|
|
| 36 |
from functools import partial
|
| 37 |
|
| 38 |
from lovely_numpy import lo
|
| 39 |
-
# from omegaconf import OmegaConf
|
| 40 |
import cv2
|
| 41 |
from PIL import Image
|
| 42 |
import trimesh
|
| 43 |
import tempfile
|
| 44 |
from zero123_utils import init_model, predict_stage1_gradio, zero123_infer
|
| 45 |
-
from sam_utils import sam_init,
|
| 46 |
from utils import image_preprocess_nosave, gen_poses
|
| 47 |
from one2345_elev_est.tools.estimate_wild_imgs import estimate_elev
|
| 48 |
from rembg import remove
|
|
@@ -51,7 +51,6 @@ _GPU_INDEX = 0
|
|
| 51 |
|
| 52 |
_TITLE = 'One-2-3-45: Any Single Image to 3D Mesh in 45 Seconds without Per-Shape Optimization'
|
| 53 |
|
| 54 |
-
# This demo allows you to generate novel viewpoints of an object depicted in an input image using a fine-tuned version of Stable Diffusion.
|
| 55 |
_DESCRIPTION = '''
|
| 56 |
We reconstruct a 3D textured mesh from a single image by initially predicting multi-view images and then lifting them to 3D.
|
| 57 |
'''
|
|
@@ -252,7 +251,7 @@ class CameraVisualizer:
|
|
| 252 |
|
| 253 |
|
| 254 |
def stage1_run(models, device, cam_vis, tmp_dir,
|
| 255 |
-
input_im, scale, ddim_steps, rerun_all=[],
|
| 256 |
*btn_retrys):
|
| 257 |
is_rerun = True if cam_vis is None else False
|
| 258 |
|
|
@@ -273,11 +272,12 @@ def stage1_run(models, device, cam_vis, tmp_dir,
|
|
| 273 |
output_ims_2 = predict_stage1_gradio(models['turncam'], input_im, save_path=stage1_dir, adjust_set=list(range(4,8)), device=device, ddim_steps=ddim_steps, scale=scale)
|
| 274 |
else:
|
| 275 |
output_ims_2 = predict_stage1_gradio(models['turncam'], input_im, save_path=stage1_dir, adjust_set=list(range(8,12)), device=device, ddim_steps=ddim_steps, scale=scale)
|
| 276 |
-
return (elev_output, new_fig, *output_ims, *output_ims_2)
|
| 277 |
else:
|
| 278 |
rerun_idx = [i for i in range(len(btn_retrys)) if btn_retrys[i]]
|
| 279 |
-
elev_output = estimate_elev(tmp_dir)
|
| 280 |
-
if elev_output > 75:
|
|
|
|
| 281 |
rerun_idx_in = [i if i < 4 else i+4 for i in rerun_idx]
|
| 282 |
else:
|
| 283 |
rerun_idx_in = rerun_idx
|
|
@@ -295,7 +295,7 @@ def stage1_run(models, device, cam_vis, tmp_dir,
|
|
| 295 |
def stage2_run(models, device, tmp_dir,
|
| 296 |
elev, scale, rerun_all=[], stage2_steps=50):
|
| 297 |
# print("elev", elev)
|
| 298 |
-
flag_lower_cam = int(elev["label"]) <= 75
|
| 299 |
is_rerun = True if rerun_all else False
|
| 300 |
if not is_rerun:
|
| 301 |
if flag_lower_cam:
|
|
@@ -529,8 +529,6 @@ def run_demo(
|
|
| 529 |
bbox_block = gr.Image(type='pil', label="Bounding box", interactive=False).style(height=300)
|
| 530 |
sam_block = gr.Image(type='pil', label="SAM output", interactive=False)
|
| 531 |
max_width = max_height = 256
|
| 532 |
-
# with gr.Row():
|
| 533 |
-
# gr.Markdown('After uploading the image, a bounding box will be generated automatically. If the result is not satisfactory, you can also use the slider below to manually select the object.')
|
| 534 |
with gr.Row():
|
| 535 |
x_min_slider = gr.Slider(
|
| 536 |
label="X min",
|
|
@@ -590,21 +588,16 @@ def run_demo(
|
|
| 590 |
label='Number of diffusion inference steps')
|
| 591 |
|
| 592 |
# with gr.Row():
|
| 593 |
-
run_btn = gr.Button('Run Generation', variant='primary')
|
| 594 |
# guide_title = gr.Markdown(_GUIDE_TITLE, visible=True)
|
| 595 |
guide_text = gr.Markdown(_USER_GUIDE, visible=True)
|
| 596 |
|
| 597 |
-
|
| 598 |
-
# height does not work [a bug]
|
| 599 |
-
mesh_output = gr.Model3D(clear_color=[0.0, 0.0, 0.0, 0.0], label="One-2-3-45's Textured Mesh", elem_id="model-3d-out") #.style(height=800)
|
| 600 |
|
| 601 |
with gr.Row(variant='panel'):
|
| 602 |
with gr.Column(scale=0.85):
|
| 603 |
with gr.Row():
|
| 604 |
-
|
| 605 |
-
elev_output = gr.Label(label='Estimated elevation / polar angle of the input image (degree, w.r.t. the Z axis)')
|
| 606 |
-
# with gr.Column(scale=1):
|
| 607 |
-
# theta_output = gr.Image(value="./theta_mini.png", interactive=False, show_label=False).style(width=100)
|
| 608 |
vis_output = gr.Plot(
|
| 609 |
label='Camera poses of the input view (red) and predicted views (blue)')
|
| 610 |
|
|
@@ -691,10 +684,8 @@ def run_demo(
|
|
| 691 |
# make regen_btn visible when any of the btn_retry is checked
|
| 692 |
for btn_retry in btn_retrys:
|
| 693 |
# Add the event handlers to the btn_retry buttons
|
| 694 |
-
# btn_retry.change(fn=on_retry_button_click, inputs=[*btn_retrys], outputs=regen_btn)
|
| 695 |
btn_retry.change(fn=on_retry_button_click, inputs=[*btn_retrys], outputs=[regen_view_btn, regen_mesh_btn])
|
| 696 |
|
| 697 |
-
|
| 698 |
|
| 699 |
run_btn.click(fn=partial(update_guide, _SAM), outputs=[guide_text]
|
| 700 |
).success(fn=partial(preprocess_run, predictor, models),
|
|
@@ -712,7 +703,7 @@ def run_demo(
|
|
| 712 |
|
| 713 |
|
| 714 |
regen_view_btn.click(fn=partial(stage1_run, models, device, None),
|
| 715 |
-
inputs=[tmp_dir, sam_block, scale_slider, steps_slider, rerun_idx, *btn_retrys],
|
| 716 |
outputs=[rerun_idx, *btn_retrys, *views]
|
| 717 |
).success(fn=partial(update_guide, _REGEN_1), outputs=[guide_text])
|
| 718 |
regen_mesh_btn.click(fn=partial(stage2_run, models, device),
|
|
|
|
| 5 |
'''
|
| 6 |
import os, sys
|
| 7 |
from huggingface_hub import snapshot_download
|
| 8 |
+
|
| 9 |
+
is_local_run = True
|
| 10 |
+
|
| 11 |
+
code_dir = snapshot_download("One-2-3-45/code", token=os.environ['TOKEN']) if not is_local_run else "../code"
|
| 12 |
+
|
| 13 |
sys.path.append(code_dir)
|
| 14 |
|
| 15 |
elev_est_dir = os.path.join(code_dir, "one2345_elev_est/")
|
| 16 |
sys.path.append(elev_est_dir)
|
| 17 |
|
| 18 |
+
if not is_local_run:
|
| 19 |
+
import subprocess
|
| 20 |
+
subprocess.run(["sh", os.path.join(elev_est_dir, "install.sh")], cwd=elev_est_dir)
|
| 21 |
+
# export TORCH_CUDA_ARCH_LIST="7.0;7.2;8.0;8.6"
|
| 22 |
+
# export IABN_FORCE_CUDA=1
|
| 23 |
+
os.environ["TORCH_CUDA_ARCH_LIST"] = "8.0;8.6"
|
| 24 |
+
os.environ["IABN_FORCE_CUDA"] = "1"
|
| 25 |
+
subprocess.run(["pip", "install", "inplace_abn"])
|
|
|
|
|
|
|
| 26 |
|
| 27 |
import inspect
|
| 28 |
import shutil
|
|
|
|
| 37 |
from functools import partial
|
| 38 |
|
| 39 |
from lovely_numpy import lo
|
|
|
|
| 40 |
import cv2
|
| 41 |
from PIL import Image
|
| 42 |
import trimesh
|
| 43 |
import tempfile
|
| 44 |
from zero123_utils import init_model, predict_stage1_gradio, zero123_infer
|
| 45 |
+
from sam_utils import sam_init, sam_out_nosave
|
| 46 |
from utils import image_preprocess_nosave, gen_poses
|
| 47 |
from one2345_elev_est.tools.estimate_wild_imgs import estimate_elev
|
| 48 |
from rembg import remove
|
|
|
|
| 51 |
|
| 52 |
_TITLE = 'One-2-3-45: Any Single Image to 3D Mesh in 45 Seconds without Per-Shape Optimization'
|
| 53 |
|
|
|
|
| 54 |
_DESCRIPTION = '''
|
| 55 |
We reconstruct a 3D textured mesh from a single image by initially predicting multi-view images and then lifting them to 3D.
|
| 56 |
'''
|
|
|
|
| 251 |
|
| 252 |
|
| 253 |
def stage1_run(models, device, cam_vis, tmp_dir,
|
| 254 |
+
input_im, scale, ddim_steps, elev=None, rerun_all=[],
|
| 255 |
*btn_retrys):
|
| 256 |
is_rerun = True if cam_vis is None else False
|
| 257 |
|
|
|
|
| 272 |
output_ims_2 = predict_stage1_gradio(models['turncam'], input_im, save_path=stage1_dir, adjust_set=list(range(4,8)), device=device, ddim_steps=ddim_steps, scale=scale)
|
| 273 |
else:
|
| 274 |
output_ims_2 = predict_stage1_gradio(models['turncam'], input_im, save_path=stage1_dir, adjust_set=list(range(8,12)), device=device, ddim_steps=ddim_steps, scale=scale)
|
| 275 |
+
return (90-elev_output, new_fig, *output_ims, *output_ims_2)
|
| 276 |
else:
|
| 277 |
rerun_idx = [i for i in range(len(btn_retrys)) if btn_retrys[i]]
|
| 278 |
+
# elev_output = estimate_elev(tmp_dir)
|
| 279 |
+
# if elev_output > 75:
|
| 280 |
+
if 90-elev >75:
|
| 281 |
rerun_idx_in = [i if i < 4 else i+4 for i in rerun_idx]
|
| 282 |
else:
|
| 283 |
rerun_idx_in = rerun_idx
|
|
|
|
| 295 |
def stage2_run(models, device, tmp_dir,
|
| 296 |
elev, scale, rerun_all=[], stage2_steps=50):
|
| 297 |
# print("elev", elev)
|
| 298 |
+
flag_lower_cam = 90-int(elev["label"]) <= 75
|
| 299 |
is_rerun = True if rerun_all else False
|
| 300 |
if not is_rerun:
|
| 301 |
if flag_lower_cam:
|
|
|
|
| 529 |
bbox_block = gr.Image(type='pil', label="Bounding box", interactive=False).style(height=300)
|
| 530 |
sam_block = gr.Image(type='pil', label="SAM output", interactive=False)
|
| 531 |
max_width = max_height = 256
|
|
|
|
|
|
|
| 532 |
with gr.Row():
|
| 533 |
x_min_slider = gr.Slider(
|
| 534 |
label="X min",
|
|
|
|
| 588 |
label='Number of diffusion inference steps')
|
| 589 |
|
| 590 |
# with gr.Row():
|
| 591 |
+
run_btn = gr.Button('Run Generation', variant='primary', interactive=False)
|
| 592 |
# guide_title = gr.Markdown(_GUIDE_TITLE, visible=True)
|
| 593 |
guide_text = gr.Markdown(_USER_GUIDE, visible=True)
|
| 594 |
|
| 595 |
+
mesh_output = gr.Model3D(clear_color=[0.0, 0.0, 0.0, 0.0], label="One-2-3-45's Textured Mesh", elem_id="model-3d-out")
|
|
|
|
|
|
|
| 596 |
|
| 597 |
with gr.Row(variant='panel'):
|
| 598 |
with gr.Column(scale=0.85):
|
| 599 |
with gr.Row():
|
| 600 |
+
elev_output = gr.Label(label='Estimated elevation (degree, w.r.t. the horizontal plane)')
|
|
|
|
|
|
|
|
|
|
| 601 |
vis_output = gr.Plot(
|
| 602 |
label='Camera poses of the input view (red) and predicted views (blue)')
|
| 603 |
|
|
|
|
| 684 |
# make regen_btn visible when any of the btn_retry is checked
|
| 685 |
for btn_retry in btn_retrys:
|
| 686 |
# Add the event handlers to the btn_retry buttons
|
|
|
|
| 687 |
btn_retry.change(fn=on_retry_button_click, inputs=[*btn_retrys], outputs=[regen_view_btn, regen_mesh_btn])
|
| 688 |
|
|
|
|
| 689 |
|
| 690 |
run_btn.click(fn=partial(update_guide, _SAM), outputs=[guide_text]
|
| 691 |
).success(fn=partial(preprocess_run, predictor, models),
|
|
|
|
| 703 |
|
| 704 |
|
| 705 |
regen_view_btn.click(fn=partial(stage1_run, models, device, None),
|
| 706 |
+
inputs=[tmp_dir, sam_block, scale_slider, steps_slider, elev_output, rerun_idx, *btn_retrys],
|
| 707 |
outputs=[rerun_idx, *btn_retrys, *views]
|
| 708 |
).success(fn=partial(update_guide, _REGEN_1), outputs=[guide_text])
|
| 709 |
regen_mesh_btn.click(fn=partial(stage2_run, models, device),
|
env.sh
DELETED
|
@@ -1,4 +0,0 @@
|
|
| 1 |
-
#!/bin/bash
|
| 2 |
-
|
| 3 |
-
export TORCH_CUDA_ARCH_LIST="{archs}"
|
| 4 |
-
export IABN_FORCE_CUDA=1
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|