🚀 Bilateral Reference for High-Resolution Dichotomous Image Segmentation
This repository provides the official implementation of the paper "Bilateral Reference for High-Resolution Dichotomous Image Segmentation", which addresses multiple image segmentation tasks and achieves SOTA performance.
🚀 Quick Start
This repo is the official implementation of "Bilateral Reference for High-Resolution Dichotomous Image Segmentation" (CAAI AIR 2024). Visit our GitHub repo: https://github.com/ZhengPeng7/BiRefNet for more details -- codes, docs, and model zoo!
✨ Features
- This BiRefNet for standard dichotomous image segmentation (DIS) is trained on DIS - TR and validated on DIS - TEs and DIS - VD.
- The repo contains the weights of BiRefNet proposed in the paper, which has achieved the SOTA performance on three tasks (DIS, HRSOD, and COD).
📦 Installation
0. Install Packages:
pip install -qr https://raw.githubusercontent.com/ZhengPeng7/BiRefNet/main/requirements.txt
💻 Usage Examples
Basic Usage
Use codes + weights from HuggingFace
Only use the weights on HuggingFace -- Pro: No need to download BiRefNet codes manually; Con: Codes on HuggingFace might not be latest version (I'll try to keep them always latest).
from transformers import AutoModelForImageSegmentation
birefnet = AutoModelForImageSegmentation.from_pretrained('ZhengPeng7/BiRefNet', trust_remote_code=True)
Use codes from GitHub + weights from HuggingFace
Only use the weights on HuggingFace -- Pro: codes are always latest; Con: Need to clone the BiRefNet repo from my GitHub.
# Download codes
git clone https://github.com/ZhengPeng7/BiRefNet.git
cd BiRefNet
from models.birefnet import BiRefNet
birefnet = BiRefNet.from_pretrained('ZhengPeng7/BiRefNet')
Use codes from GitHub + weights from HuggingFace
Only use the weights and codes both locally.
import torch
from utils import check_state_dict
birefnet = BiRefNet(bb_pretrained=False)
state_dict = torch.load(PATH_TO_WEIGHT, map_location='cpu')
state_dict = check_state_dict(state_dict)
birefnet.load_state_dict(state_dict)
Advanced Usage
Use the loaded BiRefNet for inference
from PIL import Image
import matplotlib.pyplot as plt
import torch
from torchvision import transforms
from models.birefnet import BiRefNet
birefnet = ...
torch.set_float32_matmul_precision(['high', 'highest'][0])
birefnet.to('cuda')
birefnet.eval()
def extract_object(birefnet, imagepath):
image_size = (1024, 1024)
transform_image = transforms.Compose([
transforms.Resize(image_size),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
])
image = Image.open(imagepath)
input_images = transform_image(image).unsqueeze(0).to('cuda')
with torch.no_grad():
preds = birefnet(input_images)[-1].sigmoid().cpu()
pred = preds[0].squeeze()
pred_pil = transforms.ToPILImage()(pred)
mask = pred_pil.resize(image.size)
image.putalpha(mask)
return image, mask
plt.axis("off")
plt.imshow(extract_object(birefnet, imagepath='PATH-TO-YOUR_IMAGE.jpg')[0])
plt.show()
Try our online demos for inference:
- Online Single Image Inference on Colab:

- Online Inference with GUI on Hugging Face with adjustable resolutions:

- Inference and evaluation of your given weights:

📄 License
This project is under the MIT license. See the LICENSE file for details.
Acknowledgement
- Many thanks to @fal for their generous support on GPU resources for training better BiRefNet models.
- Many thanks to @not - lain for his help on the better deployment of our BiRefNet model on HuggingFace.
Citation
@article{BiRefNet,
title={Bilateral Reference for High-Resolution Dichotomous Image Segmentation},
author={Zheng, Peng and Gao, Dehong and Fan, Deng-Ping and Liu, Li and Laaksonen, Jorma and Ouyang, Wanli and Sebe, Nicu},
journal={CAAI Artificial Intelligence Research},
year={2024}
}