pbrtest / app.py
ascarlettvfx's picture
Update app.py
2ff1378 verified
import gradio as gr
from PIL import Image
import numpy as np
from transformers import AutoModelForImageClassification, AutoFeatureExtractor
# Load the Marigold model
feature_extractor = AutoFeatureExtractor.from_pretrained("prs-eth/marigold-depth-lcm-v1-0")
model = AutoModelForImageClassification.from_pretrained("prs-eth/marigold-depth-lcm-v1-0")
def load_image(image):
""" Convert uploaded image to grayscale. """
return image.convert('L')
def compute_gradients(image):
""" Compute horizontal and vertical gradients of the image. """
image_array = np.asarray(image, dtype=float)
x_gradient = np.gradient(image_array, axis=1)
y_gradient = np.gradient(image_array, axis=0)
return x_gradient, y_gradient
def create_normal_map(image):
""" Generate a normal map from an image. """
image = load_image(image)
x_grad, y_grad = compute_gradients(image)
# Normalize gradients
max_grad = max(np.max(np.abs(x_grad)), np.max(np.abs(y_grad)))
x_grad /= max_grad
y_grad /= max_grad
# Calculate z component of the normal (assumed perpendicular to the surface)
z = np.sqrt(1 - (x_grad ** 2) - (y_grad ** 2))
# Normalize to 0-255 and format as uint8
normal_map = np.dstack(((x_grad * 0.5 + 0.5) * 255,
(y_grad * 0.5 + 0.5) * 255,
(z * 1.0) * 255)).astype(np.uint8)
return Image.fromarray(normal_map, 'RGB')
def estimate_depth(image):
""" Estimate depth using the Marigold model. """
inputs = feature_extractor(images=image, return_tensors="pt")
outputs = model(**inputs)
depth_map = outputs.logits # Adjust if the output tensor is named differently
return depth_map
def interface(image):
normal_map = create_normal_map(image)
grayscale_image = load_image(normal_map)
depth_map = estimate_depth(image)
return normal_map, grayscale_image, depth_map
# Set up the Gradio interface
iface = gr.Interface(
fn=interface,
inputs=gr.Image(type="pil", label="Upload Image"),
outputs=[
gr.Image(type="pil", label="Normal Map"),
gr.Image(type="pil", label="Grayscale Image"),
gr.Image(type="pil", label="Depth Map") # Adjust the output type if needed
],
title="Normal Map, Grayscale, and Depth Map Generator",
description="Upload an image to generate its normal map, a grayscale version, and estimate its depth."
)
iface.launch()