| | |
| | import gradio_client.utils as client_utils |
| |
|
| | _original_json_schema_to_python_type = client_utils._json_schema_to_python_type |
| |
|
| | def _patched_json_schema_to_python_type(schema, defs=None): |
| | if isinstance(schema, bool): |
| | return "Any" |
| | return _original_json_schema_to_python_type(schema, defs) |
| |
|
| | client_utils._json_schema_to_python_type = _patched_json_schema_to_python_type |
| |
|
| | custom_css = """ |
| | .gradio-container { |
| | max-width: 900px !important; |
| | margin: auto !important; |
| | } |
| | .gr-image { |
| | max-height: 300px !important; |
| | } |
| | .gr-button { |
| | padding: 8px 16px !important; |
| | } |
| | .gr-padded { |
| | padding: 10px !important; |
| | } |
| | h1 { |
| | font-size: 1.5rem !important; |
| | } |
| | |
| | #depth-viewer { height: 600px; } |
| | """ |
| |
|
| |
|
| | import gradio as gr |
| | import torch |
| | import numpy as np |
| | from PIL import Image |
| | from pathlib import Path |
| | from depth_viewer import depthviewer2html |
| |
|
| | |
| | _model = None |
| | _feature_extractor = None |
| |
|
| | def get_model(): |
| | global _model, _feature_extractor |
| | if _model is None: |
| | from transformers import DPTImageProcessor, DPTForDepthEstimation |
| | _feature_extractor = DPTImageProcessor.from_pretrained("Intel/dpt-large") |
| | _model = DPTForDepthEstimation.from_pretrained("Intel/dpt-large") |
| | return _feature_extractor, _model |
| |
|
| | def process_image(image_path): |
| | if image_path is None: |
| | return "" |
| | |
| | feature_extractor, model = get_model() |
| | |
| | image_path = Path(image_path) |
| | image = Image.open(image_path) |
| | |
| | if image.size[0] > 512: |
| | image = image.resize((512, int(512 * image.size[1] / image.size[0])), Image.Resampling.LANCZOS) |
| | |
| | inputs = feature_extractor(images=image, return_tensors="pt") |
| | |
| | with torch.no_grad(): |
| | outputs = model(**inputs) |
| | predicted_depth = outputs.predicted_depth |
| | |
| | prediction = torch.nn.functional.interpolate( |
| | predicted_depth.unsqueeze(1), |
| | size=image.size[::-1], |
| | mode="bicubic", |
| | align_corners=False, |
| | ).squeeze() |
| | |
| | output = prediction.cpu().numpy() |
| | depth = (output * 255 / np.max(output)).astype('uint8') |
| | |
| | return depthviewer2html(image, depth) |
| |
|
| | title = "3D Visualization of Depth Maps Generated using MiDaS" |
| | description = "Improved 3D interactive depth viewer using Three.js" |
| |
|
| | with gr.Blocks(css=custom_css) as demo: |
| | gr.Markdown(f"# {title}") |
| | gr.Markdown(description) |
| | |
| | input_image = gr.Image(type="filepath", label="Input Image") |
| | output_html = gr.HTML(label="Depth Viewer", elem_id="depth-viewer") |
| | |
| | input_image.change(fn=process_image, inputs=input_image, outputs=output_html) |
| | |
| | gr.Examples( |
| | examples=[["examples/owl1.jpg"], ["examples/marsattacks.jpg"], ["examples/kitten.jpg"]], |
| | inputs=input_image, |
| | cache_examples=False |
| | ) |
| |
|
| | demo.launch() |