253 lines
10 KiB
Markdown
253 lines
10 KiB
Markdown
# rembg 通用抠图自建方案 — 技术调研与可行性
|
||
|
||
> **非总方案文档。** 镭射卡 DDL / API / 实施以 [`2026-05-25-laser-card-refactor-design.md`](./2026-05-25-laser-card-refactor-design.md) 为准。
|
||
> **创建日期:** 2026-05-24
|
||
> **状态:** 仅调研,本期不落地(镭射人像抠图走魔搭 RMBG-2.0)
|
||
> **目标读者:** 后端 / 算法 / 运维 / 产品
|
||
|
||
---
|
||
|
||
## 一、背景与触发动机
|
||
|
||
镭射卡重构方案(§七)将抠图能力从客户端直连阿里云 IVPD 迁移到服务端代理。本期实现继续对接阿里云 IVPD `SegmentImage`,但评审反馈指出两点局限:
|
||
|
||
1. **IVPD 通用分割对异形主体精度不稳定**:头发丝、镂空、半透明物体(例如吧唧、贴纸、徽章)抠图边缘易残留色斑或缺口。
|
||
2. **吧唧生成器(规划中)** 等后续创作工坊也需要抠图能力,类型不再局限于人像,需要更灵活的模型路由。
|
||
|
||
`rembg`([danielgatis/rembg](https://github.com/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 与现有架构契合度
|
||
|
||
```mermaid
|
||
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]
|
||
```
|
||
|
||
**关键设计要求(指导本期镭射卡接口):**
|
||
|
||
1. **服务端接口必须保留 `scene` 字段** —— 即便本期仅 `scene=portrait` 走 IVPD,也要在 schema 中预留 `scene` 枚举位,为未来 `bajis` / `sticker` 接 rembg 留路。
|
||
2. **响应必须返回 `oss_key`** —— 而不是直接返回阿里云域名 URL,避免后续切换后端时影响前端缓存逻辑。
|
||
3. **熔断粒度按 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 部署拓扑
|
||
|
||
```yaml
|
||
# 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 伪代码)
|
||
|
||
```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 推进。
|