import gradio as gr import os import uuid import subprocess import shutil from huggingface_hub import hf_hub_download from lrm.inferrer import LRMInferrer # def prepare_checkpoint(model_name: str): # REPO_ID = f"zxhezexin/OpenLRM" # FILE_NAME = f"{model_name}.pth" # CACHE_PATH = f".cache" # print(f"Downloading ckpt ...") # ckpt_path = hf_hub_download(repo_id=REPO_ID, filename=FILE_NAME, local_dir=CACHE_PATH) # print(f"checkpoint path is {ckpt_path}") # print(f"Downloaded ckpt into {CACHE_PATH}") def assert_input_image(input_image): if input_image is None: raise gr.Error("No image selected or uploaded!") def rembg_and_center_wrapper(source_image): subprocess.run([f'python rembg_and_center.py {source_image}'], shell=True) directory, filename = os.path.split(source_image) # file_base, file_extension = os.path.splitext(filename) file_base = os.path.basename(source_image).split('.')[0] new_filename = f"{file_base}_rgba.png" new_image_path = os.path.join(directory, new_filename) return new_image_path def infer_wrapper(source_image, checkbox_rembg): random_uuid = str(uuid.uuid4()) directory, extension = os.path.split(source_image) file_extension = os.path.splitext(extension)[1] new_file_path = os.path.join(directory, random_uuid + file_extension) shutil.copy(source_image, new_file_path) print(f"File renamed from {source_image} to {new_file_path}") source_image = new_file_path if checkbox_rembg: source_image = rembg_and_center_wrapper(source_image) return inferrer.infer( source_image=source_image, dump_path="./dumps", source_size=-1, render_size=-1, mesh_size=384, export_video=True, export_mesh=False, ) def infer_wrapper_clean(source_image): return infer_wrapper(source_image, checkbox_rembg=False) def demo_image_to_video(inferrer: LRMInferrer): print(f"So far so good.") print(inferrer) _TITLE = '''OpenLRM: Open-Source Large Reconstruction Models''' _DESCRIPTION = '''
OpenLRM is an open-source implementation of Large Reconstruction Models. Image-to-3D in 10 seconds! Disclaimer: This demo uses `openlrm-base-obj-1.0` model trained on Objaverse only, which consists of synthetic data. Its performance may decrease on in-the-wild images. We use 194x194 rendering resolution here for a quick demonstration. ''' with gr.Blocks(analytics_enabled=False) as iface: # HEADERS with gr.Row(): with gr.Column(scale=1): gr.Markdown('# ' + _TITLE) gr.Markdown(_DESCRIPTION) # DISPLAY with gr.Row(): with gr.Column(variant='panel', scale=3): with gr.Tabs(elem_id="openlrm_input_image"): with gr.TabItem('Input Image'): with gr.Row(): input_image = gr.Image(label="Input Image", image_mode="RGB", sources="upload", type="filepath", elem_id="content_image", width="auto") with gr.Column(variant='panel', scale=2): with gr.Tabs(elem_id="openlrm_render_video"): with gr.TabItem('Rendered Video'): with gr.Row(): output_video = gr.Video(label="Rendered Video", format="mp4", width="auto", autoplay=True) # SETTING with gr.Row(): with gr.Column(variant='panel', scale=1): with gr.Tabs(elem_id="openlrm_attrs"): with gr.TabItem('Settings'): with gr.Column(variant='panel'): gr.Markdown( """ Please check the box when uploading RGBA images. Best Practice: RGB images with a white background. Centered objects in reasonable sizes. """ ) checkbox_rembg = gr.Checkbox(False, label='Remove background and center the object (It takes some extra time)') submit = gr.Button('Generate', elem_id="openlrm_generate", variant='primary') submit.click( fn=assert_input_image, inputs=[input_image], queue=False ).success( fn=infer_wrapper, inputs=[input_image, checkbox_rembg], outputs=[output_video], ) # EXAMPLES with gr.Row(): examples = [ ['assets/sample_input/owl.png'], ['assets/sample_input/building.png'], ['assets/sample_input/mailbox.png'], ['assets/sample_input/fire.png'], ['assets/sample_input/girl.png'], ['assets/sample_input/lamp.png'], ['assets/sample_input/hydrant.png'], ['assets/sample_input/hotdogs.png'], ['assets/sample_input/traffic.png'], ['assets/sample_input/ceramic.png'], ['assets/sample_input/cartoon.png'], ] gr.Examples( examples=examples, inputs=[input_image], outputs=[output_video], fn=infer_wrapper_clean, cache_examples=os.getenv('SYSTEM') == 'spaces', examples_per_page=20, ) return iface if __name__ == "__main__": model_name = "openlrm-base-obj-1.0" # prepare_checkpoint(model_name) with LRMInferrer(model_name) as inferrer: iface = demo_image_to_video(inferrer) iface.queue(max_size=10) iface.launch()