The Tale of the Princess Kaguya 🎥 Wan2.1-T2V-14B

详情

模型描述

关于

《竹取物语》(2013)是高畑勋对日本最古老民间传说《竹取物语》的动人诠释。故事围绕一位 humble 竹匠夫妇在竹茎中发现的一名天界婴儿展开。随着她成长为一位惊人的年轻女子,她挣扎于贵族社会的 rigid 期望,同时怀念着简单乡村生活的自由。影片探讨了身份、自由与生命短暂的本质,引发人们对人生真正渴望与幸福是否可得的深思。

这部影片真正特别之处在于其非凡的视觉风格,大量借鉴了日本传统的墨绘与木版画技法。高畑勋刻意选择了一种极简、手绘的风格,有时甚至显得“未完成”,但这种粗糙感反而将观众更深地拉入故事之中。水彩背景柔和梦幻,人物动画采用书法般的线条,随情绪变化而流动——平静时柔缓优雅,情绪高涨时则锐利而跳跃。这种艺术选择不仅美观,更将影片与日本数百年艺术传统相连,同时突破了我们习以为常的精致、电脑完美动画风格。高畑勋拥抱不完美、允许想象填补空白的方式,蕴含着强大的力量。最终呈现的影片既古老又全新,赢得广泛赞誉,成为有史以来最卓越的动画电影之一。

描述

此 LoRA 与 Redline 一样,延续了一种难以通过静态帧完全表达的动画风格。它还试图更进一步(虽未完全成功)摆脱 Wan 的默认 3D 渲染倾向,旨在全面替换为 2D 手绘动画风格。目标不仅是改变视觉美学,还包括动作、节奏、构图与整体能量。当然,仅靠一个小型 LoRA 无法实现所有这些。

🙂 尽管如此,该模型仍相当不错地学习了这种风格,甚至超出了我的预期,成功复制了《竹取物语》风格的诸多特征:简化的景观、巧妙运用留白、水墨画风、未完成画作的视觉效果、衣料的褶皱、情感的描绘、动态与静止的平衡以及极简主义。它具备良好的泛化能力,不仅能呈现真实的历史场景与人物,也能描绘未来、中世纪、现代等虚构场景。

🙁 我在测试中才发现一个顽固的缺陷,且未能修复:部分视频中,某些物体上会出现奇怪的光斑。早期检查点(如 15K–19K 步)也存在此现象,因此这不是过拟合(该 LoRA 并无对特定结构帧的偏倚,而数据集的提示词本身作为输入,可能生成与原始数据集完全不同的视频)。关闭优化(如 Sage Attention 等)或调整采样参数效果甚微。降低 LoRA 强度可减轻该效应,但会使结果进一步偏离目标风格。我尝试关闭部分 LoRA 模块,亦未奏效。

最糟糕的是,这种现象完全不可预测,而我也不明白其成因。我最合理的推测是:模型试图在某些数据集中未包含的元素上,插值并重现某种隐含的风格模式(如柔和、漫射的光线,几乎无阴影),但它执行得不恰当。训练数据中缺乏强烈定向光源的示例(如阳光眩光、光晕或镜面高光),因为这与《竹取物语》的风格无关。因此,当提示中暗示光源时,模型在习得风格与先验表示之间产生矛盾,从而“幻觉”出柔和光晕、边缘光晕或微弱光斑等视觉元素。

⌛ 如果我最终查明这一现象的确切原因,我将重新训练(或进行校准微调)该 LoRA。 但该模型的开发过程漫长而疲惫,目前我无力再投入两三周可能徒劳的实验。

使用方法

在提示词中添加 "Kaguya-hime style"。它可能无需触发词也能工作,但我通常都会加上,从未测试过不加的情况,因此不清楚其无触发词时的表现。

我使用 Kijai 的封装器,但它也应能与原生工作流兼容。

所有视频均基于 WanVideo2.1-14B-T2V 模型生成,每个视频均嵌入了 ComfyUI 工作流。

工作流的 JSON 示例见 此处

数据集

数据集来源于电影《竹取物语》。我使用 PySceneDetect 进行场景分割,随后将片段转为 16fps,并手动挑选了 295 个片段。更好的做法应是进一步缩减(至 100–150 个),如此大量的片段仅在数据集多样性极高的情况下才合理。但在我的案例中,我无法再删减:每个片段都是一幅艺术品,难以取舍。我还从这些视频中提取了约 1000 帧(使用 ffmpeg),并从中人工挑选了 240 张图像,构建为高分辨率图像数据集。

数据集结构旨在模仿 Wan 原始训练数据的分桶结构(根据 官方 WanVideo 报告),其中包含 720p、480p 和 192p 的视频与图像。据此:

1️⃣ 数据集第一部分为 255 张图像,原始分辨率为 1920x1040,训练分辨率 1328x720px(720p)。

图像使用 Qwen2.5-VL-7B-Instruct 标注,提示如下:

你是一位专业的视觉场景描述者。
对于以下动画帧(从视频场景中提取的静态画面),请撰写一段详细、高度描述性的文字,要求:
- 长度约 80–100 字。
- 以确切短语 "Kaguya-hime style" 开头。
- 使用现在时、简洁、具体、客观的语言,仅描述画面中可见内容。
- 遵循“主体 → 场景 → 隐含动作/氛围”的顺序(例如:“Kaguya-hime style,一个穿灰衣的小男孩站在清晨的木门前,晨雾在他身后茅草屋顶间飘荡。”)。
- 包含精确细节(年龄、性别、衣着颜色、主要物体、环境、天气、时间)。
- 不使用情感形容词、抽象叙述,除必需前缀外不使用风格性词汇。
- 若场景含多个主体,聚焦于行动中的主要人物。
使用以下模板:“Kaguya-hime style,[可选镜头类型(特写、中景、全景)] 中的 [具视觉细节的主体] [姿势/静态位置或微妙动态]。[详细场景]。[细微动态元素或氛围线索(风、飘落花瓣、涟漪水波、灯笼微光),以避免画面呆板]。[额外视觉背景细节]。”(示例:“Kaguya-hime style,一位年迈工匠穿着褪色灰袍,在简陋工坊中雕刻木偶。阳光透过窗隙,尘埃在光束中漂浮。工具与木屑散落在低矮桌面上。榻榻米地板上的影子逐渐拉长。”)

2️⃣ 数据集第二部分为 295 个片段,原始分辨率为 1920x1040,训练分辨率 880x480px(480p)。在数据集配置中,它们被设定为:

  • frame_extraction = "head" 且 target_frames = [13]

    (在此分辨率下,为避免显著降低训练速度,我在 RTX 3090 上能承受的最大帧数)。

此部分数据集同样使用 Qwen2.5-VL-7B-Instruct 标注,并采用以下提示(强制详细描述并聚焦细节):

你是一位专业的视觉场景描述者。
对于以下动画视频片段,请撰写一段详细、高度描述性的文字,要求:
- 长度约 80–100 字。
- 以确切短语 "Kaguya-hime style" 开头。
- 使用现在时、简洁、具体、客观的语言,仅描述屏幕上可见内容。
- 遵循“主体 → 场景 → 动作/镜头”的顺序(例如:“Kaguya-hime style,一位身穿白和服的年轻女子。她漫步于月光下的竹林。镜头缓缓平移,萤火虫在其周围飘舞。”)
- 若有可见镜头运动(平移、推拉、俯仰),必须包含;若无明显镜头运动,则聚焦主体与环境动态。
- 包含精确细节(年龄、性别、衣着颜色、主要物体、环境、天气、时间、镜头运动)。
- 不使用情感形容词、抽象叙述,除必需前缀外不使用风格性词汇。
- 若场景含多个主体,聚焦于行动中的主要人物。
- 强调所有可见动作,包括细微动态:衣料飘动、粒子效果、环境变化。
使用以下模板:“Kaguya-hime style,[可选镜头类型,若清晰] 中的 [具视觉细节的主体描述] [动作/动态]。[详细场景描述]。[镜头运动]。[额外背景元素或氛围细节]。”(示例:“Kaguya-hime style,中景镜头展现一位留着长黑发、身着素白和服的年轻女子,黄昏时缓缓穿过竹林。镜头随她同步平移。金黄的光线透过摇曳的竹竿洒落。落叶散落在她脚下。”)

3️⃣ 第三部分使用相同的 295 个视频训练分辨率 352x192px(192p)。我能使用的最大帧数为 49。这些视频分为三组:

  • 34 至 49 帧:target_frames = [33],frame_extraction = "uniform",frame_sample = 2
  • 50 至 100 帧:target_frames = [49],frame_extraction = "uniform",frame_sample = 2
  • 101 至 160 帧:target_frames = [49],frame_extraction = "uniform",frame_sample = 3

此部分数据集同样使用 Qwen2.5-VL-7B-Instruct 标注,提示如下(强制简短描述,不强调细节):

你是一位擅长优雅水墨风格动画视频片段的视觉场景描述专家。请用一句话撰写 15–30 字的描述,遵循以下模板:
"Kaguya-hime style, [主要主体] [动作/动态或状态] 在/于 [具体地点与背景元素],伴有 [生动细节:颜色、光线、天气、氛围],于 [时间段或情境相符的时间描述]。"
示例:"Kaguya-hime style,一位孤身武士漫步于雾气弥漫的竹林,月光投下柔和阴影,于静谧午夜,营造出永恒水墨的宁静感。"
要求:
- 明确主要主体(如人物、动物、物体)。
- 描述其主要动作、动态或状态(使用生动动词或形容词)。
- 指定环境,包括背景元素(如森林、河流、建筑,或极简抽象图案)。
- 包含丰富的视觉细节(如闪耀的月光、鲜艳色彩、迷雾)。
- 指明时间(如黎明、黄昏),或适合情境的时间描述(如“永恒之夜”用于奇幻场景)。
- 若场景缺乏清晰主体或时间,优先描述生动的环境与氛围。
- 确保描述简洁、有感染力、自然流畅。

所有标注均经人工核对(我做了大量修正)。部分角色被显式标记(“Takenoko”、“Menowarawa”、“Sutemaru”),但这仅作趣味之用;使用这些标签并不能保证准确重现特定角色。实际上,为风格 LoRA 标注角色的更佳方式是仅在角色为画面唯一主体时才标记。但本次我主要目标是再现“平均化”的风格,而非特定角色,因此这种方式对我而言已足够。

🗃️ 以下是数据集配置的完整 toml 文件(注意:数据集第二部分——480p 视频——在配置中也分为三个部分,尽管参数完全相同,这是因为原始视频已根据时长(34–49、50–100、101–160 帧)分置于不同文件夹,为保持一致性,我在 480p 版本中复用了相同的结构):

[general]
enable_bucket = true
bucket_no_upscale = true

[[datasets]]
image_directory = "H:/datasets/princess_kaguya/images/1920x1040/1"
cache_directory = "H:/datasets/princess_kaguya/images/1920x1040/1/cache_highres"
caption_extension = ".highres"
resolution = [1328, 720]
batch_size = 1
num_repeats = 1

[[datasets]] video_directory = "H:/datasets/princess_kaguya/videos/1920x1040/34-49" cache_directory = "H:/datasets/princess_kaguya/videos/1920x1040/34-49/cache_mediumres" caption_extension = ".mediumres" resolution = [880, 480] batch_size = 1 num_repeats = 1 frame_extraction = "head" target_frames = [13]

[[datasets]] video_directory = "H:/datasets/princess_kaguya/videos/1920x1040/50-100" cache_directory = "H:/datasets/princess_kaguya/videos/1920x1040/50-100/cache_mediumres" caption_extension = ".mediumres" resolution = [880, 480] batch_size = 1 num_repeats = 1 frame_extraction = "head" target_frames = [13]

[[datasets]] video_directory = "H:/datasets/princess_kaguya/videos/1920x1040/101-160" cache_directory = "H:/datasets/princess_kaguya/videos/1920x1040/101-160/cache_mediumres" caption_extension = ".mediumres" resolution = [880, 480] batch_size = 1 num_repeats = 1 frame_extraction = "head" target_frames = [13]

[[datasets]] video_directory = "H:/datasets/princess_kaguya/videos/1920x1040/34-49" cache_directory = "H:/datasets/princess_kaguya/videos/1920x1040/34-49/cache_lowres" caption_extension = ".lowres" resolution = [352, 192] batch_size = 1 num_repeats = 1 frame_extraction = "uniform" target_frames = [33] frame_sample = 2

[[datasets]] video_directory = "H:/datasets/princess_kaguya/videos/1920x1040/50-100" cache_directory = "H:/datasets/princess_kaguya/videos/1920x1040/50-100/cache_lowres" caption_extension = ".lowres" resolution = [352, 192] batch_size = 1 num_repeats = 1 frame_extraction = "uniform" target_frames = [49] frame_sample = 2

[[datasets]] video_directory = "H:/datasets/princess_kaguya/videos/1920x1040/101-160" cache_directory = "H:/datasets/princess_kaguya/videos/1920x1040/101-160/cache_lowres" caption_extension = ".lowres" resolution = [352, 192] batch_size = 1 num_repeats = 1 frame_extraction = "uniform" target_frames = [49] frame_sample = 3


(我已上传整个原始数据集。)

### **训练**

我使用 [musubi-tuner](https://github.com/kohya-ss/musubi-tuner) 进行训练(Windows 11,64GB 内存,RTX 3090)。

训练参数本身并没有特别有趣之处,主要参考了 [Studio Ghibli LoRA](https://civitai.com/models/1404755/studio-ghibli-style-wan21-t2v-14b)。

🗃️ 以下是我用于启动训练的批处理脚本示例:

accelerate launch --num_cpu_threads_per_process 1 --mixed_precision fp16 wan_train_network.py ^ --task t2v-14B ^ --vae G:/samples/musubi-tuner/wan14b/vae/wan_2.1_vae.safetensors ^ --t5 G:/samples/musubi-tuner/wan14b/tenc/models_t5_umt5-xxl-enc-bf16.pth ^ --dit E:/ComfyUI_windows_portable/ComfyUI/models/diffusion_models/wan/wan2.1_t2v_14B_fp16.safetensors ^ --blocks_to_swap 15 ^ --flash_attn ^ --mixed_precision fp16 ^ --fp8_base ^ --fp8_scaled ^ --dataset_config G:/samples/musubi-tuner/_kaguya_wan14b_dataset.toml ^ --gradient_checkpointing ^ --max_data_loader_n_workers 2 ^ --persistent_data_loader_workers ^ --learning_rate 6e-5 ^ --lr_scheduler constant_with_warmup ^ --lr_warmup_steps 100 ^ --optimizer_type adamw8bit ^ --optimizer_args weight_decay=0.01 ^ --network_module networks.lora_wan ^ --network_dim 32 ^ --network_alpha 32 ^ --timestep_sampling shift ^ --discrete_flow_shift 3.0 ^ --output_dir G:/samples/musubi-tuner/output ^ --output_name kaguya_wan14b ^ --log_config ^ --log_with all ^ --wandb_api_key MY_WANDB_API_KEY ^ --wandb_run_name kaguya ^ --logging_dir G:/samples/musubi-tuner/logs ^ --sample_prompts G:/samples/musubi-tuner/_kaguya_wan14b_sampling.txt ^ --save_state ^ --sample_every_n_steps 500 ^ --save_every_n_steps 500 ^ --max_train_epochs 50


训练进行至 42000 步,之后我尝试了多个检查点,最终选择了第 34000 步时的最佳模型。虽然我并未过多关注损失值(训练样本显示出了积极的动态趋势,证实模型有效学习而未过度拟合数据,这比损失值本身更重要),但可以提及的是,损失值从约 0.1 稳步降至 0.09,表现出一致的收敛,且无过拟合迹象。

P.S. 我还尝试在小型合成数据集上对最终的 LoRA 权重进行后微调,以缓解开头提到的问题,但该方法并未奏效,甚至使模型表现更差。

此模型生成的图像

未找到图像。