import gradio as gr import cv2 import numpy as np import torch from PIL import Image from transformers import SegformerForSemanticSegmentation, SegformerFeatureExtractor # Load Segformer model model_name = "nvidia/segformer-b0-finetuned-ade-512-512" model = SegformerForSemanticSegmentation.from_pretrained(model_name) feature_extractor = SegformerFeatureExtractor.from_pretrained(model_name) # Mug class index in ADE20K MUG_CLASS_INDEX = 41 def apply_blur(image, blur_type): image = Image.fromarray(image).convert("RGB") original_width, original_height = image.size # Preprocess the image for the model inputs = feature_extractor(images=image, return_tensors="pt") with torch.no_grad(): outputs = model(**inputs) logits = outputs.logits predicted_mask = logits.argmax(dim=1).squeeze().cpu().numpy() # Confidence thresholding confidence_scores = torch.nn.functional.softmax(logits, dim=1) mug_confidence = confidence_scores[0, MUG_CLASS_INDEX].cpu().numpy() binary_mask = (mug_confidence > 0.08).astype(np.uint8) * 255 # Morphological operations kernel = np.ones((5, 5), np.uint8) binary_mask = cv2.dilate(binary_mask, kernel, iterations=2) binary_mask = cv2.morphologyEx(binary_mask, cv2.MORPH_CLOSE, kernel) # Resize mask binary_mask_resized = cv2.resize(binary_mask, (original_width, original_height), interpolation=cv2.INTER_NEAREST) # Convert image to NumPy image_np = np.array(image) # Apply the selected blur type if blur_type == "Gaussian": blurred_image = cv2.GaussianBlur(image_np, (0, 0), sigmaX=15, sigmaY=15) elif blur_type == "Lens": blurred_image = cv2.blur(image_np, (15, 15)) # Simulating lens blur with a box filter # Combine sharp foreground with blurred background output_image = np.where(binary_mask_resized[..., None] == 255, image_np, blurred_image) return output_image # Gradio UI iface = gr.Interface( fn=apply_blur, inputs=[ gr.Image(type="numpy"), gr.Radio(["Gaussian", "Lens"], label="Select Blur Type") ], outputs=gr.Image(type="numpy"), title="Blur Background for Mug Objects", description="Upload an image, and the model will blur the background while keeping the mug sharp." ) iface.launch()