Repository: danielgatis/rembg
Stars: 22604
README.md
<p align="center">
<img src="logo.png" alt="Rembg Logo" width="600" />
</p>
<div align="center">
<p align="center">Rembg is a tool to remove image backgrounds. It can be used as a CLI, Python library, HTTP server, or Docker container.</p>
<div style="display: flex; flex-direction: row; justify-content: center; gap: 8px; flex-wrap: wrap; margin-top: 8px;">
<a href="https://img.shields.io/badge/License-MIT-blue.svg"><img src="https://img.shields.io/badge/License-MIT-blue.svg" alt="License" /></a>
<a href="https://huggingface.co/spaces/KenjieDec/RemBG"><img src="https://img.shields.io/badge/🤗%20Hugging%20Face-Spaces-blue" alt="Hugging Face Spaces" /></a>
<a href="https://bgremoval.streamlit.app/"><img src="https://img.shields.io/badge/🎈%20Streamlit%20Community-Cloud-blue" alt="Streamlit App" /></a>
<a href="https://colab.research.google.com/github/danielgatis/rembg/blob/main/rembg.ipynb"><img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Open in Colab" /></a>
<a href="https://repomapr.com/danielgatis/rembg"><img src="https://img.shields.io/badge/RepoMapr-View_Interactive_Diagram-blue?style=flat&logo=github" alt="RepoMapr" /></a>
</div>
</div>
<br/>
<p align="center">
<a href="https://trendshift.io/repositories/2846" target="_blank">
<img src="https://trendshift.io/api/badge/repositories/2846" alt="danielgatis%2Frembg | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/>
</a>
</p>
Sponsors
<table>
<tr>
<td align="center" vertical-align="center">
<a href="https://photoroom.com/api/remove-background?utm_source=rembg&utm_medium=github_webpage&utm_campaign=sponsor" >
<img src="https://font-cdn.photoroom.com/media/api-logo.png" width="120px;" alt="Unsplash" />
</a>
</td>
<td align="center" vertical-align="center">
<b>PhotoRoom Remove Background API</b>
<br />
<a href="https://photoroom.com/api/remove-background?utm_source=rembg&utm_medium=github_webpage&utm_campaign=sponsor">https://photoroom.com/api</a>
<br />
<p width="200px">
Fast and accurate background remover API<br/>
</p>
</td>
</tr>
</table>
If this project has helped you, please consider making a donation.
Requirements
python: >=3.11, <3.14Installation
Choose one of the following backends based on your hardware:
CPU support
pip install "rembg[cpu]" # for library
pip install "rembg[cpu,cli]" # for library + cliGPU support (NVIDIA/CUDA)
First, check if your system supports onnxruntime-gpu by visiting onnxruntime.ai and reviewing the installation matrix.
<p style="display: flex;align-items: center;justify-content: center;">
<img alt="onnxruntime-installation-matrix" src="./onnxruntime-installation-matrix.png" width="400" />
</p>
If your system is compatible, run:
pip install "rembg[gpu]" # for library
pip install "rembg[gpu,cli]" # for library + cliNote: NVIDIA GPUs may requireonnxruntime-gpu, CUDA, andcudnn-devel. See #668 for details. Ifrembg[gpu]doesn't work and you can't install CUDA orcudnn-devel, userembg[cpu]withonnxruntimeinstead.
GPU support (AMD/ROCm)
ROCm support requires the onnxruntime-rocm package. Install it by following AMD's documentation.
Once onnxruntime-rocm is installed and working, install rembg with ROCm support:
pip install "rembg[rocm]" # for library
pip install "rembg[rocm,cli]" # for library + cliUsage as a CLI
After installation, you can use rembg by typing rembg in your terminal.
The rembg command has 4 subcommands, one for each input type:
- i - single files
- p - folders (batch processing)
- s - HTTP server
- b - RGB24 pixel binary stream
You can get help about the main command using:
rembg --helpYou can also get help for any subcommand:
rembg <COMMAND> --helprembg i
Used for processing single files.
Remove background from a remote image:
curl -s http://input.png | rembg i > output.pngRemove background from a local file:
rembg i path/to/input.png path/to/output.pngSpecify a model:
rembg i -m u2netp path/to/input.png path/to/output.pngReturn only the mask:
rembg i -om path/to/input.png path/to/output.pngApply alpha matting:
rembg i -a path/to/input.png path/to/output.pngPass extra parameters (SAM example):
rembg i -m sam -x '{ "sam_prompt": [{"type": "point", "data": [724, 740], "label": 1}] }' examples/plants-1.jpg examples/plants-1.out.pngPass extra parameters (custom model):
rembg i -m u2net_custom -x '{"model_path": "~/.u2net/u2net.onnx"}' path/to/input.png path/to/output.pngrembg p
Used for batch processing entire folders.
Process all images in a folder:
rembg p path/to/input path/to/outputWatch mode (process new/changed files automatically):
rembg p -w path/to/input path/to/outputrembg s
Used to start an HTTP server.
rembg s --host 0.0.0.0 --port 7000 --log_level infoFor complete API documentation, visit: http://localhost:7000/api
Disable the Gradio UI (reduces idle CPU usage):
rembg s --no-uiRemove background from an image URL:
curl -s "http://localhost:7000/api/remove?url=http://input.png" -o output.pngRemove background from an uploaded image:
curl -s -F file=@/path/to/input.jpg "http://localhost:7000/api/remove" -o output.pngrembg b
Process a sequence of RGB24 images from stdin. This is intended to be used with programs like FFmpeg that output RGB24 pixel data to stdout.
rembg b <width> <height> -o <output_specifier>Arguments:
| Argument | Description |
|----------|-------------|
| width | Width of input image(s) |
| height | Height of input image(s) |
| output_specifier | Printf-style specifier for output filenames (e.g., output-%03u.png produces output-000.png, output-001.png, etc.). Omit to write to stdout. |
Example with FFmpeg:
ffmpeg -i input.mp4 -ss 10 -an -f rawvideo -pix_fmt rgb24 pipe:1 | rembg b 1280 720 -o folder/output-%03u.pngNote: The width and height must match FFmpeg's output dimensions. The flags -an -f rawvideo -pix_fmt rgb24 pipe:1 are required for FFmpeg compatibility.Usage as a Library
Input and output as bytes:
from rembg import removewith open('input.png', 'rb') as i:
with open('output.png', 'wb') as o:
input = i.read()
output = remove(input)
o.write(output)
Input and output as a PIL image:
from rembg import remove
from PIL import Imageinput = Image.open('input.png')
output = remove(input)
output.save('output.png')
Input and output as a NumPy array:
from rembg import remove
import cv2input = cv2.imread('input.png')
output = remove(input)
cv2.imwrite('output.png', output)
Force output as bytes:
from rembg import removewith open('input.png', 'rb') as i:
with open('output.png', 'wb') as o:
input = i.read()
output = remove(input, force_return_bytes=True)
o.write(output)
Batch processing with session reuse (recommended for performance):
from pathlib import Path
from rembg import remove, new_sessionsession = new_session()
for file in Path('path/to/folder').glob('*.png'):
input_path = str(file)
output_path = str(file.parent / (file.stem + ".out.png"))
with open(input_path, 'rb') as i:
with open(output_path, 'wb') as o:
input = i.read()
output = remove(input, session=session)
o.write(output)
For more examples, see the examples page.
Usage with Docker
CPU Only
Replace the rembg command with docker run danielgatis/rembg:
docker run -v .:/data danielgatis/rembg i /data/input.png /data/output.pngNVIDIA CUDA GPU Acceleration
Requirements: Your host must have the NVIDIA Container Toolkit installed.
CUDA acceleration requires cudnn-devel, so you need to build the Docker image yourself. See #668 for details.
Build the image:
docker build -t rembg-nvidia-cuda-cudnn-gpu -f Dockerfile_nvidia_cuda_cudnn_gpu .Note: This image requires ~11GB of disk space (CPU version is ~1.6GB). Models are not included.
Run the container:
sudo docker run --rm -it --gpus all -v /dev/dri:/dev/dri -v $PWD:/data rembg-nvidia-cuda-cudnn-gpu i -m birefnet-general /data/input.png /data/output.pngTips:
- You can create your own NVIDIA CUDA image and install rembg[gpu,cli] in it.
- Use -v /path/to/models/:/root/.u2net to store model files outside the container, avoiding re-downloads.
Models
All models are automatically downloaded and saved to ~/.u2net/ on first use.
Available Models
- u2net (download, source): A pre-trained model for general use cases.
- u2netp (download, source): A lightweight version of u2net model.
- u2net_human_seg (download, source): A pre-trained model for human segmentation.
- u2net_cloth_seg (download, source): A pre-trained model for Cloths Parsing from human portrait. Here clothes are parsed into 3 category: Upper body, Lower body and Full body.
- silueta (download, source): Same as u2net but the size is reduced to 43Mb.
- isnet-general-use (download, source): A new pre-trained model for general use cases.
- isnet-anime (download, source): A high-accuracy segmentation for anime character.
- sam (download encoder, download decoder, source): A pre-trained model for any use cases.
- birefnet-general (download, source): A pre-trained model for general use cases.
- birefnet-general-lite (download, source): A light pre-trained model for general use cases.
- birefnet-portrait (download, source): A pre-trained model for human portraits.
- birefnet-dis (download, source): A pre-trained model for dichotomous image segmentation (DIS).
- birefnet-hrsod (download, source): A pre-trained model for high-resolution salient object detection (HRSOD).
- birefnet-cod (download, source): A pre-trained model for concealed object detection (COD).
- birefnet-massive (download, source): A pre-trained model with massive dataset.
- bria-rmbg (download, source): A state-of-the-art background removal model by BRIA AI.
Environment Variables
| Variable | Description |
|----------|-------------|
| U2NET_HOME | Path to the directory where models are stored. Defaults to $XDG_DATA_HOME/.u2net (or ~/.u2net if XDG_DATA_HOME is not set). |
| XDG_DATA_HOME | Base data directory used when U2NET_HOME is not set. Defaults to ~. |
| MODEL_CHECKSUM_DISABLED | When set (e.g. MODEL_CHECKSUM_DISABLED=1), disables hash verification for downloaded models. This is useful if you want to use your own custom/converted model files without rembg re-downloading the originals. |
| OMP_NUM_THREADS | Sets the number of threads used by ONNX Runtime for inference. |
Using custom model files
If you need to use a modified version of a model (e.g. converted to a different ONNX IR version for compatibility with an older CUDA toolkit), you can prevent rembg from overwriting it:
1. Set MODEL_CHECKSUM_DISABLED=1
2. Place your custom .onnx file in the models directory (~/.u2net/ by default) with the expected filename (e.g. u2net.onnx)
3. Rembg will detect the file exists and use it without re-downloading
FAQ
When will this library support Python version 3.xx?
This library depends on onnxruntime. Python version support is determined by onnxruntime's compatibility.
Support
If you find this project useful, consider buying me a coffee (or a beer):
<a href="https://www.buymeacoffee.com/danielgatis" target="_blank"><img src="https://bmc-cdn.nyc3.digitaloceanspaces.com/BMC-button-images/custom_images/orange_img.png" alt="Buy Me A Coffee" style="height: auto !important;width: auto !important;"></a>
Star History

License
Copyright (c) 2020-present Daniel Gatis
Licensed under the MIT License.