Anime Denser ✨ Wan2.1-T2V-14B
详情
下载文件
模型描述
ℹ️ 注意:展示帖中的视频并未完全体现此 LoRA 的功能,请重点关注图库中的网格图。
描述
这是一个旨在控制环境构成密度的增强型(滑块)LoRA。自 SD1.5 时代以来,细节增强器和微调器一直是我最喜爱的 LoRA 类型,因此我想为视频模型创建一个类似的功能。
这是我计划训练的首个(但非最后一个)增强型 LoRA。它基于我称之为“差分 LoRA”的训练概念,其方法主要参考了 ComfyTinker 在 此 LoRA 中描述的技术。我对这种方法产生了兴趣,并决定对其进行复现(当然,用于一个完全不同的领域)。我参考了这两篇笔记:一、二。
该概念的核心思想简单而强大:通过训练一对仅在某一特定特征上存在差异的 LoRA,并将它们相减合并,便可“提炼”出一个独立的特定概念。由此得到的衍生 LoRA 可在推理时通过调节其强度,精确控制该特征的存在与强度。通过有效隔离单一概念,理论上可避免在非隔离数据集上训练通用概念 LoRA 时不可避免的“副作用特征泄漏”。然而,用于训练两个锚点 LoRA 的数据集必须在除目标特征外的所有方面高度相似,否则即使经过精心提取,仍可能发生特征泄漏。
值得一提的是,这种方法显然并非全新——它与许多早期概念高度相似,例如 LECO、滑块 LoRA(由 Ostris 和 AI Toolkit 推广)、"Concept sliders" 项目,还可以想起 FlexWaifu、SD Web UI 的 sd-webui-traintrain 扩展,以及 NLP 中的一些技术(如嵌入向量的矢量运算)。更不用说 kohya-ss 著名的 svd_merge_lora.py 脚本。但这是我首次看到该方法被应用于视频模型 LoRA 的训练(尽管 DiT 中的注意力机制与“经典”Transformer 并无本质差异)。
(当然,这一概念也并非机器学习独有,它与经典信号处理中的许多技术如音频降噪中的相位抵消原理如出一辙。)
使用方法
请注意,该 LoRA 本身不会强制产生动漫风格。然而,由于我对真实视频的兴趣几乎为零,我专门为此设计了它,仅用于与 2D 动画 LoRA 配合使用,并仅在该场景下进行了测试,因此我将其命名为“Anime Denser”。我没有在其他任何场景下测试过它(也不打算测试)。
(话说回来,尽管该 LoRA 仅在 2D 动画环境下训练和测试,但若我实现得当,它也应该能用于真实视频。概念隔离的初衷正是为了绕过风格差异。但这只是我的推测。)
我发布的所有片段均使用此 LoRA 与“原生”(基础)Wan2.1-T2V-14B 模型 和 吉卜力 LoRA 结合生成。(也许这不是最佳选择,因为吉卜力 LoRA 过于强大,本身已具备增强效果,有时会掩盖此 LoRA 的放大作用。)我还应用了 self-forcing lightx2v LoRA,否则制作此 LoRA 的演示视频将远不止两天。
我使用 WanVideoWrapper 进行工作流管理,但任何带有 LoRA 加载器的原生工作流同样适用。可通过将展示帖中的任一视频拖入 ComfyUI 获取示例工作流,或从此处下载:JSON。
(请注意,竖向网格视频未嵌入工作流。)
此 LoRA 的安全强度范围为 -3(降低环境密度)至 +3(增强密度,增加更复杂的构成“杂乱”)。对于长而复杂的提示词,也可尝试提升至 +4 或 -4 以补偿文本编码器的影响,但超出此范围很可能导致输出出现噪声。
(经过广泛测试,我发现该 LoRA 在高强度下有时——并非总是——会轻微增强绿色调,尤其在室内环境中。原因尚不明确;或许某些特征图在相减过程中被不均衡地减去了,又或者它试图以某种方式“密集化”光照。)
数据集
对于差分 LoRA,数据集至关重要。对于我选择的“构成密度”概念,我需要两个数据集:一个包含高度细节(“密集”)场景,另一个包含低密度(“稀疏”)场景。这些场景越相似,相减时的噪声抑制效果就越佳。理想情况下,我应采集同一场景但细节层次不同的视图。最初,我计划从动漫电影中收集一些细节丰富的场景,再通过 VACE 或设置低去噪参数的简单 V2V 流程处理。
💡 但随后发生了两件事:
我意识到,要训练“构成密度”这类概念,完全可以用图像,甚至可能更好,因为这样能彻底避免时间维度噪声的干扰!这大大降低了训练 LoRA 的门槛,让我能更自由地尝试各种设置。(在我最终选定此方案前,我已训练了至少 20 个不同 LoRA……)
FLUX.1 Kontext [dev] 发布了,这为我创建理想数据集提供了一种极其便捷的方式。
于是,我从一组由新海诚电影场景构成的数据集中提取了 100 多帧(因其以极其“密集”和细节丰富的环境著称)。然后,我通过 Flux Kontext 驱动的批量工作流,输入以下提示词:
通过移除所有小物件和杂乱元素(如食物、餐具、书籍、海报和装饰品)来降低此场景的细节程度。同时简化服装元素和角色配饰,去除复杂图案、小物件或过度细节。保持角色与整体艺术风格不变,但使整个场景变得极为简洁、低细节、极简。
效果完美。最终,我获得了126 对图像(已包含在训练数据中),用于构建差分 LoRA 的两个组成部分(“密集”LoRA 和“稀疏”LoRA)。以下是数据集图像对的示例:
1️⃣ 详细、密集版本(原始帧)

2️⃣ 简化、稀疏版本(由 Kontext 生成)

关于标注,我尝试了多种方法:
- 每个数据集使用不同的简短标注
- 两个数据集使用相同的简短标注
- 每个数据集使用详细的标注
- 相同标注,但为密集数据集的标注添加“详细”字样
- 密集数据集标注为“详细图像”,稀疏数据集标注为“图像”
- 为每对图像分配唯一 ID —— 例如,稀疏图像标注为“anime_image_165656”,其密集对应图像标注为“anime_image_165656, detailed”(目的是用文本标签封装场景内容以辅助“细节度”概念的相减,但效果不佳)
- 使用空标注 🥳
而(显而易见地)空标注被证明是最有效的。
这其实有一定道理。请看下图,特别是其右侧部分:在 Wan 变换器中,与 MMDiT 不同,自注意力与交叉注意力部分并非交织在一起。

由于文本标注可能通过文本编码器对齐机制引入交叉注意力噪声至 LoRA 权重,完全忽略它(使用空标注)可能是以最小化噪声的方式无条件引入信息的方法。并且由于在 Wan 中交叉注意力与“核心”自注意力是分离的,使用空标注实际上相当于“关闭”了文本条件,而不干扰其他模块。
(如果这听起来毫无道理,我很抱歉。我只是试图找出解释,这是我的最佳猜测,仅基于实验经验及 Gemini Pro 的帮助。)
训练
像往常一样,我使用 Musubi Tuner 进行训练。(Windows 11,RTX 3090,64GB 内存。)
由于可使用图像训练,单个差分 LoRA 组件的训练速度极快。我甚至可以使用 192p 分辨率训练,因为我无需教会模型具体的细节,只需识别“密集”与“稀疏”之间的差异。实际上,我刻意避免学习具体细节,目标是隔离抽象的对比,而非内容差异本身。
因此,我通常只需 2–3 小时即可训练出一对复合 LoRA,这让我拥有充足空间尝试各种设置。我尝试了多种训练配置,最终选择了 Lion 优化器,学习率=2e-5,constant_with_warmup 调度器(50 个预热步数),LoRA 秩为 16,训练 5000 步,批量大小为 1。(所有配置文件均已包含在训练数据中,此处不再详述。)
说实话,我认为这些设置未必重要。我尝试了多种优化器、步数、学习率和调度器参数,但未能得出任何一项选择有显著影响的结论。此外,为深入训练“杂乱度”这种抽象概念,我先进行了一次简单练习:使用 20 张正午场景图像及其由 Kontext 生成的夜间对应图像,训练一个“白天”LoRA。我用不同设置多次训练,仅使用 40 张共享数据集,每次训练从未超过一小时。我在该实验中发现最有效的设置,正是后来用于训练 Anime Denser 的配置。
因此,我认为最关键的是数据集的“纯净度”以及传递给差分脚本的参数(详见下文 👇)。
在训练过程中,两个组件 LoRA 的样本图像看起来都非常糟糕——这反而是好事,因为这正是我预期的(试想用 192x192 分辨率的静态图像训练,怎么可能期待清晰结果!)。但最棒的是,两组样本看起来都同样糟糕,关键区别在于:密集 LoRA 明确学会了如何注入构成性杂乱,而稀疏 LoRA 学会了再现空旷、无生机的环境。因此,我有理由相信,相减过程中这些“上下文感知”特征会被有效抵消,最终保留的仅是环境密度与细节度的概念。此时,我知道是时候“开火”了 👨🍳。
差分 LoRA
在获得两个 LoRA 后,我需要将一个从另一个中减去。幸运的是,ComfyTinker 分享了详细的执行方法(我之前已引用),尽管未提供实际代码。但作为一名拥有超过 13 年经验的软件开发者,我毫不畏惧,知道该怎么做。我打开 Cursor,粘贴说明,指令它据此生成脚本。
随后,我对初始脚本进行了多种增强(此处不展开,因仍在开发中)——如按名称模式或数值索引指定特定模块、基于目标范数自动计算 alpha 值、通过幅值阈值筛选参与合并的层、使用百分位过滤自动计算阈值、通过计算差值幅值找出差异最显著的层、添加快速随机 SVD 用于快速原型开发、增加模块结构分析用于调试,以及选择是否将非目标层置零或完全排除在输出之外。我未来可能会持续修改和增强此脚本以用于其他差分 LoRA 项目,但即使当前版本也已足够好用。(我已将生成差分 LoRA 的脚本一并包含在训练数据的归档文件中。)
我不会在这段文字中添加详细的使用说明来扩充篇幅(除非评论中有人询问),但本质上,它只是通过计算两个输入LoRA之间的差异来创建一个新的差分LoRA。以下是我在创建该差分LoRA时使用的精确命令:
python differential_lora.py ^
--lora_a animedenser_pos_wan14b.safetensors ^
--lora_b animedenser_neg_wan14b.safetensors ^
--target_blocks attn ^
--output animedenser_v01rc.safetensors ^
--rank 4 ^
--dtype float32 ^
--alpha 1.0 ^
--device cuda ^
--analyze_blocks ^
--exclude_non_targeted
(我应该承认,我尝试了大量参数,但并未完全理解它们如何影响过程,可能还有更有效的方法来创建合并的LoRA。)
在合并时,我仅针对注意力层(--target_blocks attn)。因此,生成的LoRA仅影响模型中的注意力机制,所有其他模块都被排除在目标LoRA之外(并非被置零,只是被排除;如果我省略--exclude_non_targeted,它们会被置零,这会更严重影响基础模型的权重),而其他所有层(前馈、归一化等)将保持使用基础模型的原始权重。我决定将组合密度放在注意力(特别是交叉注意力)模块中效果最佳,结果似乎确实有效🤷♂️
我选择的alpha值是经验性的,未必是最优的。(我曾尝试实现“最优”alpha的自动计算,但结果不如预期,反而降低了输出LoRA的效果。)
如果你迫切想使用此脚本,请注意:SVD是一种非常耗时的操作。即使在RTX 3090上,将两个rank 16的LoRA合并为rank 4的差分LoRA也花费了我约一小时。为了更快测试,你可以使用--fast_svd标志运行脚本。这将使用奇异值分解的有损近似,让你在5-10秒内生成一个合并的LoRA以评估其效果。如果结果有潜力,你再运行完整的SVD分解以获得最优合并结果。
结论
这个LoRA可能不适合所有生产场景(对于WanVideo这样强大的模型,或许直接在提示中请求“杂乱”或“空旷”会更有效),但我对结果感到满意。虽然我不认为这个LoRA因其实用性而重要,但它证明了这一概念和方法是可行的,即使针对“杂乱”这种抽象且“分布广泛”的概念。
我分享这些结果,是希望有人觉得有用并能在此基础上进一步开发。我希望更多人能接受并完善这种技术。这是一种相对便宜且可靠的为视频模型构建“调节滑块”的方法,我相信它具有巨大潜力。(我个人期待训练类似运动增强器、去模糊器、细节增强器和一些更疯狂的想法。)
💾 我附上了复现此LoRA所需的所有训练材料(数据集、配置、脚本)。这个领域仍有许多可探索的空间,我的脚本和方法远未达到可能实现的完美与精确。例如,或许在特定模块上训练此类LoRA,或在合并时跳过某些模块会更好。我曾尝试仅合并前几层(0–10)、中间层或两者结合,希望提升效果,但未能发现明显优势。我甚至尝试创建一个简单节点来开关Wan DiT模块,以理解各模块的作用。(在HV训练中,据我所知,通常在图像上训练LoRA时会跳过双模块。)但这些尝试并未帮助我找到最佳策略。从我使用的合并命令可以看出,我仅关注注意力模块,假设它们负责场景的无条件(与提示无关)“塑造”。这种方法比在所有模块上合并效果更好。
🤔 另外,我认为虽然在静态图像上训练已被证明有效(至少在计算层面),但仍可能引入隐性噪声,降低模型的运动能力(我希望很快能解决这个问题,因为我计划下一批差分LoRA在视频上训练)。
🚀 值得一提的是Flux Kontext,它对我来说简直是救命稻草。众所周知,它允许以“反向”方式构建数据集:输入一张Kontext完全无法生成的源图像,将其转化为它能理解的内容——轻松且高效。我认为它的用途远不止于图像训练,或许一些新颖而创新的利用方式正近在咫尺。
致谢
🏆 如我开头所述,该方法最初由ComfyTinker提出,我非常感谢他与社区分享。没有他的笔记,我可能根本无法复现,或者至少会花费多得多的时间。
🏆 同样衷心感谢self forcing训练方法的作者,他们使得LightX2V项目得以诞生,并提供了他们的Wan蒸馏模型;感谢blyss从该模型中提取出Wan加速器LoRA;感谢comfyanonymous创建ComfyUI;最后但同样重要的是,感谢Kijai对WanVideoWrapper的杰出工作。
🏆 最后,向所有banodocians致敬,他们每天在Wan相关(及其他)频道中分享宝贵信息。他们的见解和想法极大地帮助了本LoRA的创建。
