topfans/docs/specs/2026-05-24-rembg-segmentation-feasibility-study.md

253 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 |
| Star2026-05 | 18k+ |
| License | MIT |
| 语言 | Python 3.10+ |
| 部署形态 | CLI / HTTP Server / Python SDK |
| 推理后端 | ONNX RuntimeCPU / 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 QPSU2Net~3 QPSBiRefNet |
| **运维人力** | 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.yamlK8s 参考)
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 Deployment1×T4 GPU 起步 | 待评审 |
| 与 IVPD 的关系 | 并行 + 按 scene 路由,互为熔断兜底 | 已决 |
---
## 八、参考资料
- rembg GitHubhttps://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 推进。