背景
组内在主仓 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.ActionQuality(motion_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,按上面顺序做,别一次全迁——每一层都要能单独验证效果:
- 质检 + 自动重生成(要先定"重生成"在主仓怎么落:单帧重生成需要 provider 支持按帧调用)
- 抠图升级:u2net + despill + 削白边;底色清理守卫触发时至少要上报,不能静默跳过
- 定标口径统一,并写清哪个是唯一真相源
验收
- 用同一个母版在主仓管线上跑,产出与本地实现的产物做同底对照(同一动作、同一帧数、同一画布)
- 抠图那条:构造一张非纯色底的母版,确认清理不再静默跳过
- 自愈那条:故意注入一帧坏帧,确认它被检出并重生成
Refs #171 #273
背景
组内在主仓 pipeline 上试生成,反馈角色忽大忽小、抠图有大块抠不干净。我们自己本地跑却很少遇到这么严重的问题。
查下来原因不是参数没调好,而是:本地那套实现比主仓多了整整几层后处理与自愈机制。本地那些"效果不错"的 GIF 是走完这几层之后的产物,拿它们当"管线现在的水平"是自欺——队友在主仓上跑的是没有这几层的版本。
差异清单(逐条对照代码)
ai_enginerembg+ u2netFOOT_RATIO = 0.90FOOT_LINE = 0.92按价值排序
1. 质检 + 坏帧自动重生成(缺口最大)
本地的做法:生成一个动作后跑质检 → 被标记的帧单帧重生成,其它帧不动 → 重新对齐打包,最多 2 轮,仍不合格则保留最好的并记录警告。
质检有两层判据:
主仓这一层完全没有:一轮出完就交付,坏帧原样上线。这是"生成质量"最大的单点缺口——它让残次品能自愈,而不是靠人肉发现。
注意主仓已有
ports.ActionQuality(motion_scale/dead_frames/loop_seam),它只上报不处置。自愈要的是"据此重生成"那一步。2. 抠图能力(直接对应"抠不干净")
主仓用 u2netp,分割质量本身弱于 u2net;而它唯一的补救是底色清理(
matte._flat_bg_penalty),偏偏那条有个静默前提:四角标准差 >_BG_FLAT_STD = 8.0就完全不清理、直接返回全 1。实测(同一张母版加不同扰动):
这解释了"本地没遇到":我们的母版底色极纯,永远走"清理生效"那条路;队友用带渐变或噪点的参考图,清理静默失效,而 u2netp 对闭合区域(四足腿间、披风与身体围出的空隙)天然失灵,整块背景就留在产物里。
而且它不报错、不告警,产物照常交付。
3. 定标口径不一致
脚线 0.90 vs 0.92、中间画布 1024 vs 直出。两套口径并存意味着同一个角色在两边出来的构图不同,跨端对比会得出错误结论。
建议
分三个 PR,按上面顺序做,别一次全迁——每一层都要能单独验证效果:
验收
Refs #171 #273