bktiadi commited on
Commit
39ca38f
Β·
verified Β·
1 Parent(s): 55c0964

Upload 6 files

Browse files
Files changed (6) hide show
  1. .gitattributes +36 -35
  2. .gitignore +2 -0
  3. README.md +24 -13
  4. app.py +160 -0
  5. examples/butterfly.jpg +3 -0
  6. requirements.txt +16 -0
.gitattributes CHANGED
@@ -1,35 +1,36 @@
1
- *.7z filter=lfs diff=lfs merge=lfs -text
2
- *.arrow filter=lfs diff=lfs merge=lfs -text
3
- *.bin filter=lfs diff=lfs merge=lfs -text
4
- *.bz2 filter=lfs diff=lfs merge=lfs -text
5
- *.ckpt filter=lfs diff=lfs merge=lfs -text
6
- *.ftz filter=lfs diff=lfs merge=lfs -text
7
- *.gz filter=lfs diff=lfs merge=lfs -text
8
- *.h5 filter=lfs diff=lfs merge=lfs -text
9
- *.joblib filter=lfs diff=lfs merge=lfs -text
10
- *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
- *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
- *.model filter=lfs diff=lfs merge=lfs -text
13
- *.msgpack filter=lfs diff=lfs merge=lfs -text
14
- *.npy filter=lfs diff=lfs merge=lfs -text
15
- *.npz filter=lfs diff=lfs merge=lfs -text
16
- *.onnx filter=lfs diff=lfs merge=lfs -text
17
- *.ot filter=lfs diff=lfs merge=lfs -text
18
- *.parquet filter=lfs diff=lfs merge=lfs -text
19
- *.pb filter=lfs diff=lfs merge=lfs -text
20
- *.pickle filter=lfs diff=lfs merge=lfs -text
21
- *.pkl filter=lfs diff=lfs merge=lfs -text
22
- *.pt filter=lfs diff=lfs merge=lfs -text
23
- *.pth filter=lfs diff=lfs merge=lfs -text
24
- *.rar filter=lfs diff=lfs merge=lfs -text
25
- *.safetensors filter=lfs diff=lfs merge=lfs -text
26
- saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
- *.tar.* filter=lfs diff=lfs merge=lfs -text
28
- *.tar filter=lfs diff=lfs merge=lfs -text
29
- *.tflite filter=lfs diff=lfs merge=lfs -text
30
- *.tgz filter=lfs diff=lfs merge=lfs -text
31
- *.wasm filter=lfs diff=lfs merge=lfs -text
32
- *.xz filter=lfs diff=lfs merge=lfs -text
33
- *.zip filter=lfs diff=lfs merge=lfs -text
34
- *.zst filter=lfs diff=lfs merge=lfs -text
35
- *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
1
+ *.7z filter=lfs diff=lfs merge=lfs -text
2
+ *.arrow filter=lfs diff=lfs merge=lfs -text
3
+ *.bin filter=lfs diff=lfs merge=lfs -text
4
+ *.bz2 filter=lfs diff=lfs merge=lfs -text
5
+ *.ckpt filter=lfs diff=lfs merge=lfs -text
6
+ *.ftz filter=lfs diff=lfs merge=lfs -text
7
+ *.gz filter=lfs diff=lfs merge=lfs -text
8
+ *.h5 filter=lfs diff=lfs merge=lfs -text
9
+ *.joblib filter=lfs diff=lfs merge=lfs -text
10
+ *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
+ *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
+ *.model filter=lfs diff=lfs merge=lfs -text
13
+ *.msgpack filter=lfs diff=lfs merge=lfs -text
14
+ *.npy filter=lfs diff=lfs merge=lfs -text
15
+ *.npz filter=lfs diff=lfs merge=lfs -text
16
+ *.onnx filter=lfs diff=lfs merge=lfs -text
17
+ *.ot filter=lfs diff=lfs merge=lfs -text
18
+ *.parquet filter=lfs diff=lfs merge=lfs -text
19
+ *.pb filter=lfs diff=lfs merge=lfs -text
20
+ *.pickle filter=lfs diff=lfs merge=lfs -text
21
+ *.pkl filter=lfs diff=lfs merge=lfs -text
22
+ *.pt filter=lfs diff=lfs merge=lfs -text
23
+ *.pth filter=lfs diff=lfs merge=lfs -text
24
+ *.rar filter=lfs diff=lfs merge=lfs -text
25
+ *.safetensors filter=lfs diff=lfs merge=lfs -text
26
+ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
+ *.tar.* filter=lfs diff=lfs merge=lfs -text
28
+ *.tar filter=lfs diff=lfs merge=lfs -text
29
+ *.tflite filter=lfs diff=lfs merge=lfs -text
30
+ *.tgz filter=lfs diff=lfs merge=lfs -text
31
+ *.wasm filter=lfs diff=lfs merge=lfs -text
32
+ *.xz filter=lfs diff=lfs merge=lfs -text
33
+ *.zip filter=lfs diff=lfs merge=lfs -text
34
+ *.zst filter=lfs diff=lfs merge=lfs -text
35
+ *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ examples/butterfly.jpg filter=lfs diff=lfs merge=lfs -text
.gitignore ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ __pycache__/
2
+ *.pyc
README.md CHANGED
@@ -1,13 +1,24 @@
1
- ---
2
- title: BackgraoundRemover
3
- emoji: 🌍
4
- colorFrom: gray
5
- colorTo: purple
6
- sdk: gradio
7
- sdk_version: 6.20.0
8
- python_version: '3.12'
9
- app_file: app.py
10
- pinned: false
11
- ---
12
-
13
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ title: Background Remover
3
+ emoji: πŸͺ„
4
+ colorFrom: gray
5
+ colorTo: purple
6
+ sdk: gradio
7
+ sdk_version: 6.20.0
8
+ python_version: '3.12'
9
+ app_file: app.py
10
+ pinned: false
11
+ ---
12
+
13
+ # πŸͺ„ Background Remover
14
+
15
+ Remove image backgrounds instantly using the open-source [BiRefNet](https://huggingface.co/ZhengPeng7/BiRefNet)
16
+ segmentation model. Free to use, no sign-up, no watermark β€” runs on Hugging Face's free
17
+ [ZeroGPU](https://huggingface.co/docs/hub/spaces-zerogpu).
18
+
19
+ Three ways to use it:
20
+ - **Upload** β€” drag and drop an image, get a transparent PNG back.
21
+ - **Image URL** β€” paste a link to any image on the web.
22
+ - **File β†’ PNG** β€” upload a file and download a transparent PNG (also exposed as the `png` API for automation / MCP).
23
+
24
+ Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
app.py ADDED
@@ -0,0 +1,160 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ from typing import Tuple, Union
3
+
4
+ import gradio as gr
5
+ import spaces
6
+ import torch
7
+ from loadimg import load_img
8
+ from PIL import Image
9
+ from torchvision import transforms
10
+ from transformers import AutoModelForImageSegmentation
11
+
12
+ torch.set_float32_matmul_precision("high")
13
+
14
+ DEVICE = "cuda" if torch.cuda.is_available() else "cpu"
15
+
16
+ birefnet = AutoModelForImageSegmentation.from_pretrained(
17
+ "ZhengPeng7/BiRefNet", trust_remote_code=True
18
+ )
19
+ birefnet.to(DEVICE)
20
+ birefnet.eval()
21
+
22
+ # Keep inference inputs aligned with the loaded model precision (fp16/fp32).
23
+ MODEL_DTYPE = next(birefnet.parameters()).dtype
24
+
25
+ transform_image = transforms.Compose(
26
+ [
27
+ transforms.Resize((1024, 1024)),
28
+ transforms.ToTensor(),
29
+ transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]),
30
+ ]
31
+ )
32
+
33
+ EXAMPLE_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), "examples")
34
+ EXAMPLE_IMAGE = os.path.join(EXAMPLE_DIR, "butterfly.jpg")
35
+ EXAMPLE_URL = (
36
+ "https://hips.hearstapps.com/hmg-prod/images/gettyimages-1229892983-square.jpg"
37
+ )
38
+
39
+
40
+ @spaces.GPU
41
+ def process(image: Image.Image) -> Image.Image:
42
+ """
43
+ Apply BiRefNet-based image segmentation to remove the background.
44
+ Args:
45
+ image (PIL.Image): The input RGB image.
46
+ Returns:
47
+ PIL.Image: The image with the background removed, using the segmentation mask as transparency.
48
+ """
49
+ image_size = image.size
50
+ input_images = (
51
+ transform_image(image).unsqueeze(0).to(device=DEVICE, dtype=MODEL_DTYPE)
52
+ )
53
+ with torch.no_grad():
54
+ preds = birefnet(input_images)[-1].sigmoid().cpu()
55
+ pred = preds[0].squeeze()
56
+ pred_pil = transforms.ToPILImage()(pred)
57
+ mask = pred_pil.resize(image_size)
58
+ image.putalpha(mask)
59
+ return image
60
+
61
+
62
+ def remove_bg(image: Union[Image.Image, str]) -> Tuple[Image.Image, Image.Image]:
63
+ """Remove the background from an uploaded image or an image URL."""
64
+ im = load_img(image, output_type="pil").convert("RGB")
65
+ origin = im.copy()
66
+ return origin, process(im)
67
+
68
+
69
+ def remove_bg_to_file(f: str) -> str:
70
+ """Load an image file from disk, remove the background, and save as a transparent PNG."""
71
+ name_path = os.path.splitext(f)[0] + ".png"
72
+ im = load_img(f, output_type="pil").convert("RGB")
73
+ process(im).save(name_path)
74
+ return name_path
75
+
76
+
77
+ THEME = gr.themes.Soft(
78
+ primary_hue="violet",
79
+ secondary_hue="purple",
80
+ neutral_hue="slate",
81
+ font=[gr.themes.GoogleFont("Inter"), "ui-sans-serif", "system-ui", "sans-serif"],
82
+ )
83
+
84
+ CSS = """
85
+ .gradio-container { max-width: 980px !important; margin: 0 auto !important; }
86
+ #hero { text-align: center; padding: 6px 0 2px; }
87
+ #hero h1 { font-size: 2.15rem; margin-bottom: 2px; }
88
+ #hero p { color: var(--body-text-color-subdued); font-size: 1.02rem; margin-top: 0; }
89
+ #run-btn { min-height: 46px; font-weight: 600; }
90
+ .footer-note { text-align: center; opacity: 0.65; font-size: 0.85rem; margin-top: 6px; }
91
+ .footer-note a { color: inherit; }
92
+ """
93
+
94
+ with gr.Blocks(title="Background Remover") as demo:
95
+ gr.Markdown(
96
+ """
97
+ <div id="hero">
98
+ <h1>πŸͺ„ Background Remover</h1>
99
+ <p>Drop an image, get a clean transparent cutout. Powered by the open-source
100
+ <a href="https://huggingface.co/ZhengPeng7/BiRefNet" target="_blank">BiRefNet</a> model β€” free, no sign-up, no watermark.</p>
101
+ </div>
102
+ """
103
+ )
104
+
105
+ with gr.Tabs():
106
+ with gr.Tab("πŸ“€ Upload"):
107
+ with gr.Row():
108
+ with gr.Column():
109
+ upload_in = gr.Image(
110
+ label="Source image", type="pil", sources=["upload", "clipboard"]
111
+ )
112
+ upload_btn = gr.Button(
113
+ "Remove background", variant="primary", elem_id="run-btn"
114
+ )
115
+ with gr.Column():
116
+ upload_out = gr.ImageSlider(
117
+ label="Result β€” drag to compare", type="pil", format="png"
118
+ )
119
+ gr.Examples(examples=[EXAMPLE_IMAGE], inputs=upload_in, label="Try an example")
120
+ upload_btn.click(remove_bg, inputs=upload_in, outputs=upload_out, api_name="image")
121
+
122
+ with gr.Tab("πŸ”— Image URL"):
123
+ with gr.Row():
124
+ with gr.Column():
125
+ url_in = gr.Textbox(
126
+ label="Image URL", placeholder="https://example.com/photo.jpg"
127
+ )
128
+ url_btn = gr.Button(
129
+ "Remove background", variant="primary", elem_id="run-btn"
130
+ )
131
+ with gr.Column():
132
+ url_out = gr.ImageSlider(
133
+ label="Result β€” drag to compare", type="pil", format="png"
134
+ )
135
+ gr.Examples(examples=[EXAMPLE_URL], inputs=url_in, label="Try an example")
136
+ url_btn.click(remove_bg, inputs=url_in, outputs=url_out, api_name="text")
137
+
138
+ with gr.Tab("πŸ“ File β†’ PNG"):
139
+ gr.Markdown("Upload a file and get back a downloadable transparent PNG β€” handy for automation, the API, or MCP.")
140
+ with gr.Row():
141
+ file_in = gr.Image(label="Source image", type="filepath")
142
+ file_out = gr.File(label="Transparent PNG")
143
+ file_btn = gr.Button("Generate PNG", variant="primary", elem_id="run-btn")
144
+ gr.Examples(examples=[EXAMPLE_IMAGE], inputs=file_in, label="Try an example")
145
+ file_btn.click(remove_bg_to_file, inputs=file_in, outputs=file_out, api_name="png")
146
+
147
+ gr.Markdown(
148
+ """
149
+ <div class="footer-note">
150
+ Model: <a href="https://huggingface.co/ZhengPeng7/BiRefNet" target="_blank">ZhengPeng7/BiRefNet</a> Β·
151
+ UI: <a href="https://gradio.app" target="_blank">Gradio</a> Β·
152
+ Runs free on <a href="https://huggingface.co/docs/hub/spaces-zerogpu" target="_blank">ZeroGPU</a><br/>
153
+ Prefer a dedicated API? Use <a href="https://huggingface.co/spaces/hf-applications/background-removal" target="_blank">hf-applications/background-removal</a>,
154
+ or call the <code>png</code> endpoint from the "File β†’ PNG" tab above.
155
+ </div>
156
+ """
157
+ )
158
+
159
+ if __name__ == "__main__":
160
+ demo.launch(show_error=True, mcp_server=True, theme=THEME, css=CSS)
examples/butterfly.jpg ADDED

Git LFS Details

  • SHA256: a90552572374e49e2f198a8d7a11eeee6e733013fe884f2dda268670e6c788e7
  • Pointer size: 131 Bytes
  • Size of remote file: 196 kB
requirements.txt ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ gradio
2
+ torch
3
+ torchvision
4
+ transformers>=4.39.1
5
+ accelerate
6
+ spaces
7
+ loadimg>=0.1.1
8
+ pillow
9
+ numpy
10
+ opencv-python
11
+ timm
12
+ kornia
13
+ einops
14
+ prettytable
15
+ scikit-image
16
+ huggingface_hub