🚀 Bilateral Reference for High-Resolution Dichotomous Image Segmentation
このプロジェクトは、高解像度の二値画像セグメンテーションにおける双方向参照手法を提供します。BiRefNetモデルは、画像の背景除去、マスク生成、二値画像セグメンテーションなどのタスクで優れた性能を発揮します。
🚀 クイックスタート
このレポジトリは、論文 "Bilateral Reference for High-Resolution Dichotomous Image Segmentation" (CAAI AIR 2024) の公式実装です。詳細(コード、ドキュメント、モデルズー)については、GitHubレポジトリ https://github.com/ZhengPeng7/BiRefNet をご覧ください。
✨ 主な機能
- 背景除去
- マスク生成
- 二値画像セグメンテーション
- カモフラージュ物体検出
- 顕著物体検出
📦 インストール
0. パッケージのインストール
pip install -qr https://raw.githubusercontent.com/ZhengPeng7/BiRefNet/main/requirements.txt
💻 使用例
1. BiRefNetの読み込み
HuggingFaceのコードと重みを使用
HuggingFace上の重みのみを使用します。利点:BiRefNetのコードを手動でダウンロードする必要がありません。欠点:HuggingFace上のコードは最新バージョンでない可能性があります(最新に保つように努めます)。
from transformers import AutoModelForImageSegmentation
birefnet = AutoModelForImageSegmentation.from_pretrained('ZhengPeng7/BiRefNet', 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')
GitHubのコードとローカルの重みを使用
重みとコードの両方をローカルで使用します。
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()
birefnet.half()
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').half()
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()
2. ローカルで推論エンドポイントを使用
自分で deploy をクリックしてエンドポイントを設定する必要があり、コストが発生する場合があります。
import requests
import base64
from io import BytesIO
from PIL import Image
YOUR_HF_TOKEN = 'xxx'
API_URL = "xxx"
headers = {
"Authorization": "Bearer {}".format(YOUR_HF_TOKEN)
}
def base64_to_bytes(base64_string):
if "data:image" in base64_string:
base64_string = base64_string.split(",")[1]
image_bytes = base64.b64decode(base64_string)
return image_bytes
def bytes_to_base64(image_bytes):
image_stream = BytesIO(image_bytes)
image = Image.open(image_stream)
return image
def query(payload):
response = requests.post(API_URL, headers=headers, json=payload)
return response.json()
output = query({
"inputs": "https://hips.hearstapps.com/hmg-prod/images/gettyimages-1229892983-square.jpg",
"parameters": {}
})
output_image = bytes_to_base64(base64_to_bytes(output))
output_image
オンラインデモの試用
- Colabでのオンライン 画像推論:

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

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

📚 詳細ドキュメント
このレポジトリには、論文で提案されたBiRefNetの重みが含まれており、3つのタスク(DIS、HRSOD、COD)でSOTA性能を達成しています。
🔧 技術詳細
このBiRefNetは、標準的な二値画像セグメンテーション(DIS)用に DIS-TR で訓練され、DIS-TEsとDIS-VD で検証されています。
📄 ライセンス
このプロジェクトはMITライセンスの下で公開されています。詳細については、LICENSE を参照してください。
謝辞
- @Freepik 様には、より高解像度のBiRefNetモデルの訓練やその他の探索におけるGPUリソースの提供に感謝いたします。
- @fal 様には、より汎用的なBiRefNetモデルの訓練におけるGPUリソースの提供に感謝いたします。
- @not-lain 様には、HuggingFace上でのBiRefNetモデルのより良いデプロイにおける支援に感謝いたします。
引用
@article{zheng2024birefnet,
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},
volume = {3},
pages = {9150038},
year={2024}
}