🎧 Listen to this article: हिंदी · English · தமிழ் · తెలుగు · ಕನ್ನಡ · മലയാളം · ଓଡ଼ିଆ · 日本語 · 中文
🌍 Read this in your language: हिंदी · தமிழ் · తెలుగు · ಕನ್ನಡ · മലയാളം · ଓଡ଼ିଆ · 日本語 · 中文
移除图像背景过去意味着打开编辑器,勾勒出主体的轮廓,并手工清理边缘。截至 2026 年 8 月 7 日,你可以用一行代码完成这项工作 —— 离线且免费 —— 这要归功于一个名为 rembg 的开源工具,以及它所依赖的深度学习模型, U²-Net。本指南解释了它们各自是什么,它们如何结合,并为你提供今天就可以运行的复制粘贴示例。
为什么是现在?背景移除正悄然无处不在:白色背景上的电子商务产品拍摄、个人资料头像、缩略图、贴纸包、证件照、用于其他模型的数据集准备,以及应用程序图标。云 API 按每张图像收费,并将你的图片发送给第三方。rembg 在本地完成同样的工作,更便宜、私密且可编写脚本。
问题:将主体与背景分离
这项任务的技术名称是 显著对象检测 (SOD):找到构成图像中视觉上最突出对象的像素。一旦你有了那个每像素“这是主体吗?”的映射,移除背景就只是将其他所有内容变为透明。所以困难的部分不是擦除 —— 而是产生一个准确的遮罩,尤其是在像头发、毛皮和玻璃这样棘手的边缘周围。
U²-Net 是什么?
U²-Net(发音为 "U-squared Net")是 2020 年发布的一个用于显著对象检测的深度神经网络。它的核心思想是一个 嵌套的、两级 U 型结构。经典的 U-Net 有一个在学习特征时缩小图像的编码器,以及一个将其扩展回全分辨率遮罩的解码器。U²-Net 将一个小的 U 型块 —— 称为 残差 U 块 (ReSidual U-block, RSU) —— 放在更大的 U 型网络的每个阶段中。那种“U 中的 U”让它能够捕捉到精细的细节和大规模的上下文,而不会变得重得令人无法接受。
输出的不是彩色图像。它是一个灰度 显著性图 (saliency map):每个像素得到一个从 0(背景)到 1(主体)的值。rembg 获取该图,将其用作 alpha 通道,并交给你一张透明的 PNG。
有两种尺寸广泛发布:
- u2net —— 完整模型,约 176 MB,具有最佳的整体准确度。
- u2netp —— 轻量级版本,小于 5 MB,速度更快、体积更小,精确度略低。
rembg 是什么?
rembg 是一个开源(MIT 许可)的 Python 工具和库,它将 U²-Net —— 以及几个较新的模型 —— 封装在一个极其简单的接口后面。它通过 ONNX Runtime运行模型,所以它可以在普通的 CPU 上工作,也可以选择在 GPU 上工作。首次使用时,它会下载模型权重一次并将它们缓存在 ~/.u2net/,之后就可以完全离线运行。
你有三种使用方式:命令行工具、Python 函数和一个小型 HTTP 服务器。
步骤 1:安装
# Library + command-line interface
pip install "rembg[cli]"
# Optional: GPU acceleration (needs a CUDA-capable setup)
pip install "rembg[gpu]"
第一次运行任何命令时,rembg 会将模型抓取到 ~/.u2net/ (一次性,默认模型约 176 MB)。之后它是离线的。
步骤 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 或 会话 (session) 在 Python 中选择一个。不同的模型适合不同的主体:
| 模型 | 最适合 | 备注 |
|---|---|---|
u2net |
通用(默认) | 平衡的准确度,约 176 MB |
u2netp |
速度 / 低内存 | 微型(<5 MB),略微粗糙 |
u2net_human_seg |
人物 / 肖像 | 为人物图像进行了调优 |
isnet-general-use |
更清晰的通用遮罩 | 通常比 u2net 更干净 |
silueta |
u2net 准确度,体积更小 | 约 43 MB 直接替换 |
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"))
使用 alpha matting 清理细微边缘
头发和柔和的边缘是原始遮罩看起来像被剪刀剪掉的地方。rembg 具有内置的 alpha matting 来柔化和细化那些过渡:
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 通常是第一步。要将主体放在纯色上(例如,白色电子商务背景),对其进行合成:
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 完成构图。
它如何工作,端到端
- rembg 调整图像大小,并通过 ONNX Runtime 将其馈送给 U²-Net 模型。
- U²-Net 输出一个显著性图 —— 一个猜测哪些像素是主体的灰度图。
- rembg 将该图调整回原始尺寸,并将其用作 alpha 通道。
- 可选地,alpha matting 会细化主体和背景之间的边界。
- 你会得到一张背景已经消失的 RGBA 图像。
性能和实用技巧
- CPU 已经足够 供偶尔使用;预计每张图像大约需要一秒钟或几秒钟,具体取决于大小和模型。安装
rembg[gpu]并使用 CUDA 设置进行批处理。 - 重复使用会话 (
new_session(...))处理许多图像 —— 创建它才是缓慢的部分,所以只需做一次。 - 缩小巨大的输入 在处理之前,如果你只需要一个网页大小的结果;它更快,并且遮罩通常一样好。
- 缓存位于
~/.u2net/—— 在你的 Docker 镜像中预下载模型,这样生产环境就永远不会在运行时获取。 - 输出必须是 PNG(或 WebP) 以保持透明度;JPG 会用黑色填充透明区域。
为什么在 2026 年这很重要
像 U²-Net 这样本地的、开源的模型已经让一项曾经需要设计师或付费 API 的任务,变成了一个可编写脚本、私密且零成本的步骤。这解锁了批处理管道(隔夜处理成千上万的产品图像)、永远不上传你的照片的设备端应用,以及像头像和贴纸这样的创意自动化。rembg 是通往这种能力的友好的前门。
结论
rembg 让你在一行代码中获得生产级的背景移除,而 U²-Net 则是底层进行真正工作的显著对象模型。从默认的 u2net开始,切换到 u2net_human_seg 用于人物,当边缘重要时使用 alpha matting,当需要的不止是剪裁时合成到新背景上。
优点
- 一行代码移除背景;免费且开源 (MIT)。
- 离线且本地运行 —— 私密且便宜,没有按图像计费的 API 费用。
- 针对不同主体的多种模型,加上针对细微边缘的 alpha matting。
- 可作为 CLI、Python 库或 HTTP 服务器运行;CPU 或 GPU。
缺点
- 第一次运行会下载一个大模型(默认模型约 176 MB)。
- 非常大的图像或大批量的 CPU 处理可能会很慢。
- 非常精细的细节(飘逸的头发、透明玻璃)仍然需要 alpha matting 或像 BiRefNet 这样更重的模型。
- 在没有单一清晰主体的杂乱场景中准确度会下降。
注意
本文仅用于教育目的。请用你自己的替换示例文件名和路径,在依赖模型之前对照当前的 rembg 文档验证模型名称,并尊重你处理的任何图像的版权和隐私。模型行为和包选项可能会在版本之间发生变化。
常见问题
- rembg 是什么? —— 一个开源的 Python 工具和库,使用深度学习模型(主要是 U²-Net)移除图像背景。
- rembg 默认使用什么模型? —
u2net,完整的 U²-Net 显著对象检测模型。 - U²-Net 是什么? —— 一个 2020 年的神经网络,具有嵌套的两级 U 型结构,它预测哪些像素属于最突出的对象,作为显著性遮罩输出。
- 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
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.
Free. No spam — unsubscribe in one click.


Responses
Sign in to leave a response.