index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html
![]()
本文分享了算法工程师Diohim基于Wan2.1模型,创作皮影戏风格《西游记》LoRA模型的全过程。从主题选取、数据集构建、模型训练优化等方面,详细介绍了作者的经验与心得。通过对数据集的精心构建、训练参数的调整以及迭代优化,最终成功生成了具有皮影戏风格、人物一致性,且场景泛化性良好的视频作品。作者还分享了在训练过程中遇到的问题及解决方案,为AIGC爱好者提供了宝贵的参考。
💡 灵感来源于中国传统文化,作者选择皮影戏与《西游记》相结合,旨在传承和发扬传统文化艺术,并通过AIGC技术降低创作成本。
🎬 数据集构建方面,作者通过与皮影动画艺术家合作,获取了高质量的皮影戏动画素材。为了提高泛化性,作者对画面进行裁剪、镜头跟踪和分镜处理,并采用Gemini 2.0进行细致的打标,确保标签的准确性和多样性。
⚙️ 在模型训练方面,作者采用LoRA结构,并针对性地调整了训练参数,如提高模型理解能力、减少显存占用、增加训练稳定性、加速收敛等。通过迭代优化,最终训练出人物一致性高、场景泛化性好的皮影戏风格视频模型。
2025-06-16 18:01 浙江
冠军作品-创作皮影西游LoRA模型的全过程

冠军作品
模型diohim-皮影西游记模型(AI西游记)
链接
部分作品展示

|

大家好,我是贯一(ID:Diohim),职业是算法工程师,非常喜欢AIGC图像视频(也训练过文本、多模态模型),目前发布的AIGC模型不多,也正在持续迭代中,欢迎各位与我交流。非常感谢魔搭举办本次比赛,让我有此契机,深入了解视频模型训练、Wan-2.1,对西游故事也有新的理解。我本次是有两个参赛模型:皮影风格和黏土风格。接下来我将从主题选取、数据集构建、模型训练优化三方面,分享我个人的心得体会。这也是我首次训练视频LoRA,有许多不足之处,希望各位不吝批评指正(鞠躬)。
足够的中国传统风格:皮影+西游记(故事传统+场景传统)中华文化瑰宝非常丰富,以往大部分“数字艺术”技术仅是复制,如果能借助生成模型进行创作,更接近“传承”的本质。很多民间传统文化艺术因其社会性成本较高而难以传承,甚至逐渐消失,如果能用相对较低成本的大模型进行创作,将会是一件非常有趣、也有意义的事情。这也是我一直在关注和喜欢做的事。既然是视频模型,而不是静态图像,那么可以尝试的方式就是两类:1是将本身偏静态的画面,让它动起来,例如水墨画、剪纸、壁画;2是将原本就是动的画面,用AI再次创作,例如戏曲、木偶戏(如爍爍俊)、皮影戏。小时候经常看皮影戏,其动作、光影等画面呈现都非常中式而有趣,但现在却很少看到,那么能不能做一个皮影戏的场景、结合传统《西游记》故事呢?《西游记》-> 多人物 西游记中的人物形象鲜活,不同人物各有特色,我希望能够有多人物,这样才是“西游记”。较大的动作幅度无论是孙悟空的七十二般变化,或是天兵天将、妖魔鬼怪、佛祖神仙之间的打斗,动作都是千变万化的,那么能不能创作出一个生成动作幅度较大的模型,这也是视频模型相对图像模型的优势所在(同时也是难点)。《西游记》复杂的场景 九九八十一难里,师徒一行走过千山万水,有多样而丰富的背景和场景,因此我也尽可能追求有较复杂的场景。中文!发挥UMt5优势Wan2.1首次是首次采用UMT5作为文本编码的开源视频大模型,这意味着你可以直接输入中文,并且理解能力较好。不像采用只支持英文的clip模型,也不像t5或mT5虽然支持中文,但理解能力不好。同时,对于西游记场景,有非常多中文词汇也不太好翻译成英文(金箍棒、九齿钉耙、猪八戒、毗卢帽、九环锡杖、袈裟、白龙马、美猴王)。如果要翻译成英文,大概会有3种方式:-英文意译:Monkey King、Monk Pig(猪八戒)、White Dragon Horse因为非常意译,容易跟已有预训练模型中的理解有语义冲突,孙悟空Monkey King还好,因为出现的内容比较多,但西游记因为其他场景的训练数据不多,容易造成语义污染,模型需要先把这个词原来的意思忘掉,再学习新的语义,有点周折,这也是dreambooth要加上一个偏僻的新词的原因,起到正则化的作用,避免语义污染。这种翻译方式可能还容易有歧义,有人也称猪八戒为Pigsy、Pig,那可能模型就认不出来了,除非你增加很多数据,这又会增加训练成本。-偏僻的新词:例如zbj(猪八戒)、blm、swj(沙悟净):不太直观,不看注释,swj我都不知道是啥。-拼音:Sun Wukong、Zhu Bajie对于模型看来,可能类似2,而且既然都是拼音了,不如直接用中文。
因此,对于西游记场景,不如直接、干脆用中文。当然我也尝试对比过,发现中文确实好一点,或者说在同等方便程度下,效果好一点。当然最后有一些人物会带有拼音,这是gemini打标自带的,我也懒得改。我对LoRA的模型结构没有太多调整,就是用普通的LoRA,所以更多的是从数据集构建、训练参数方面做调整。3.1思路皮影戏我不会制作,只会看🤣(当然还有一键三连)。那么我要么通过文生视频、文生图&图生视频来创作,要么找已有的视频来学习。前者我尝试了目前各类工具和模型,效果都很差,可能是皮影戏+西游记场景在日常生活中/预训练数据中比较少见。那么我尝试寻找已有的大神做的视频。3.2获取数据集这其中,我关注已久的博主——王利民老师(ID:皮影动画王)制作的皮影戏动画之精美无与伦比,也数次斩获国际大奖。因此我联系了王利民老师,表明来意,征求其许可,毕竟我认为模型的训练数据来源,应当充分尊敬创作者本人。王老师也非常慷慨同意了,在此再次感谢王利民老师!(其实这也表明,与其直接拿来训练,与创作者本人礼貌沟通,是可以获得支持的,模型训练者也可以更放心大胆去专注模型本身)3.3数据集画面制作多分辨率:由于原视频画面是固定横向比例的,有广阔的背景,为了模型学习到更丰富的细节,要么把训练时的分辨率开得很大(成本太高,而且有背底模的训练分辨率),那么把训练数据放大,让画面有更多细节占据,我选择了后者,所以首先是对画面进行裁剪,让人物主体比较占据画面。有时候还需要对画面人物的移动做镜头跟踪,相当于人物本身没有太多位移(但背景在变)。而对于本身整体画面比较广阔的场景,我希望模型能学习到精美的场景,就会给于较宽的比例,这时候人物的描述不会非常清楚,重点描述场景。多样化:为提高泛化性,同一人物不同背景、穿着,不同动作尽可能凑两三个。分镜:最开始我视频长度不限,后面发现太长的视频会极大增加训练资源的消耗,同时得到的效果很差,因此我按照分镜的思路,把动作进行拆分,例如孙悟空先从右上方翻跟斗跳入画面,先跳到左边打败了妖怪,然后跳到右边打败了妖怪,再从后脑勺揪出汗毛变出小猴子,这就拆成了3个视频,这也符合分镜的思想。我的个人想法是:本身这个分镜动作是客观的,只不过连起来人类会赋予更多主观的情节和意义,但这不是现有模型或1.3B参数量下的LoRA能直接理解的。|
3.4打标我写了脚本,把不同视频都做了抽帧。然后用gemini 2.0进行打标。首先不同视频各抽一帧,让gemini总结他们的共同点,之后会把这些词都加在各个数据集上(无外乎就是“皮影风格”、“剪影”、“平面”、“镂空雕刻工艺”这几个词),后面也并不是全部都是一样的词,而是会适当替换掉同义词,以免模型跟这个词绑定,而是能更多理解到其语义。
然后针对每一个数据集,分别抽帧,告诉gemini这是个视频的几个画面,从视频连贯的角度描述视频整体的内容。
最后手工矫正一下,尤其是一些特有的名词,以及一些画面的“文学含义”,太文学模型难以理解(我都难以理解🤣)。
在打标的过程中,由于画面细节较多,所以我尽可能细致地打标(标签解耦),否则模型容易学不到东西还过拟合,同时也能提高泛化性。(尝试过粗标签,很难拟合)打标时,我也想到几种方式,因为这不是静态画面,既有变化的画面,还有人物的动作。那么应该怎么描述?容易想到:先画面,再动作先动作,再画面先总后分(总的时候动作和画面一起,分的时候动作和画面也一起)先重点后非重点我分别做了尝试,对于1、2来说,如果画面比较丰富、或动作比较丰富,在靠后的文字描述里就学不太清楚了,不知道是不是我方法的问题;对于3来说,训练时倒没什么太大问题,但在推理时,用这个方式就会出现重复的内容,一个人会变成两个,场景也会重叠,这是一个普遍的现象,或许是模型就是线性地理解,先总后分,本质上内容就是出现了两次。最后经过对比,4的效果比较好,训练和推理的prompt也比较一致。其他:水印的处理:训练时加上水印prompt,推理时去掉,就去掉了水印,这得益于模型的理解能力。武器的处理:在答辩时,经老师提醒,因为西游记武器、法器的特殊性,最好是能单独拎出来学习,我这个版本没有单独拎出来,所以孙悟空手握金箍棒时总是在舞棍,因为缺少手握不动的数据,也没有单独把金箍棒拎出来,每次有“金箍棒”这个词时,模型都能看到手里舞棍的孙悟空,所以可能误以为这就是该词的意思。这也是我这个版本的不足之处。
最终数据集数量:1:1 (1条)、2:1(1条)、3:4(28条)、4:3(13条)、16:9(13条),不同分辨率分别归到不同文件夹里。为直观起见,展示数据集例子:(可以看到标签非常详细,我也没有太多人工修改)皮影风格,平面,半身,剪影,镂空雕刻工艺,侧面,关节连接感。
画面主体是唐僧骑着马正在行走,面朝左边,唐僧头戴一顶精致的僧帽("毗卢帽"),毗卢帽顶部竖立着一个细长的、尖顶的金色装饰物。帽檐为红色并有金边,翘起呈现船状,有云龙、如意等佛教元素雕刻纹理,毗卢帽两侧附有飘带,飘带上也有精致的雕刻纹理。
唐僧身披一件华丽的红色锦襕袈裟,袈裟的表面织满了金色的网格状纹路(也称"田相纹",是佛教僧服特有的标志性图案),在月光下显得熠熠生辉。袈裟的边缘镶有深色的滚边,更显庄重。袈裟宽大而自然地垂落,覆盖着他的身体,只露出内里一袭淡黄色的僧衣领口,细节之处可见其衣着的层次感。
唐僧手握"九环锡杖",锡杖顶部有多个金环,杖身为红色。
唐僧端坐在马背上,身姿挺拔而稳健,双手置于身前,虽然握缰的细节被遮挡,但能感受到他正轻轻驭马前行。他的姿态透露出一种历经风霜的沉稳和前往西天的坚定信念。
白马位于画面的左下方,与唐僧相伴而行。白马呈现出神骏的姿态,身体线条流畅而富有力量感。浅棕色的毛色上,精心雕刻着白色的纹路,这些纹路勾勒出马匹健硕的肌肉和飘逸的鬃毛,极具艺术性。
马头朝向前方,圆睁的眼睛充满了灵性,张开的嘴巴似乎在无声地嘶鸣,仿佛也感受到了月夜的静谧与庄严。
白马佩戴着华丽的马鞍和辔头。马鞍上装饰着精致的图案和金色的垂坠,显得富丽堂皇。红色的缰绳连接着马头和唐僧的手,象征着他们之间的羁绊。马的头部和耳朵处还装饰着花朵状饰物,耳朵处的装饰物附有流苏,更添一份祥瑞之气。
画面的背景被一轮硕大而明亮的满月所占据,月亮散发出柔和而皎洁的光芒,将整个画面笼罩在一片宁静而神圣的氛围之中。月亮的表面呈现出淡淡的纹理,更显真实感。
月亮的周围是深邃的蓝色夜空,色彩由深至浅地渐变,营造出夜晚的深邃感和层次感。
整个画面弥漫着一种庄重、宁静而又充满神圣感的氛围。皎洁的月光洒在唐僧和白马身上,更显其圣洁与不凡。唐僧端坐在白马上,神情肃穆,展现出他不畏艰险、一心求取真经的坚定意志。白马的造型神骏,也象征着旅途的艰辛与陪伴。皮影戏独特的艺术表现手法,通过精细的镂空、流畅的线条和庄重的色彩,将唐僧师徒西行路上的场景刻画得令人印象深刻。
训练参数1. 提高模型理解能力:多分辨率,并按照数据集质量进行不同repeat[[directory]]
path = '/root/d5/34'
num_repeats = 20
ar_buckets = [[576, 768]]
resolutions = [[576, 768]]
[[directory]]
path = '/root/d5/43'
num_repeats = 20
ar_buckets = [[768, 576]]
resolutions = [[768, 576]]
[[directory]]
path = '/root/d5/169'
num_repeats = 16
ar_buckets = [[1024, 576]]
resolutions = [[1024, 576]]
[[directory]]
path = '/root/d5/11'
num_repeats = 16
ar_buckets = [[768, 768]]
resolutions = [[768, 768]]
[[directory]]
path = '/root/d5/21'
num_repeats = 20
ar_buckets = [[1024, 512]]
resolutions = [[1024, 512]]
2. 减少显存:分块交换blocks_to_swap
= 28
,也就是和内存之间进行交换,这取决于模型是否支持,而Wan2.1是支持的。3. 减少显存:内存增量分配:PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True
4. 增加训练稳定性:帧分桶、平均抽帧frame_buckets = [1, 25, 33, 65, 97, 113, 153, 169, 193, 225, 257, 265]
因为对于皮影戏来说,关节连接的动作有快有慢,并不是那么高的帧率,而且我的数据集的帧率基本一致。如果采用向前或向后截断,由于我的数据集是手工裁剪,本身没有冗余的前后画面,反而会因为截断导致画面和prompt对不上,因此在diffusion-pipe脚本上增加了average平均抽帧方法。5. 加速收敛:采用Prodigy优化器(lr = 1 betas = [0.9, 0.99] weight_decay = 0.0),而不是AdamW或AdamW8bit。6. 其他:rank = 64、warmup_steps = 16、gradient_accumulation_steps = 4 、 micro_batch_size_per_gpu = 17. Loss与资源消耗训练集的Loss和校验集的Loss的变化趋势是相同的,表明没有直接性的过拟合。最后在它快翘起来的时候我立马给它停了!虽然校验集的Loss也翘起来了,这表明模型可能还在学习,不过我目测差不多了,大概是4090*2训练了11h,总共10个epoch,这比我预想的资源消耗要低很多,毕竟这可是视频大模型,这也得益于Wan2.1的3D因果VAE,不需要完全独立编解码每一帧,会捕捉到其不同帧之间随时间的变化关系。内存占用:20k | 显存占用:初始占用19.5k,第50个epoch时开始占用22k |
8. 迭代优化相对于固定的参数,以上的经验大多也是我迭代、优化模型的结果。这里简要讲一下我的优化思路:-对于优化器、学习率这些模型的超参数:调了又调,改了又改,最后发现不如直接Prodigy-对于blocks_to_swap
、batch_size:能开多大开多大(其实也就是1)-对于prompt:这是我优化得比较多的,因为我是第一次炼视频模型LoRA没啥经验,所以我刚开始训练时,每一个epoch我都保存下来,后面固定参数进行横向、纵向测试:即对于同一个提示词,分别打印其在不同的epoch里的输出,发现一些有意思的现象:尽管有些标签没打上,而模型也可以学习到,但它学习的过程比较曲折:例如最开始没有加上“侧脸”,因为gemini在总结共同特征时也没提起这个,我自己也给默认了,而在纵向打印时,发现将近前6个epoch都是正脸,而且正脸的拟合越来越崩溃,到第7个epoch才拟合到侧脸,但已经过拟合崩溃了(出现花碎片)。所以我给数据集都加上“侧脸”标签,第2个epoch就能直接拟合到侧脸了,尽管推理时不加“侧脸”标签,输出也是侧脸(毕竟训练集全是)。类似的还有“猴脸”,没加的话会孙悟空会一直拟合真人或卡通的人脸及脸谱,而直接加上之后,孙悟空立刻就学习到了猴脸的特征。以上我称其为“纵向”测试。
|
而对于“横向”测试,也就是在同一个epoch内抽样打印不同的数据,这样可以发现一些缺少或冗余的标签。例如刚开始标签打得比较细,原画面(左)我写了背景左侧偏黄色,右侧偏黄绿色,而测试时画面直接对半分开了(右)。并且没有描述唐僧的体态,所以肚子也变成了八戒的肚子😂😂,也没有描述网格状的袈裟,这表明是标签有问题了,于是返工补一补。
注:因为我是边训练边测试,用的另一台本地的机子做的测试。通过官方的DiffSynth-Studio,写脚本批量测试,这样才能在不占用服务器资源、同时提高效率下测试训练的结果,以防有问题也可以随时中止训练进行优化。
总而言之,以上是我的尝试过程,希望对于像我一样的新手,可以从我的“翻车”经验中少走一些“弯路”。最后展示一下成果,分为两方面,1是训练集的场景,一般还可以(毕竟经过了横纵向的prompt优化);2是大改场景,打印训练集里未曾出现过的画面,来测试其人物一致性、不同场景的泛化性。1. 训练集复杂场景中国皮影戏风格,平面,剪影,侧脸,全身,关节连接感。
画面左边是孙悟空("行者孙"服饰),他有着猴子的面孔,头戴金箍,身穿黄色带花朵花纹的服装,脚穿靴子。
孙悟空双臂后摆,其中一只手拿着金箍棒,右腿前屈,左腿后蹬,重心降低,身体微向前探,做出充满动感的对峙姿势,孙悟空面向右边,头往后仰,然后身体前倾,从嘴里猛地喷出一长串火焰。这股火焰迅速地横跨画面,直冲向右侧地面上躺卧着的白骨精。白骨精穿着华丽的服饰,头戴繁复的头饰,有两根竖起的金色雉鸡翎。
在火焰接触到白骨精时,白骨精的身体开始着火。
画面的背景古旧的、带有纹理的纸张,有朦胧、风格化的山峦剪影,层叠起伏,营造出一种深远或险峻的氛围。
天空上方边缘有一些云纹图案。
人物脚下的地面是深色的、不平坦的岩石或焦土区域。
2. 泛化性测试这些是原始数据集所没有的场景,人物是一致的,而背景、动作不同。可以看到在动作较为复杂的大闹天宫里,效果还不是很好,但基本的场景下的动作相对还比较连贯。出乎意料的是,在雪山、森林、沼泽地、沙漠里的比较广阔的场景里表现还不错。雪山的雪的纹理、地面人物影子,以及背后雪山的线条;森林的绿色透光的荧幕效果、大树的纹理;沼泽地人物在水面踩踏的涟漪,这些雪山、森林、沼泽在训练集中都是没有的,表明了Wan2.1强大的模型能力。而且这些几乎都是一次生成的结果,并没有太多抽卡,表明模型的稳定性还可以。以上可以从ModelScope的页面直接看到:欢迎各位进行尝试,也可以在评论区将遇到的问题反馈给我。https://modelscope.cn/models/diohim/Puppet_Show_of_Journey_to_the_West,点击阅读原文,即可跳转品牌馆查看更多~
👇点击关注ModelScope公众号获取
更多技术信息~


















阅读原文
跳转微信打开