bg-removal-pro / app.py
Janeka's picture
Update app.py
41db1e3 verified
import gradio as gr
import numpy as np
import cv2
import torch
from PIL import Image
import requests
from io import BytesIO
# Helper functions for each model
def load_image(image_path_or_url):
if isinstance(image_path_or_url, str) and image_path_or_url.startswith('http'):
response = requests.get(image_path_or_url)
img = Image.open(BytesIO(response.content))
else:
img = Image.open(image_path_or_url)
return img.convert('RGB')
def prepare_image_for_api(image):
"""Convert PIL Image to bytes for API requests"""
img_byte_arr = BytesIO()
image.save(img_byte_arr, format='PNG')
img_byte_arr.seek(0)
return img_byte_arr
def process_bria(image):
# Use BRIA API or hosted inference
# Example using hosted endpoint (replace with actual API)
bria_api_url = "https://api.bria.ai/removebg"
# Prepare image for API
image_bytes = prepare_image_for_api(image)
files = {'image': ('image.png', image_bytes, 'image/png')}
response = requests.post(bria_api_url, files=files)
result = Image.open(BytesIO(response.content))
return result
def process_inspyrenet(image):
# Use INSPyReNet from Hugging Face
# First convert to numpy array as expected by transformers
image_np = np.array(image)
from transformers import pipeline
pipe = pipeline("image-segmentation", "mattmdjaga/INSPyReNet")
result = pipe(image_np)
# Convert result back to PIL Image
return Image.fromarray(result)
def process_u2net(image):
# U²-Net from Hugging Face
image_np = np.array(image)
from transformers import pipeline
pipe = pipeline("image-segmentation", "silk-road/u2net")
result = pipe(image_np)
return Image.fromarray(result)
def process_u2net_human(image):
# U²-Net Human Seg from Hugging Face
image_np = np.array(image)
from transformers import pipeline
pipe = pipeline("image-segmentation", "mattmdjaga/u2net-human-seg")
result = pipe(image_np)
return Image.fromarray(result)
def process_isnet_general(image):
# Placeholder - implement actual ISNet processing
# For now just return a dummy mask (white rectangle)
mask = Image.new('L', image.size, 255)
return mask
def process_isnet_anime(image):
# Placeholder - implement actual ISNet processing
# For now just return a dummy mask (white rectangle)
mask = Image.new('L', image.size, 255)
return mask
def combine_masks(masks):
# Convert all masks to numpy arrays and combine
mask_arrays = [np.array(mask) for mask in masks]
combined = np.zeros_like(mask_arrays[0], dtype=np.uint8)
for mask in mask_arrays:
# Normalize each mask to 0-1 range before combining
mask_normalized = mask / 255.0
combined = np.maximum(combined, mask_normalized)
return (combined * 255).astype(np.uint8)
def process_image(image):
# Convert Gradio input to PIL Image if needed
if isinstance(image, np.ndarray):
image = Image.fromarray(image)
# Process through all models in sequence
results = [
process_bria(image),
process_inspyrenet(image),
process_u2net(image),
process_u2net_human(image),
process_isnet_general(image),
process_isnet_anime(image)
]
# Combine results
combined_mask = combine_masks(results)
# Apply mask to original image
final_image = Image.composite(
image,
Image.new('RGB', image.size, (0, 0, 0)),
Image.fromarray(combined_mask)
)
return final_image
# Gradio interface
iface = gr.Interface(
fn=process_image,
inputs=gr.Image(),
outputs=gr.Image(),
title="Multi-Model Background Removal",
description="Combines BRIA, INSPyReNet, U²-Net, U²-Net Human Seg, ISNet-General-Use, and ISNet-Anime for superior background removal"
)
iface.launch(share=True) # Added share=True for public URL