pipeline1copy / app.py
Janeka's picture
Update app.py
c2c25ca verified
import gradio as gr
import numpy as np
from PIL import Image
from transformers import pipeline
import cv2
# Model sequence with weights
MODELS = [
{"name": "BRIA", "repo": "BRIA-AI/bria-rmbg", "weight": 1.0},
{"name": "INSPyReNet", "repo": "mattmdjaga/INSPyReNet", "weight": 0.9},
{"name": "U2Net", "repo": "silks-road/u2net", "weight": 0.8},
{"name": "U2Net-Human", "repo": "mattmdjaga/u2net-human-seg", "weight": 0.7},
{"name": "ISNet-General", "repo": "xuebinqin/ISNet-general-use", "weight": 0.6},
{"name": "ISNet-Anime", "repo": "skytnt/anime-seg", "weight": 0.5}
]
def load_model(model_repo):
return pipeline("image-segmentation", model_repo)
def process_image(input_image):
# Convert Gradio input to PIL Image
if isinstance(input_image, np.ndarray):
input_image = Image.fromarray(input_image)
masks = []
weights = []
for model in MODELS:
try:
pipe = load_model(model["repo"])
result = pipe(np.array(input_image))
mask = result[0]['mask'] if isinstance(result, list) else result['mask']
masks.append(mask)
weights.append(model["weight"])
print(f"{model['name']} completed successfully") # Debug print
except Exception as e:
print(f"{model['name']} failed: {str(e)}") # Debug print
continue
if not masks:
return None
# Weighted average of masks
combined = np.zeros_like(masks[0], dtype=np.float32)
for mask, weight in zip(masks, weights):
combined += mask.astype(np.float32) * weight
final_mask = (combined / sum(weights)).astype(np.uint8)
# Create transparent background
result = input_image.copy()
result.putalpha(Image.fromarray(final_mask))
return result
# Gradio interface
demo = gr.Interface(
fn=process_image,
inputs=gr.Image(label="Input Image"),
outputs=gr.Image(label="Result (PNG with Transparency)"),
title="🎨 Advanced Background Remover",
description="Combines 6 AI models for perfect background removal",
examples=[
["example1.jpg"],
["example2.jpg"],
["example3.png"]
]
)
demo.launch(server_name="0.0.0.0", server_port=7860)