Skip to content

主仓生成质量落后于本地实现:缺质检自愈、抠图能力弱、定标口径不一致 #278

Description

@johnnyzhang-eng

背景

组内在主仓 pipeline 上试生成,反馈角色忽大忽小、抠图有大块抠不干净。我们自己本地跑却很少遇到这么严重的问题。

查下来原因不是参数没调好,而是:本地那套实现比主仓多了整整几层后处理与自愈机制。本地那些"效果不错"的 GIF 是走完这几层之后的产物,拿它们当"管线现在的水平"是自欺——队友在主仓上跑的是没有这几层的版本。

差异清单(逐条对照代码)

能力 本地实现 主仓 ai_engine
抠图模型 rembg + u2net u2netp(轻量版)
去溢色 despill
收缩 alpha 削白边
封闭白块抠透 有(近白判据) 有同类,但判据不同
质检 + 坏帧自动重生成 有,最多 2 轮 完全没有
提示词 linter
VFX / 精修
脚线比例 FOOT_RATIO = 0.90 FOOT_LINE = 0.92
中间画布 1024 再缩到 256 直接出到目标尺寸

按价值排序

1. 质检 + 坏帧自动重生成(缺口最大)

本地的做法:生成一个动作后跑质检 → 被标记的帧单帧重生成,其它帧不动 → 重新对齐打包,最多 2 轮,仍不合格则保留最好的并记录警告。

质检有两层判据:

  • 对齐漂移(纯 CV、零成本):跨帧脚底线与躯干中心的方差,按序列内相对离群判,不用绝对值(绝对值会被姿势差污染)
  • 身份漂移(感知距离):每帧对母版的距离相对序列中位数判离群 + 相邻帧抖动

主仓这一层完全没有:一轮出完就交付,坏帧原样上线。这是"生成质量"最大的单点缺口——它让残次品能自愈,而不是靠人肉发现。

注意主仓已有 ports.ActionQualitymotion_scale / dead_frames / loop_seam),它只上报不处置。自愈要的是"据此重生成"那一步。

2. 抠图能力(直接对应"抠不干净")

主仓用 u2netp,分割质量本身弱于 u2net;而它唯一的补救是底色清理(matte._flat_bg_penalty),偏偏那条有个静默前提:四角标准差 > _BG_FLAT_STD = 8.0完全不清理、直接返回全 1

实测(同一张母版加不同扰动):

背景 四角 std 清理
纯色底(我们自己生成的母版) 0.67 – 1.23 ✓ 生效
高斯噪声 σ=10 10.07 ✗ 整个跳过
横向渐变 25/255 12.81 ✗ 整个跳过

这解释了"本地没遇到":我们的母版底色极纯,永远走"清理生效"那条路;队友用带渐变或噪点的参考图,清理静默失效,而 u2netp 对闭合区域(四足腿间、披风与身体围出的空隙)天然失灵,整块背景就留在产物里。

而且它不报错、不告警,产物照常交付。

3. 定标口径不一致

脚线 0.90 vs 0.92、中间画布 1024 vs 直出。两套口径并存意味着同一个角色在两边出来的构图不同,跨端对比会得出错误结论。

建议

分三个 PR,按上面顺序做,别一次全迁——每一层都要能单独验证效果:

  1. 质检 + 自动重生成(要先定"重生成"在主仓怎么落:单帧重生成需要 provider 支持按帧调用)
  2. 抠图升级:u2net + despill + 削白边;底色清理守卫触发时至少要上报,不能静默跳过
  3. 定标口径统一,并写清哪个是唯一真相源

验收

  • 同一个母版在主仓管线上跑,产出与本地实现的产物做同底对照(同一动作、同一帧数、同一画布)
  • 抠图那条:构造一张非纯色底的母版,确认清理不再静默跳过
  • 自愈那条:故意注入一帧坏帧,确认它被检出并重生成

Refs #171 #273

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions