|
import gradio as gr |
|
import cv2 |
|
import numpy as np |
|
import torch |
|
from PIL import Image |
|
from transformers import ( |
|
SegformerImageProcessor, |
|
SegformerForSemanticSegmentation, |
|
AutoImageProcessor, |
|
AutoModelForDepthEstimation |
|
) |
|
|
|
|
|
segformer_processor = SegformerImageProcessor.from_pretrained("nvidia/segformer-b0-finetuned-ade-512-512") |
|
segformer_model = SegformerForSemanticSegmentation.from_pretrained("nvidia/segformer-b0-finetuned-ade-512-512") |
|
|
|
|
|
depth_processor = AutoImageProcessor.from_pretrained("depth-anything/Depth-Anything-V2-Small-hf") |
|
depth_model = AutoModelForDepthEstimation.from_pretrained("depth-anything/Depth-Anything-V2-Small-hf") |
|
|
|
def apply_blur(image, blur_type, blur_strength, depth_threshold): |
|
|
|
img = image |
|
|
|
if blur_type == "Gaussian": |
|
|
|
pil_image = Image.fromarray(img) |
|
inputs = segformer_processor(images=pil_image, return_tensors="pt") |
|
outputs = segformer_model(**inputs) |
|
logits = outputs.logits |
|
|
|
mask = logits[0, 12, :, :].detach().cpu().numpy() > depth_threshold |
|
mask = cv2.resize(mask.astype(np.uint8), (img.shape[1], img.shape[0])) |
|
|
|
elif blur_type == "Lens": |
|
|
|
pil_image = Image.fromarray(img) |
|
inputs = depth_processor(images=pil_image, return_tensors="pt") |
|
|
|
with torch.no_grad(): |
|
outputs = depth_model(**inputs) |
|
predicted_depth = outputs.predicted_depth |
|
|
|
prediction = torch.nn.functional.interpolate( |
|
predicted_depth.unsqueeze(1), |
|
size=img.shape[:2], |
|
mode="bicubic", |
|
align_corners=False, |
|
) |
|
|
|
mask = prediction[0, 0, :, :].detach().cpu().numpy() > depth_threshold |
|
mask = mask.astype(np.uint8) |
|
|
|
|
|
mask = cv2.bitwise_not(mask) |
|
mask = np.repeat(mask[:, :, np.newaxis], 3, axis=2) |
|
|
|
|
|
if blur_type == "Gaussian": |
|
blurred_image = cv2.GaussianBlur(img, (0, 0), sigmaX=blur_strength) |
|
elif blur_type == "Lens": |
|
|
|
kernel_size = int(blur_strength * 2) * 2 + 1 |
|
blurred_image = cv2.GaussianBlur(img, (kernel_size, kernel_size), 0) |
|
|
|
|
|
output = np.where(mask == 255, blurred_image, img) |
|
|
|
return output |
|
|
|
|
|
|
|
iface = gr.Interface( |
|
fn=apply_blur, |
|
inputs=[ |
|
gr.Image(label="Input Image"), |
|
gr.Radio(["Gaussian", "Lens"], label="Blur Type", value="Gaussian"), |
|
gr.Slider(1, 30, value=15, step=1, label="Blur Strength"), |
|
gr.Slider(-20, 20, value=-4, step=0.1, label="Depth Threshold") |
|
], |
|
outputs=gr.Image(label="Output Image"), |
|
title="Image Segmentation and Blurring", |
|
description="Upload an image and apply Gaussian or Lens blur to the background using different segmentation models." |
|
) |
|
|
|
|
|
iface.launch(share=True) |
|
|