rembgとU²-Netを使った背景切り抜き:完全かつ実践的なガイド

rembgとU²-Netを使った背景切り抜き:完全かつ実践的なガイド

U²-Netの顕著物体検出モデルが1行での背景切り抜きをどのように実現しているのか — 実行可能な実際のコードとともに紹介します。

画像の背景を切り抜く作業といえば、かつては画像エディタを開き、被写体の輪郭をなぞって、手作業でエッジを綺麗にする必要がありました。2026年8月7日現在では、あるオープンソースツールのおかげで、1行のコードで — オフラインかつ無料で — 行うことができます。そのツールの名前は rembg であり、その基盤となっているディープラーニングモデルが U²-Netです。このガイドでは、それぞれが何か、それらがどのように組み合わさっているかを説明し、今日すぐに実行できるコピーアンドペースト可能な例を提供します。

なぜ今なのか? 背景切り抜きは、白背景のEC商品画像、プロフィールのアバター、サムネイル、ステッカーパック、証明写真、他のモデルのためのデータセット準備、アプリアイコンなど、いたるところでさりげなく使われています。クラウドAPIは画像ごとに課金され、第三者に写真を送信します。rembgは同じ作業をローカルで行うため、より安価で、プライバシーが保たれ、スクリプト化が可能です。

問題:被写体を背景から分離する

このタスクの専門用語は 顕著物体検出(Salient Object Detection) (SOD)と呼ばれます。画像内で視覚的に最も目立つ物体を構成するピクセルを見つけ出すタスクです。ピクセルごとの「これが被写体か?」というマップさえできれば、背景切り抜きは残りの部分を透明にするだけです。つまり、難しいのは消去作業ではなく、特に髪の毛、毛皮、ガラスのような厄介なエッジの周りで正確なマスクを生成することなのです。

U²-Netとは?

U²-Net(ユースクエアードネットと発音)は、顕著物体検出のために2020年に発表されたディープニューラルネットワークです。その核となるアイデアは、 ネストされた2段階のU字型構造です。古典的なU-Netには、特徴を学習しながら画像を縮小するエンコーダと、それをフル解像度のマスクに戻すように拡大するデコーダがあります。U²-Netは、小さなU字型のブロック — 呼ばれるところの ReSidual U-block (RSU) — を、より大きなU字型ネットワークの各ステージの内部に配置します。この「Uの中にUがある」構造により、計算量が非現実的になることなく、細かいディテールと大規模なコンテキストの両方を捉えることができます。

出力はカラー画像ではありません。グレースケールの 顕著性マップ(saliency map)であり、各ピクセルには0(背景)から1(被写体)までの値が割り当てられます。rembgはこのマップを アルファチャンネルとして使用し、透過PNGを提供します。

広く提供されている2つのサイズ:

  • u2net — フルモデル。約176MBで、全般的な精度が最も高いです。
  • u2netp — 軽量版。5MB未満で、はるかに高速かつ小型ですが、精度はわずかに劣ります。

rembgとは?

rembgは、オープンソース(MITライセンス)のPythonツールおよびライブラリで、U²-Net(およびいくつかの新しいモデル)を非常にシンプルなインターフェースでラップしています。モデルは ONNX Runtimeを介して実行されるため、通常のCPUで動作し、オプションでGPUでも動作します。初回使用時にモデルの重みを1度だけダウンロードしてキャッシュし、 ~/.u2net/その後は完全にオフラインで動作します。

使用方法は、コマンドラインツール、Python関数、小型HTTPサーバーの3種類があります。

ステップ1:インストール

# Library + command-line interface
pip install "rembg[cli]"

# Optional: GPU acceleration (needs a CUDA-capable setup)
pip install "rembg[gpu]"

コマンドを初めて実行したとき、rembgはモデルをフェッチして ~/.u2net/ に保存します(デフォルトモデルの場合、1回限り約176MB)。その後はオフラインになります。

ステップ2:背景を切り抜く

試してみるのに最も手っ取り早いのはコマンドラインです:

# One image: input can be JPG/PNG/WebP, output should be PNG (needs transparency)
rembg i photo.jpg photo-nobg.png

# A whole folder at once
rembg p ./input-images ./output-images

# Run it as a local HTTP service (great for apps)
rembg s
# then POST an image to http://localhost:7000/api/remove

Python APIも同様に短いです。PIL画像を使用するのが最もクリーンなアプローチです:

from rembg import remove
from PIL import Image

with Image.open("photo.jpg") as img:
    result = remove(img)          # returns an RGBA image with the background cut out
    result.save("photo-nobg.png") # PNG preserves transparency

生バイトを好む場合(Webハンドラーやパイプライン用):

from rembg import remove

with open("photo.jpg", "rb") as src, open("photo-nobg.png", "wb") as dst:
    dst.write(remove(src.read()))

ステップ3:さらに応用する — モデル、きれいなエッジ、新しい背景

適切なモデルを選ぶ

rembgは複数のモデルをサポートしています。指定には、 -m (CLIの場合)や、 セッション (Pythonの場合)を使用します。対象によって適したモデルが異なります:

モデル 最適用途 備考
u2net 汎用(デフォルト) 精度のバランスが良い、約176MB
u2netp 速度 / 低メモリ 非常に小さい(<5MB)、わずかに粗い
u2net_human_seg 人物 / ポートレート 人物向けに調整済み
isnet-general-use シャープな汎用マスク u2netよりもきれいに抜けることが多い
silueta u2netと同等の精度、より小さいサイズ 約43MB、ドロップインで使える
birefnet-general 最高品質のエッジ 大きく遅いが、髪の毛に優れている
# CLI: use the human-segmentation model
rembg i -m u2net_human_seg portrait.jpg portrait-nobg.png
# Python: reuse one session across many images (much faster in a batch)
from rembg import remove, new_session
from PIL import Image

session = new_session("isnet-general-use")
for name in ("a.jpg", "b.jpg", "c.jpg"):
    with Image.open(name) as img:
        remove(img, session=session).save(name.replace(".jpg", "-nobg.png"))

アルファマッティングで細かいエッジをきれいにする

髪の毛や柔らかいエッジは、生マスクのままだとはさみで切り抜いたように見えてしまう部分です。rembgには、そのような境界を柔らかく洗練させる アルファマッティング が組み込まれています:

from rembg import remove
from PIL import Image

with Image.open("hair.jpg") as img:
    result = remove(
        img,
        alpha_matting=True,
        alpha_matting_foreground_threshold=240,
        alpha_matting_background_threshold=10,
        alpha_matting_erode_size=10,
    )
    result.save("hair-nobg.png")

処理は遅くなりますが、ポートレートや毛皮を持つ動物での違いは劇的です。

背景を切り抜く代わりに置き換える

透過PNGはしばしば第一歩にすぎません。被写体を単色(例えば、白のEC向け背景)に配置するには、合成を行います:

from rembg import remove
from PIL import Image

foreground = remove(Image.open("product.jpg"))          # RGBA subject
background = Image.new("RGBA", foreground.size, (255, 255, 255, 255))
Image.alpha_composite(background, foreground).convert("RGB").save("product-white.jpg")

色を入れ替えたり、別の写真を背景として使用したりすれば、数行のコードで完全な合成パイプラインが完成します。

実例:透明なプロフィールバッジ

エンドツーエンドのシナリオをご紹介します。ポートレートを丸くて透明な「バッジ」にしたいとしましょう。人物を切り抜き、円形にフレーミングし、それ以外を透明にして、浮いているステッカーのように見せたい場合です。

from rembg import remove, new_session
from PIL import Image, ImageDraw

# 1. Cut out the person with the human model + alpha matting for clean hair edges
session = new_session("u2net_human_seg")
with Image.open("me.jpg") as img:
    cut = remove(img, session=session, alpha_matting=True).convert("RGBA")

# 2. Center-crop to a square
side = min(cut.size)
left, top = (cut.width - side) // 2, (cut.height - side) // 2
square = cut.crop((left, top, left + side, top + side))

# 3. Apply a circular mask so only a disc remains
mask = Image.new("L", square.size, 0)
ImageDraw.Draw(mask).ellipse((0, 0, side, side), fill=255)
square.putalpha(mask)

square.save("badge.png")  # transparent circular badge, ready to use

これは、写真ベースのアプリアイコンやプロフィールバッジの背後にあるまさにそのパターンです。rembgが重労働(人物の特定)を行い、PILの数行のコードがフレーミングを行います。

一連の仕組み

  1. rembgが画像をリサイズし、ONNX Runtimeを通じてU²-Netモデルに渡します。
  2. U²-Netは顕著性マップ(どのピクセルが被写体であるかのグレースケールの予測)を出力します。
  3. rembgはそのマップを元の寸法にリサイズし、アルファチャンネルとして使用します。
  4. オプションで、アルファマッティングが被写体と背景の境界を細かく調整します。
  5. 背景が消えたRGBA画像が得られます。

パフォーマンスと実践的なヒント

  • CPUで十分です (たまに使う程度の場合)。サイズやモデルにもよりますが、画像1枚あたりおよそ数秒かかります。バッチ処理の場合は rembg[gpu] をインストールし、CUDA環境を使用してください。
  • セッションを再利用する (new_session(...)(多数の画像を処理する場合)。作成に時間がかかるため、1回だけ作成して使い回します。
  • 巨大な入力は縮小する 。Webサイズの出力が必要なだけであれば、処理前に縮小してください。その方が速く、マスクの精度も通常は同等に良好です。
  • キャッシュの保存先は ~/.u2net/ です。本番環境で実行時にフェッチされないよう、Dockerイメージに事前にモデルをダウンロードしておきましょう。
  • 出力はPNG(またはWebP)にする必要があります 。透過を維持するためです。JPGだと透明部分が黒で塗りつぶされてしまいます。

2026年の今、なぜ重要なのか

U²-Netのようなローカルのオープンソースモデルにより、かつてはデザイナーや有料APIが必要だったタスクが、スクリプト可能でプライベートなゼロコストのステップに変わりました。これにより、バッチパイプライン(一晩で数千枚の商品画像を処理するなど)、写真をアップロードしないオンデバイスアプリ、アバターやステッカーなどのクリエイティブな自動化が可能になります。rembgは、その機能への親しみやすい玄関口なのです。

結論

rembgを使えば1行で本番レベルの背景切り抜きができ、その裏ではU²-Netという顕著物体モデルが実際の作業を行っています。まずはデフォルトの u2netから始め、人物の場合は u2net_human_seg に切り替え、エッジが重要なときはアルファマッティングに手を伸ばし、単なる切り抜き以上のものが必要なときは新しい背景に合成してみてください。

メリット

  • 1行で背景を切り抜き可能。無料でオープンソース(MIT)。
  • ローカルでオフライン動作するため、プライベートかつ安価。画像ごとのAPI費用なし。
  • 対象に応じた複数のモデルがあり、細かいエッジ用のアルファマッティングも可能。
  • CLI、Pythonライブラリ、HTTPサーバーとして動作。CPU・GPUのどちらも利用可能。

デメリット

  • 初回実行時に大きなモデル(デフォルトで約176MB)をダウンロードする。
  • 非常に大きな画像や大規模なバッチ処理をCPUで行うと遅くなる場合がある。
  • 非常に細かいディテール(飛び散った髪の毛、透明なガラス)には、依然としてアルファマッティングやBiRefNetのような重いモデルが必要。
  • 明確な単一の被写体がない乱雑なシーンでは精度が落ちる。

注意事項

この記事は教育目的のものです。例のファイル名やパスはご自身の環境に合わせて置き換え、依存する前に現在のrembgのドキュメントでモデル名を確認し、処理する画像の著作権とプライバシーを尊重してください。モデルの挙動やパッケージのオプションはバージョン間で変更される可能性があります。

よくある質問

  • rembgとは? — ディープラーニングモデル、主にU²-Netを使用して画像の背景を切り抜くオープンソースのPythonツールおよびライブラリです。
  • rembgがデフォルトで使用するモデルは何ですか?u2netです。これはフル機能のU²-Net顕著物体検出モデルです。
  • U²-Netとは? — 最も目立つ物体に属するピクセルを予測し、顕著性マスクとして出力する、ネストされた2段階のU字型構造を持つ2020年のニューラルネットワークです。
  • rembgは無料でオープンソースですか? — はい。MITライセンスで、無料で使用できます。
  • GPUは必要ですか? — いいえ。ONNX Runtimeを介してCPUで動作します。GPUは大規模なバッチ処理を高速化するためだけに使われます。
  • 髪の毛の周りのエッジをよりきれいにするにはどうすればよいですか?alpha_matting=Trueを有効にするか、 isnet-general-use または birefnet-general.
  • 人物に最適なモデルはどれですか?u2net_human_segです。これは人物向けに調整されています。
  • モデルはどこに保存されますか?~/.u2net/の中に保存されます。初回使用時に一度ダウンロードされ、その後はオフラインで使用されます。

タグ

#python #machine-learning #image-processing #rembg #u2net #computer-vision #deep-learning #background-removal #onnx #open-source

Free field guide

Linux Server Hardening Checklist

30 practical steps to take a fresh Linux box from default to defensible. Enter your email — you'll get the PDF instantly, plus new posts on Linux, security & AI.