rembg 实操:从第一条命令到 HTTP 服务(附避坑清单)
【免费下载链接】rembgRembg is a tool to remove images background项目地址: https://gitcode.com/GitHub_Trending/re/rembg
rembg 背景移除的价值在于一条龙:安装是一条命令,去背景是一个函数,上线是一个 HTTP 服务。下面直接上手,目标是你在自己机器上把 rembg 安装、部署都跑通,每一步都能当场验证。
能帮你解决:
- 空机器上 5 分钟跑出第一张去背景图
- 把背景移除接进现有 Python 流水线
- 拉起可用 HTTP 服务并做成容器部署
- 让 GPU 真正生效,避开生产环境的常见坑
01 一条命令装好带 CPU 后端的 rembg
需要 Python 3.11 及以上(3.14 以下)。无论当 CLI 还是当库用,实际上都依赖 onnxruntime,所以直接按 extras 安装最省事。
# 库 + 命令行一次装齐,CPU 后端 pip install "rembg[cpu,cli]" # 验证:--version 走快速路径,不会加载模型 rembg --version如果只想当库调用,改成pip install "rembg[cpu]"即可;有 NVIDIA 卡可以直接装[gpu],验证方法见 07 节。
✅判定标准:终端打印出rembg, version 0.x.x这样的版本行即算成功。
02 用 i 命令处理单张文件
rembg i 命令读入一张图,输出透明底 PNG。默认模型 u2net,首次运行会自动把模型(约 176MB)下载到~/.u2net——这一步会卡一下,正常,模型在下载,别关终端。
# 基本用法:输入图 → 透明底输出 rembg i examples/car-2.jpg examples/car-2.cut.png # 两个常用变体:换轻量模型 / 只输出掩码 rembg i -m u2netp examples/car-2.jpg light.png rembg i -om examples/car-2.jpg mask.png如果下游要自己合成,用-om只出掩码,合成环节完全交给你的业务代码。
✅判定标准:用任意看图工具打开输出 PNG,背景显示为透明(棋盘格)即算成功。
03 把背景移除接进 Python 流水线
rembg 的库 API 刻意做得很薄:一个remove(),一个new_session()。输入接受 bytes、PIL Image、numpy 数组三种,输出自动跟随输入类型,去背景主函数在 rembg/bg.py。不传 session 时它会自动创建默认的 u2net 会话。
import numpy as np from PIL import Image from rembg import remove raw = open("in.jpg", "rb").read() out_bytes = remove(raw) # bytes 进,bytes 出 out_pil = remove(Image.open("in.jpg")) # PIL 进,PIL 出 out_arr = remove(np.array(Image.open("in.jpg"))) # ndarray 进,ndarray 出批量处理时,性能关键不在循环写法,而在模型只加载一次:创建一次 session,传给每次调用即可。rembg/session_factory.py 里还会读取OMP_NUM_THREADS环境变量来设置 ONNX 线程数,容器里限核时顺手调一下。
from rembg import remove, new_session session = new_session("isnet-general-use") # 模型只加载这一次 for name in ("a.jpg", "b.jpg", "c.jpg"): out = remove(open(name, "rb").read(), session=session) open(f"{name}.out.png", "wb").write(out) # 常用可选参数 remove(raw, session=session, post_process_mask=True) # 平滑掩码边缘 remove(raw, session=session, only_mask=True) # 只输出掩码 remove(raw, session=session, bgcolor=(255, 255, 255, 255)) # 背景换白色✅判定标准:同一 session 处理 3 张图,从第二张开始单张耗时明显下降即算成功。
04 按业务场景挑选模型
rembg 的模型以"会话"组织,一个名字对应一个预训练网络,选模型就是选会话名。这里直接替你做选择:
| 我选它的理由 | 体积 | 一句话评价 |
|---|---|---|
| u2net:不想动脑的通用选择 | ~176 MB | 默认项,速度精度均衡,CPU 无压力 |
| u2netp:量大求快 | ~4.7 MB | 最轻,边缘略糙,缩略图场景够用 |
| isnet-general-use:通用但要再好一档 | ~104 MB | 边缘优于 u2net,CPU 上更慢 |
| isnet-anime:处理二次元图 | ~104 MB | 动漫专用,发丝更自然 |
| birefnet-general-lite:要 BiRefNet 效果但资源紧 | ~45 MB | 最强模型的轻量版,边缘设备友好 |
| birefnet-general:精度优先且有 GPU | ~900 MB | 系列里效果最好,但重,配 GPU 用 |
| sam:需要人工"点一下" | 编码器+解码器 | 点标注前背景,适合带人工交互的工具 |
选择路径其实很短,问两个问题就能定:
上面这类动漫图是典型例子:通用模型容易丢发丝,专用模型才保得住。
✅判定标准:拿 2-3 张你业务里的图跑两个候选模型,肉眼能接受边缘的那个就是最终答案。
05 用 alpha matting 收细掩码边缘
默认输出在头发、毛发这类半透明边缘容易带一圈白边,这时开 alpha matting。matting 算法与参数含义可以对照 rembg/bg.py 里的alpha_matting_cutout函数理解。
# -a 开启 matting;-af 前景阈值、-ab 背景阈值、-ae 腐蚀尺寸 rembg i -a -af 240 -ab 10 -ae 11 in.jpg out.png-af调得越大,判定前景越严格。从默认值开始,不满意再动,一次只动一个参数。
✅判定标准:放大看发丝边缘,没有白边也没有成块掉发即算成功。
06 用 s 命令拉起 HTTP 服务
rembg s 命令起的是 FastAPI 服务:UI 挂在/,接口文档在/api,核心端点是/api/remove。rembg/commands/s_command.py 里对每个用过的模型做了 session 缓存,同一模型不会重复加载;GET URL 模式自带 50MB 图片上限并拒绝内网地址,安全上不用自己再包一层。
# 启动服务,默认端口 7000;--no-ui 关闭 Gradio 页面省 CPU rembg s -h 0.0.0.0 -p 7000 -l info --no-ui # POST 上传调用,可随时换模型 curl -F "file=@in.jpg" -F "model=u2net" http://localhost:7000/api/remove -o out.png✅判定标准:浏览器访问http://localhost:7000/api能看到接口文档,且 curl 返回透明底 PNG 即算成功。
07 用 onnxruntime 验证 GPU 是否生效
NVIDIA 卡用pip install "rembg[gpu,cli]";AMD 卡先装 onnxruntime-rocm,再用[rocm]extras。GPU 版对 CUDA、cuDNN 的版本匹配卡得很严,装之前先对照 onnxruntime 官方的兼容性矩阵图确定版本组合:
⚠️ onnxruntime 和 onnxruntime-gpu 不能共存,之前装过 CPU 版就先卸载,否则 GPU 版会静默退回到 CPU 上跑。
验证只需一行代码:
import onnxruntime as ort print(ort.get_available_providers()) # 输出包含 "CUDAExecutionProvider" 才说明 GPU 可用创建会话的逻辑会按可用 providers 自动在 CUDA、ROCm、CPU 之间选择,装对之后不用改任何配置。
✅判定标准:providers 列表含 CUDAExecutionProvider,且首张图处理耗时降到 CPU 的一半以内即算成功。
08 用 docker compose 把 rembg 服务做成容器
生产环境建议用容器固定运行环境,并把模型目录挂到本地盘,避免容器重建后模型重新下载:
services: rembg: image: danielgatis/rembg command: s -h 0.0.0.0 -p 7000 --no-ui ports: - "7000:7000" volumes: - ./models:/root/.u2net # 模型目录持久化 restart: unless-stoppeddocker compose up -d起来之后直接测端口。需要 GPU 时换 CUDA 基础镜像,并在创建容器时加--gpus all。
✅判定标准:docker compose ps显示容器 running,宿主机 curl 7000 端口能拿到 PNG 即算成功。
09 生产环境的三个坑怎么解
CI 里模型目录如何缓存?模型存放位置由环境变量U2NET_HOME决定(默认~/.u2net)。在 CI 里把它指到可缓存的目录,后续构建就不会重复下载:
export U2NET_HOME=/cache/rembg-models # CI 中将该路径设为缓存或挂载卷onnxruntime-gpu 装上后仍在 CPU 上跑,或报 CUDA 不匹配?基本都出在版本上:onnxruntime-gpu、CUDA 运行时、cuDNN 三者必须落在兼容性矩阵的同一行。先跑 07 节的验证代码,如果输出里只有 CPUExecutionProvider,就卸载冲突的 onnxruntime,再装对应版本的 onnxruntime-gpu。
多模型切换时显存爆了?服务对每个被请求过的模型都会常驻在 session 缓存里,权重不会释放。把常用模型控制在两个以内;birefnet-general 这类大模型单独起实例,或者换成 -lite 版本,别把多个大模型挤在同一个进程里。
10 上线前自查生产部署
- Python 版本与 onnxruntime(CPU/GPU)版本匹配
- U2NET_HOME 指向稳定模型目录,重启不会重新下载
- 服务已加 --no-ui,端口与日志可观测
- 并发与线程上限已确认(s 命令的 -t 参数)
- 大尺寸图片与请求大小限制已确认(GET URL 模式 50MB)
- 显存/内存监控已接入
【免费下载链接】rembgRembg is a tool to remove images background项目地址: https://gitcode.com/GitHub_Trending/re/rembg
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考