| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| import os |
| os.system("pip freeze") |
| import spaces |
|
|
| import gradio as gr |
| import torch as torch |
| from diffusers import MarigoldDepthPipeline, DDIMScheduler |
| from gradio_dualvision import DualVisionApp |
| from huggingface_hub import login |
| from PIL import Image |
|
|
| CHECKPOINT = "prs-eth/marigold-depth-v1-1" |
|
|
| if "HF_TOKEN_LOGIN" in os.environ: |
| login(token=os.environ["HF_TOKEN_LOGIN"]) |
|
|
| device = torch.device("cuda" if torch.cuda.is_available() else "cpu") |
| dtype = torch.bfloat16 if torch.cuda.is_available() else torch.float32 |
|
|
| pipe = MarigoldDepthPipeline.from_pretrained(CHECKPOINT) |
| pipe.scheduler = DDIMScheduler.from_config(pipe.scheduler.config, timestep_spacing="trailing") |
| pipe = pipe.to(device=device, dtype=dtype) |
| try: |
| import xformers |
| pipe.enable_xformers_memory_efficient_attention() |
| except: |
| pass |
|
|
|
|
| class MarigoldDepthApp(DualVisionApp): |
| DEFAULT_SEED = 2024 |
| DEFAULT_ENSEMBLE_SIZE = 1 |
| DEFAULT_DENOISE_STEPS = 4 |
| DEFAULT_PROCESSING_RES = 768 |
|
|
| def make_header(self): |
| gr.Markdown( |
| """ |
| <h2><a href="https://huggingface.co/spaces/prs-eth/marigold" style="color: black;">Marigold Depth Estimation</a></h2> |
| """ |
| ) |
| with gr.Row(elem_classes="remove-elements"): |
| gr.Markdown( |
| f""" |
| <p align="center"> |
| <a title="Website" href="https://marigoldcomputervision.github.io/" target="_blank" rel="noopener noreferrer" style="display: inline-block;"> |
| <img src="https://img.shields.io/badge/%E2%99%A5%20Project%20-Website-blue"> |
| </a> |
| <a title="diffusers" href="https://huggingface.co/docs/diffusers/using-diffusers/marigold_usage" target="_blank" rel="noopener noreferrer" style="display: inline-block;"> |
| <img src="https://img.shields.io/badge/%F0%9F%A7%A8%20Read_diffusers-Tutorial-yellow?labelColor=green"> |
| </a> |
| <a title="arXiv" href="https://arxiv.org/abs/2505.09358" target="_blank" rel="noopener noreferrer" style="display: inline-block;"> |
| <img src="https://img.shields.io/badge/%F0%9F%93%84%20Read%20-Paper-AF3436"> |
| </a> |
| <a title="Github" href="https://github.com/prs-eth/marigold" target="_blank" rel="noopener noreferrer" style="display: inline-block;"> |
| <img src="https://img.shields.io/github/stars/prs-eth/marigold?label=GitHub%20%E2%98%85&logo=github&color=C8C" alt="badge-github-stars"> |
| </a> |
| <a title="Image Normals" href="https://huggingface.co/spaces/prs-eth/marigold-normals" target="_blank" rel="noopener noreferrer" style="display: inline-block;"> |
| <img src="https://img.shields.io/badge/%F0%9F%A4%97%20Image%20Normals%20-Demo-yellow" alt="imagedepth"> |
| </a> |
| <a title="Image Intrinsics" href="https://huggingface.co/spaces/prs-eth/marigold-iid" target="_blank" rel="noopener noreferrer" style="display: inline-block;"> |
| <img src="https://img.shields.io/badge/%F0%9F%A4%97%20Image%20Intrinsics%20-Demo-yellow" alt="imagedepth"> |
| </a> |
| <a title="LiDAR Depth" href="https://huggingface.co/spaces/prs-eth/marigold-dc" target="_blank" rel="noopener noreferrer" style="display: inline-block;"> |
| <img src="https://img.shields.io/badge/%F0%9F%A4%97%20LiDAR%20Depth%20-Demo-yellow" alt="imagedepth"> |
| </a> |
| <a title="Video Depth" href="https://huggingface.co/spaces/prs-eth/rollingdepth" target="_blank" rel="noopener noreferrer" style="display: inline-block;"> |
| <img src="https://img.shields.io/badge/%F0%9F%A4%97%20Video%20Depth%20-Demo-yellow" alt="videodepth"> |
| </a> |
| <a title="Depth-to-3D" href="https://huggingface.co/spaces/prs-eth/depth-to-3d-print" target="_blank" rel="noopener noreferrer" style="display: inline-block;"> |
| <img src="https://img.shields.io/badge/%F0%9F%A4%97%20Depth--to--3D%20-Demo-yellow" alt="depthto3d"> |
| </a> |
| <a title="Social" href="https://twitter.com/antonobukhov1" target="_blank" rel="noopener noreferrer" style="display: inline-block;"> |
| <img src="https://shields.io/twitter/follow/:?label=Subscribe%20for%20updates!" alt="social"> |
| </a> |
| </p> |
| <p align="center" style="margin-top: 0px;"> |
| Upload a photo or select an example below to compute depth maps in real time. |
| Use the slider to reveal areas of interest. |
| Use the radio-buttons to switch between modalities. |
| Check our other demo badges above for new or relocated functionality. |
| </p> |
| """ |
| ) |
|
|
| def build_user_components(self): |
| with gr.Column(): |
| ensemble_size = gr.Slider( |
| label="Ensemble size", |
| minimum=1, |
| maximum=10, |
| step=1, |
| value=self.DEFAULT_ENSEMBLE_SIZE, |
| ) |
| denoise_steps = gr.Slider( |
| label="Number of denoising steps", |
| minimum=1, |
| maximum=20, |
| step=1, |
| value=self.DEFAULT_DENOISE_STEPS, |
| ) |
| processing_res = gr.Radio( |
| [ |
| ("Native", 0), |
| ("Recommended", 768), |
| ], |
| label="Processing resolution", |
| value=self.DEFAULT_PROCESSING_RES, |
| ) |
| return { |
| "ensemble_size": ensemble_size, |
| "denoise_steps": denoise_steps, |
| "processing_res": processing_res, |
| } |
|
|
| def process(self, image_in: Image.Image, **kwargs): |
| ensemble_size = kwargs.get("ensemble_size", self.DEFAULT_ENSEMBLE_SIZE) |
| denoise_steps = kwargs.get("denoise_steps", self.DEFAULT_DENOISE_STEPS) |
| processing_res = kwargs.get("processing_res", self.DEFAULT_PROCESSING_RES) |
| generator = torch.Generator(device=device).manual_seed(self.DEFAULT_SEED) |
|
|
| pipe_out = pipe( |
| image_in, |
| ensemble_size=ensemble_size, |
| num_inference_steps=denoise_steps, |
| processing_resolution=processing_res, |
| batch_size=1 if processing_res == 0 else 2, |
| output_uncertainty=ensemble_size >= 3, |
| generator=generator, |
| ) |
|
|
| depth_vis = pipe.image_processor.visualize_depth(pipe_out.prediction)[0] |
| depth_16bit = pipe.image_processor.export_depth_to_16bit_png(pipe_out.prediction)[0] |
|
|
| out_modalities = { |
| "Depth Visualization": depth_vis, |
| "Depth 16-bit": depth_16bit, |
| } |
| if ensemble_size >= 3: |
| uncertainty = pipe.image_processor.visualize_uncertainty(pipe_out.uncertainty)[0] |
| out_modalities["Uncertainty"] = uncertainty |
|
|
| out_settings = { |
| "ensemble_size": ensemble_size, |
| "denoise_steps": denoise_steps, |
| "processing_res": processing_res, |
| } |
| return out_modalities, out_settings |
|
|
|
|
| with MarigoldDepthApp( |
| title="Marigold Depth", |
| examples_path="files", |
| examples_per_page=12, |
| squeeze_canvas=True, |
| spaces_zero_gpu_enabled=True, |
| ) as demo: |
| demo.queue( |
| api_open=False, |
| ).launch( |
| server_name="0.0.0.0", |
| server_port=7860, |
| ) |
|
|