🚀 BiRefNet
BiRefNetは、高解像度の二値画像セグメンテーションに特化したモデルです。このモデルは、背景除去、マスク生成、二値画像セグメンテーション、カモフラージュ物体検出、顕著物体検出などのタスクにおいて優れた性能を発揮します。
🚀 クイックスタート
このリポジトリは、論文 "Bilateral Reference for High-Resolution Dichotomous Image Segmentation" (CAAI AIR 2024) の公式実装です。詳細なコード、ドキュメント、モデルズーは、GitHubリポジトリ https://github.com/ZhengPeng7/BiRefNet を参照してください。
1 南开大学 2 西北工業大学 3 国防科技大学 4 アールト大学 5 上海人工知能実験室 6 トレント大学
DIS-Sample_1 |
DIS-Sample_2 |
 |
 |
📦 インストール
0. パッケージのインストール
pip install -qr https://raw.githubusercontent.com/ZhengPeng7/BiRefNet/main/requirements.txt
💻 使用例
基本的な使用法
HuggingFaceのコードと重みを使用する場合
HuggingFace上の重みのみを使用します。利点は、BiRefNetのコードを手動でダウンロードする必要がないことです。欠点は、HuggingFace上のコードが最新バージョンでない可能性があることです(できるだけ最新に保つように努めます)。
from transformers import AutoModelForImageSegmentation
birefnet = AutoModelForImageSegmentation.from_pretrained('zhengpeng7/BiRefNet-portrait', trust_remote_code=True)
GitHubのコードとHuggingFaceの重みを使用する場合
HuggingFace上の重みのみを使用します。利点は、コードが常に最新であることです。欠点は、GitHubからBiRefNetのリポジトリをクローンする必要があることです。
# コードのダウンロード
git clone https://github.com/ZhengPeng7/BiRefNet.git
cd BiRefNet
from models.birefnet import BiRefNet
birefnet = BiRefNet.from_pretrained('zhengpeng7/BiRefNet-portrait')
GitHubのコードとHuggingFaceの重みを使用する場合
重みとコードの両方をローカルで使用します。
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)
ロードしたBiRefNetを推論に使用する場合
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()
このBiRefNetは、標準的な二値画像セグメンテーション(DIS)に特化しており、DIS-TR で学習され、DIS-TEs と DIS-VD で検証されています。
📚 詳細ドキュメント
このリポジトリには、論文で提案されたBiRefNetの重みが含まれており、3つのタスク(DIS、HRSOD、COD)でSOTAの性能を達成しています。BiRefNetのコードと最新の更新情報は、GitHubページ https://github.com/ZhengPeng7/BiRefNet を参照してください。
オンラインデモで推論を試す
- Colabでのオンライン 単一画像推論:

- Hugging Faceでの GUI付きオンライン推論(解像度調整可能):

- 与えられた重みの 推論と評価:

謝辞
- @fal さんには、より良いBiRefNetモデルを学習するためのGPUリソースを提供していただき、心より感謝申し上げます。
- @not-lain さんには、HuggingFace上でのBiRefNetモデルのより良いデプロイメントに協力していただき、感謝申し上げます。
引用
@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}
}