10 KiB
10 KiB
rembg 通用抠图自建方案 — 技术调研与可行性
非总方案文档。 镭射卡 DDL / API / 实施以
2026-05-25-laser-card-refactor-design.md为准。
创建日期: 2026-05-24
状态: 仅调研,本期不落地(镭射人像抠图走魔搭 RMBG-2.0) 目标读者: 后端 / 算法 / 运维 / 产品
一、背景与触发动机
镭射卡重构方案(§七)将抠图能力从客户端直连阿里云 IVPD 迁移到服务端代理。本期实现继续对接阿里云 IVPD SegmentImage,但评审反馈指出两点局限:
- IVPD 通用分割对异形主体精度不稳定:头发丝、镂空、半透明物体(例如吧唧、贴纸、徽章)抠图边缘易残留色斑或缺口。
- 吧唧生成器(规划中) 等后续创作工坊也需要抠图能力,类型不再局限于人像,需要更灵活的模型路由。
rembg(danielgatis/rembg)是开源的背景移除工具链,封装了 U^2-Net / ISNet / BiRefNet 等主流分割模型,支持本地或 GPU 服务部署。本文调研其作为 TopFans 通用抠图能力的可行性。
⚠️ 本期不实施。本文档目的是为后续吧唧生成器、高质量抠图选项预留技术路径,避免镭射卡接口设计锁死。
二、rembg 能力概览
2.1 项目信息
| 项 | 内容 |
|---|---|
| GitHub | https://github.com/danielgatis/rembg |
| Star(2026-05) | 18k+ |
| License | MIT |
| 语言 | Python 3.10+ |
| 部署形态 | CLI / HTTP Server / Python SDK |
| 推理后端 | ONNX Runtime(CPU / CUDA / CoreML / DirectML) |
2.2 内置模型矩阵
| 模型 | 体积 | 训练域 | 适用主体 | 速度(T4 GPU) |
|---|---|---|---|---|
u2net |
176MB | 通用前景 | 人像、宠物、产品图 | ~150ms / 1024² |
u2netp |
4.7MB | 通用前景(轻量版) | 同上,精度略降 | ~60ms |
u2net_human_seg |
176MB | 人像专精 | 人像 | ~150ms |
u2net_cloth_seg |
176MB | 服饰分块 | 衣物图(上/下/全身) | ~150ms |
silueta |
43MB | 轻量人像 | 移动端友好 | ~70ms |
isnet-general-use |
178MB | 通用前景(DIS) | 吧唧、徽章、贴纸等异形 ✅ | ~180ms |
isnet-anime |
178MB | 二次元 | IP 形象、动画头像 | ~180ms |
birefnet-general |
885MB | SOTA 通用 | 高质量发丝/透明物 | ~400ms |
birefnet-general-lite |
178MB | SOTA 轻量 | 平衡精度与速度 | ~200ms |
birefnet-portrait |
885MB | SOTA 人像 | 大头照精修 | ~400ms |
birefnet-massive |
885MB | 复杂场景 | 多主体、遮挡场景 | ~400ms |
镭射卡人像主路径推荐
u2net_human_seg;吧唧 / 异形推荐isnet-general-use或birefnet-general-lite。
2.3 关键特性
- 服务端 HTTP 模式:
rembg s --port 7000,POST/api/remove直接返回 PNG。 - 批处理 / 文件夹模式:CLI
rembg p input/ output/。 - alpha 通道精修:
--alpha-matting启用 trimap-free matting,发丝级别更细。 - 后处理:
--only-mask返回纯 mask;可选--post-process-mask平滑边缘。 - 多模型同进程:可在同一进程加载多个模型,按请求路由。
三、与 IVPD 的对比
3.1 能力对比
| 维度 | 阿里云 IVPD SegmentImage |
rembg(自建) |
|---|---|---|
| 主体类型 | 通用,人像优 | 多模型按场景选择 |
| 精度 | 人像 9/10,异形 6/10 | 取决于模型;BiRefNet 系列 ≈ 9/10(全场景) |
| 发丝/半透明 | 边缘普通 | alpha-matting 后接近商用 PS 抠图 |
| 吧唧/异形 | 偶发残缺 | isnet-general-use 显著更好 |
| 二次元/IP 形象 | 不擅长 | isnet-anime 专属模型 |
| 接口稳定性 | 服务级 SLA 99.9% | 自建需自行保障 |
| 吞吐弹性 | 按需扩容 | GPU 实例固定上限 |
| 冷启动 | 无 | 模型加载 5-15s(首次) |
| 审计 | 控制台日志 | 完全自控(结构化日志) |
| 网络依赖 | 必须外网 | 可内网部署 |
3.2 成本对比(量化)
假设:日均抠图请求量 = N
| 维度 | IVPD | rembg 自建(T4 GPU + 4 vCPU + 16GB) |
|---|---|---|
| 变动成本 | ≈ ¥0.02/次 | 接近 0(电费忽略) |
| 固定成本 | 0 | ≈ ¥2,000 / 月(阿里云 GN6i T4 抢占式实例) |
| 盈亏平衡点 | — | N ≈ 3,300 张/日 |
| 峰值吞吐 | 弹性 | T4 单卡 ~10 QPS(U2Net),~3 QPS(BiRefNet) |
| 运维人力 | 0 | ≈ 0.2 人月(监控/模型更新) |
结论:日均 < 3,000 张时 IVPD 更划算;> 5,000 张或对精度有强需求时自建更优。
四、可行性评估
4.1 技术可行性 ✅
- ONNX Runtime CUDA 后端在 T4 / A10 上跑通 U2Net / ISNet / BiRefNet 均无障碍
- rembg 已有 Docker 镜像
danielgatis/rembg:latest-gpu(基于 nvidia/cuda 11.8) - HTTP 接口契约简单(multipart
file字段,PNG 返回),可直接被 Go 网关代理调用 - 模型权重一次性下载(首次启动 ≈ 1.5GB 流量),后续可挂载到 PVC 复用
4.2 风险与挑战
| 风险 | 等级 | 缓解 |
|---|---|---|
| GPU 资源紧缺(阿里云 T4 抢占式偶发被回收) | 中 | 双 AZ 部署 / 准备 CPU 兜底节点(U2NetP,~600ms/图) |
| 模型更新断更(rembg 主仓更新频率有时下降) | 低 | 模型权重独立托管在 OSS,与代码解耦 |
| License 边界(部分预训练权重为研究用途) | 中 | 商用前逐一审查:U2Net Apache 2.0 ✅;BiRefNet MIT ✅;ISNet Apache 2.0 ✅ |
| 冷启动延迟 | 低 | 预热加载常用模型;首次请求超时由网关重试覆盖 |
| 图片合规 | 高 | 前置 OSS bucket 已做合规扫描;自建链路同样接入审核 |
| 私有部署运维 | 中 | 增加 0.2 人月监控(GPU 利用率、显存、推理延迟 P99) |
4.3 与现有架构契合度
flowchart LR
C[客户端] -->|POST /api/v1/segment| GW[Gin 网关]
GW -->|scene=portrait| IVPD[阿里云 IVPD]
GW -.->|scene=bajis/sticker(未来).-> RB[rembg GPU Service]
IVPD --> OSS[(OSS bucket)]
RB -.-> OSS
OSS --> RES[返回 oss_key + signed_url]
关键设计要求(指导本期镭射卡接口):
- 服务端接口必须保留
scene字段 —— 即便本期仅scene=portrait走 IVPD,也要在 schema 中预留scene枚举位,为未来bajis/sticker接 rembg 留路。 - 响应必须返回
oss_key—— 而不是直接返回阿里云域名 URL,避免后续切换后端时影响前端缓存逻辑。 - 熔断粒度按 backend 分 ——
provider=ivpd与provider=rembg独立熔断阈值。
五、推荐演进路径(仅供规划)
Phase 1(本期,2026-05~06)
- 镭射卡服务端代理上线,仅对接 IVPD
SegmentImage - 接口 schema 预留
scene字段,但只接受scene=portrait - 不部署 rembg
Phase 2(吧唧生成器立项时,时间未定)
- 部署 1 个 T4 GPU 节点,运行 rembg
isnet-general-use+birefnet-general-lite - 扩展
scene=bajis/scene=sticker - 流量灰度:5% → 20% → 100%
- 与 IVPD 做 A/B:对同一图片双跑,人工标注 200 张验证质量
Phase 3(成本拐点 / 高精度需求)
- 镭射卡人像引入
scene=portrait_hd,路由到 BiRefNet - IVPD 降级为兜底(rembg 熔断时回退)
- 评估部署到自有 IDC(数据合规要求强时)
六、Phase 2 部署技术要点(参考用,本期不实施)
6.1 部署拓扑
# rembg-deployment.yaml(K8s 参考)
apiVersion: apps/v1
kind: Deployment
metadata:
name: rembg-server
spec:
replicas: 1
template:
spec:
nodeSelector:
accelerator: nvidia-t4
containers:
- name: rembg
image: danielgatis/rembg:latest-gpu
args: ["s", "--host", "0.0.0.0", "--port", "7000"]
resources:
limits:
nvidia.com/gpu: 1
memory: 12Gi
volumeMounts:
- mountPath: /root/.u2net
name: model-cache
readinessProbe:
httpGet:
path: /api
port: 7000
initialDelaySeconds: 30
volumes:
- name: model-cache
persistentVolumeClaim:
claimName: rembg-models-pvc
6.2 网关代理实现要点(Go 伪代码)
// gateway/controller/segment_controller.go
func (c *SegmentController) Portrait(ctx *gin.Context) {
scene := ctx.DefaultPostForm("scene", "portrait")
provider := pickProvider(scene)
// provider 路由策略:
// - portrait -> ivpd
// - portrait_hd -> rembg/birefnet-portrait (Phase 3)
// - bajis / sticker -> rembg/isnet-general-use (Phase 2)
switch provider {
case "ivpd":
c.proxyToIVPD(ctx)
case "rembg":
c.proxyToRembg(ctx, modelForScene(scene))
}
}
6.3 监控指标
| 指标 | 类型 | 告警阈值 |
|---|---|---|
segment_request_total{provider} |
counter | — |
segment_duration_seconds{provider} |
histogram | P99 > 5s |
segment_error_total{provider, code} |
counter | 5xx 率 > 5% / 5min |
rembg_gpu_utilization |
gauge | 持续 > 90% |
rembg_gpu_memory_used |
gauge | > 80% 显存 |
rembg_queue_depth |
gauge | > 20(堆积) |
七、决策清单
| 决策项 | 推荐 | 状态 |
|---|---|---|
| 镭射卡本期是否接 rembg | 否,仅 IVPD | 已决 |
接口是否预留 scene 字段 |
是 | 已决,写入镭射卡设计 §七 |
| Phase 2 启动条件 | 吧唧生成器立项 或 日均 > 5000 张抠图 | 待评审 |
| rembg 优先模型 | isnet-general-use(异形)+ u2net_human_seg(人像兜底) |
待评审 |
| 部署形态 | K8s Deployment,1×T4 GPU 起步 | 待评审 |
| 与 IVPD 的关系 | 并行 + 按 scene 路由,互为熔断兜底 | 已决 |
八、参考资料
- rembg GitHub:https://github.com/danielgatis/rembg
- U^2-Net 论文:https://arxiv.org/abs/2005.09007
- BiRefNet 论文:https://arxiv.org/abs/2401.03407
- DIS (ISNet) 论文:https://arxiv.org/abs/2203.03041
- 阿里云 IVPD 文档:https://help.aliyun.com/product/134618.html
- ONNX Runtime CUDA 部署:https://onnxruntime.ai/docs/execution-providers/CUDA-ExecutionProvider.html
文档结束。 本期镭射卡重构请参考 2026-05-18-laser-card-refactor-design.md §七 中的 IVPD 单一对接方案;rembg 议题将在吧唧生成器立项或抠图量达阈值后另立 RFC 推进。