Spaces:
Build error
Build error
| 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 | |
| """ | |
| # Resize image to 512x512 | |
| image = Image.fromarray(image).resize((512, 512)) | |
| if effect_type == "Gaussian Blur": | |
| # Generate segmentation mask | |
| 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 | |
| # Apply gaussian blur | |
| 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-based blur | |
| # Generate depth map | |
| 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() | |
| # Apply depth-based blur | |
| 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 | |
| # Create Gradio interface | |
| 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=[], # You can add example images later | |
| cache_examples=False | |
| ) | |
| if __name__ == "__main__": | |
| demo.launch() |