|
import gradio as gr |
|
import torch |
|
from transformers import pipeline |
|
from PIL import Image |
|
import numpy as np |
|
import cv2 |
|
|
|
def process_image(image, effect_type="Gaussian Blur", blur_intensity=15): |
|
""" |
|
Process the image with selected effect |
|
""" |
|
|
|
image = Image.fromarray(image).resize((512, 512)) |
|
|
|
if effect_type == "Gaussian Blur": |
|
|
|
segmenter = pipeline("image-segmentation", |
|
model="openmmlab/upernet-swin-base", |
|
device=0 if torch.cuda.is_available() else -1) |
|
|
|
results = segmenter(image) |
|
mask = np.zeros((512, 512), dtype=np.uint8) |
|
|
|
for segment in results: |
|
if segment['label'].lower() == 'person': |
|
segment_mask = np.array(segment['mask']) |
|
mask[segment_mask > 0] = 255 |
|
|
|
|
|
img_np = np.array(image) |
|
blurred = cv2.GaussianBlur(img_np, (0, 0), blur_intensity) |
|
|
|
mask_np = mask / 255.0 |
|
mask_np = np.stack([mask_np] * 3, axis=-1) |
|
|
|
result = img_np * mask_np + blurred * (1 - mask_np) |
|
return result.astype(np.uint8) |
|
|
|
else: |
|
|
|
depth_estimator = pipeline("depth-estimation", |
|
model="Intel/dpt-large", |
|
device=0 if torch.cuda.is_available() else -1) |
|
|
|
depth_result = depth_estimator(image) |
|
depth_map = depth_result['predicted_depth'] |
|
if torch.is_tensor(depth_map): |
|
depth_map = depth_map.cpu().numpy() |
|
|
|
|
|
img_np = np.array(image) |
|
depth_norm = blur_intensity * (1 - (depth_map - depth_map.min()) / |
|
(depth_map.max() - depth_map.min())) |
|
|
|
result = np.zeros_like(img_np) |
|
for sigma in range(int(blur_intensity) + 1): |
|
if sigma == 0: |
|
continue |
|
|
|
kernel_size = 2 * int(4 * sigma + 0.5) + 1 |
|
mask = (depth_norm >= sigma - 0.5) & (depth_norm < sigma + 0.5) |
|
|
|
if not mask.any(): |
|
continue |
|
|
|
blurred = cv2.GaussianBlur(img_np, (kernel_size, kernel_size), sigma) |
|
result[mask] = blurred[mask] |
|
|
|
min_depth_mask = depth_norm > blur_intensity-0.5 |
|
result[min_depth_mask] = img_np[min_depth_mask] |
|
|
|
return result |
|
|
|
|
|
demo = gr.Interface( |
|
fn=process_image, |
|
inputs=[ |
|
gr.Image(label="Upload Image", type="numpy"), |
|
gr.Radio(["Gaussian Blur", "Depth-based Blur"], label="Effect Type", value="Gaussian Blur"), |
|
gr.Slider(minimum=1, maximum=30, value=15, label="Blur Intensity") |
|
], |
|
outputs=gr.Image(label="Result"), |
|
title="Image Background Effects", |
|
description="""Upload an image to apply background effects: |
|
1. Gaussian Blur: Blurs the background while keeping the person sharp |
|
2. Depth-based Blur: Applies varying blur based on depth (bokeh effect)""", |
|
examples=[], |
|
cache_examples=False |
|
) |
|
|
|
if __name__ == "__main__": |
|
demo.launch() |