See-through核心实现原理(二):Marigold如何为动漫估计伪深度?2D→3D权重转换技术拆解
See-through核心实现原理二Marigold如何为动漫估计伪深度2D→3D权重转换技术拆解【免费下载链接】see-throughSingle-image Layer Decomposition for Anime Characters (SIGGRAPH 2026 Conference Paper)项目地址: https://gitcode.com/gh_mirrors/se/see-throughSee-through 是 SIGGRAPH 2026 收录的动漫角色单图图层分解项目能将一张静态动漫插画自动拆解为最多 23 层可编辑图层。本篇聚焦其中最关键的深度环节Marigold 扩散深度估计模型如何为动漫角色生成伪深度以及项目独创的2D→3D 权重转换技术——只改配置文件就能让 2D 深度网络长出帧间注意力且转换后输出与 2D 模型完全一致。上图为 See-through 的代表效果左侧是原始插画I与重合成结果R右上方是带透明通道的语义图层hair、face、topwear、tail……右下角正是 Marigold 输出的伪深度图Spectral 伪彩着色。为什么动漫图层分解需要伪深度动漫插画是纯 2D 的但图层分解本质上是个遮挡排序问题尾巴压住桌沿、刘海盖住眼睛、手伸在衣服前面……谁在上谁在下全靠深度关系判断。See-through 的解法是用 Marigold 这类单目深度估计模型给每个图层估计一张伪深度pseudo-depth。注意伪字——它不追求真实米制距离只关心相对远近足以让后续模块决定 23 个图层的堆叠顺序。Marigold 深度流水线4 步扩散式推理深度推理的核心是 MarigoldDepthPipeline它把估计深度改写成了一道条件去噪题步骤做什么关键实现1️⃣ 条件编码输入图像经 VAE 编码为 4 通道潜变量latentencode_rgb()缩放系数 0.182152️⃣ 加噪去噪从噪声出发U-Net 以图像潜变量为条件仅4 步 DDIM去噪出深度潜变量single_infer()3️⃣ 深度解码深度潜变量经 VAE 解码回图像空间得到 0~1 归一化深度decode_depth()4️⃣ 集合投票多次推理取中位数ensemble输出MAD不确定度ensemble_depth几个对新手友好的设计点默认只要 4 步去噪default_denoising_steps4比传统扩散模型快一个量级单图推理约分钟级批量大小自适应显存不够时 find_batch_size 会自动降 batch不用手动调参3D 模型自动切换当 U-Net 是UNetFrameConditionModel时走多帧分支同一套 pipeline 直接复用于 3D 模型见下文。多分辨率噪声给动漫细节打补丁动漫线稿边缘锐利普通高斯噪声偏高频均匀不利于恢复细线。multi_res_noise.py 采用 Multi-Resolution Noise在多个尺度上叠加随机噪声再上采样混合strength0.9衰减权重让噪声自带从粗到细的结构去噪时线条更稳。训练配置 test_marigold3d.yaml 中downscale_strategy: original即对应这套策略。为动漫微调伪深度训练数据从哪来Marigold 原版在真实照片上训练直接拿来跑动漫会脑补出照片式透视。See-through 的做法是在 train_marigold3d.py 中以Depth-Anything-V2-Large为基座微调数据合成用 Live2D 模型渲染出多深度、多部件的帧序列live2d_bodysamples得到动漫风格下有真值的深度对19 类部件标签hair、face、eyes、topwear、tail、wings……训练时按mix_tag_groups分层组合部件模拟真实插画的堆叠关系损失与评测mse_loss监督验证指标含abs_relative_difference、delta1/2/3_acc等标准深度评测指标配置见 test_marigold3d.yaml。2D→3D 权重转换一行配置差异的魔法这是本篇最硬核的部分。要让深度估计感知图层之间的帧间关系3D朴素做法是重训一个全新 3D 网络——贵。See-through 的 cvt_marigold2d_to_3d.py 给出了巧妙方案第一步只换块类型权重照搬。对比两份配置文件的down_block_types2D 版 marigold.jsonCrossAttnDownBlock2D×3 DownBlock2D3D 版 marigold3d.jsonCrossFrameAttnDownBlock×3 DownBlock2D块结构变了但2D 部分的卷积权重原样载入微调后的 2D checkpoint新增的帧间注意力模块用zero_module零初始化见 layerdiff3d.py。第二步等价性验证。转换脚本用同一份随机输入分别过 3D 模型和 2D 模型打印输出差 cvt_marigold2d_to_3d.py#L99零初始化的帧间注意力对输出贡献为 0 → 转换后 3D 模型的输出与 2D 模型逐像素一致差值应趋近 0。第三步渐进微调。有了热启动train_marigold3d.py 只需小学习率4e-5在 Live2D 多帧数据上微调让帧间注意力长出来代价远低于从头训练。同样的思路还体现在输入通道扩展上patch_unet_convin 给conv_in追加通道时新通道权重填零保证扩通道瞬间模型行为不变——先等价、再学习是这套转换技术的核心哲学。上图是配套 UI 中部件标签的工作画面Marigold 估计的伪深度与 19 类部件标签配合共同决定图层的绘制顺序。相关模块速查表模块路径作用深度推理流水线common/modules/marigold/marigold_depth_pipeline.pyVAE 编码 4 步去噪 ensemble多分辨率噪声common/modules/marigold/multi_res_noise.py结构化加噪利于动漫线条3D 帧间注意力 U-Netcommon/modules/layerdiffuse/layerdiff3d.pyUNetFrameConditionModel2D→3D 转换脚本training/scripts/cvt_marigold2d_to_3d.py换块 零初始化 等价性验证3D 微调脚本training/train/train_marigold3d.py动漫伪深度微调3D 训练配置training/configs/test_marigold3d.yaml数据、噪声、损失、评测指标2D/3D 模型配置marigold.json / marigold3d.json块类型差异所在小结See-through 的深度链路可以一句话概括用扩散模型把看深度变成画深度用零初始化 配置替换让 2D 权重无损升级为 3D再用动漫合成数据微调出可靠的伪深度。这套先等价、再学习的权重转换思路对任何想给现有 2D 扩散模型加时序/多帧能力的同学都有借鉴价值。【免费下载链接】see-throughSingle-image Layer Decomposition for Anime Characters (SIGGRAPH 2026 Conference Paper)项目地址: https://gitcode.com/gh_mirrors/se/see-through创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考