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

10 KiB
Raw Blame History

rembg 通用抠图自建方案 — 技术调研与可行性

非总方案文档。 镭射卡 DDL / API / 实施以 2026-05-25-laser-card-refactor-design.md 为准。
创建日期: 2026-05-24
状态: 仅调研,本期不落地(镭射人像抠图走魔搭 RMBG-2.0 目标读者: 后端 / 算法 / 运维 / 产品


一、背景与触发动机

镭射卡重构方案(§七)将抠图能力从客户端直连阿里云 IVPD 迁移到服务端代理。本期实现继续对接阿里云 IVPD SegmentImage,但评审反馈指出两点局限:

  1. IVPD 通用分割对异形主体精度不稳定:头发丝、镂空、半透明物体(例如吧唧、贴纸、徽章)抠图边缘易残留色斑或缺口。
  2. 吧唧生成器(规划中) 等后续创作工坊也需要抠图能力,类型不再局限于人像,需要更灵活的模型路由。

rembgdanielgatis/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-usebirefnet-general-lite

2.3 关键特性

  • 服务端 HTTP 模式rembg s --port 7000POST /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 与现有架构契合度

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=ivpdprovider=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.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 伪代码)

// 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 路由,互为熔断兜底 已决

八、参考资料


文档结束。 本期镭射卡重构请参考 2026-05-18-laser-card-refactor-design.md §七 中的 IVPD 单一对接方案rembg 议题将在吧唧生成器立项或抠图量达阈值后另立 RFC 推进。