Skip to content

[Bug]: 抠图在角色内部打洞,像素风深色区被打穿两成到三成 #799

Description

@johnnyzhang-eng

问题

抠图会在角色内部打洞:alpha=0 的区域出现在四周被主体包围的位置,合成到画布上时洞里透出背景色,角色看起来像被漂白。

证据

生产 task 391「像素程序员法师角色」,256×256,auto_pixelate=true,32 帧。判据是纯拓扑的——从画布四边泛洪找真背景,剩下的透明区即内部洞:

主体面积 内部洞 占主体
f00 11479px 2620px 22.8%
f08 11354px 2326px 20.5%
f16 8843px 2825px 31.9%

五分之一到三分之一的角色被打穿,集中在黑头发、深色卫衣、裤子。同任务的参考首帧半透明像素占 16.5%,动作帧升到 23.9%~35.5%,沿时间轴单调上升。

已排除的原因(逐条做了对照,勿重复走一遍)

  • 不是缺少填洞逻辑。 providers/matte.pycutout() 里已有 _fill_enclosed_holes(alpha, rgb),判据是连通性 + 颜色两条,且已处理「迈步时两靴交叠封死腿间空隙」那种情况。生产镜像里这段代码在。
  • 不是精修被关掉。 生产 WINDUP_MATTE_REFINE=1,u2netp 与 u2net 两个权重都在 /root/.cache/windup/,取逐像素较大 alpha。
  • 不是像素化那一步造的。 用生产同一份 cutout() + to_pixel_art() 跑真实 i2v 帧,全分辨率 2.2% → 像素化到 195 是 2.2% → 到 160 是 2.1%,各步不增。
  • 不是底色识别失败。 同一帧上 _bg_key 返回 [128,128,126],填洞那步没有被跳过。

尚未定位的部分(说明现状,不假装已知)

在我手上的 i2v 帧(银发法师,主体 562px)上,生产 cutout() 只留 2.2% 内部洞;task 391 的交付帧却是 20%~32%。两者差别可能在角色本身(391 是深色小体量 chibi,肢体细)或在它那条视频。task 391 的源视频没有持久化,只存了帧,因此无法直接复跑那一条。

要往下定位需要其中之一:

  • 用同一角色母版重新生成一次动作,并保留源视频;
  • 或在管线里把 i2v 源视频(或抽出的原始帧)也存一份,供事后归因。

顺带发现(另一个问题,不在本 Issue 修)

#686 已合入 BiRefNetMatteProvider,但没有任何调用点实例化它bootstrap/worker.py:133orchestrator/executor.py:865executor.py:1197view_sheet_executor.py:343 四处仍硬编码 OnnxU2NetMatteProvider(),也无配置开关。代码在仓里,生产跑的仍是 u2net。且不能直接切换:BiRefNet 单帧峰值实测 6.85GB,生产 worker 容器内存上限 5GiB(宿主 4 核 7GB)。

验收标准

  • 能复跑出 20%~32% 那个量级的内部洞(先有可复现的坏例,再谈修)。
  • 定位到它由哪一步产生。
  • 修完在同一坏例上内部洞占比接近 0,且腿间空隙一类真空隙不被填实。

相关

Metadata

Metadata

Assignees

No one assigned

    Labels

    MiniSpec小改动的精简规格bugSomething isn't working

    Type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions