最近通过学习B站上的视频转绘教学,成功用ComfyUI实现了跳舞视频真人转动漫的任务。先看效果:
原视频
合成视频
正向提示词
(masterpiece, top quality, best quality, official art, beautiful and aesthetic:1.2) [此处为对预期视频的文本描述]
反向提示词
ugly, buildings, deformed, bad lighting, blurry, text, clouds, watermark, extra hands, bad quality, deformed hands, deformed fingers, nostalgic, drawing, painting, bad anatomy, worst quality, blurry, blurred, normal quality, bad focus, tripod, three legs, weird legs, short legs, bag, handbag, 3 hands, 4 hands, three hands,fuzzy hands,cope
(embedding:BadDream:1) boy, man, male,
(embedding:ng_deepnegative_v1_75t:1),
(embedding:epiCNegative:1),
(embedding:bad-picture-chill-75v:1),
(embedding:AS-YoungV2-neg:1),
(embedding:ERA09NEGV2:1)
看了大量视频转绘的视频后,发现视频转绘按任务的话可以分为以下几个类别,但功能实现方式都差不多
- 只替换人物,保持背景不变
- 只替换背景,保持人物不变
- 人物与背景均替换
为了方便以后学习,也方便对AIGC感兴趣的朋友们学习,在此记录一下学习历程。
首先当然是先上工作流。
第一步:视频前期预处理
所用模型列表:yolox_I.onnx,depth_anything_vitl14.pth,u2net。
功能介绍:所用的素材视频帧数(335帧)比较多。首先拆分图像,选定前25帧(图中的拆分索引设置为25,但是这里可以直接选定335帧,一次性处理所有帧,这里不会爆显存)。随后拆分后的前25帧通过4个预处理器:DW姿态预处理(用于提取每一帧图像的姿势),HED模糊线预处理器(用于获取每一帧图像的线稿),DA深度预处理器(用于获取每一帧图像的深度图),移除背景(用于获取遮罩,前景人物是白色,背景是黑色)。上述与处理后的图像会保存在output文件夹中,可以分别放置于deep,softedge,depth,mask四个文件夹中方便后续通过文件夹路径读取。
注意事项:“设置节点“一般与“获取节点”配对使用,它们构建了远程传递参数的桥梁,无需走线。所以上述选取保存到文件夹的方式,或者选取用“设置节点“与“获取节点”的方式都可以,任选其一都可以实现给后续传递预处理后的图像。
第二步:Controlnet处理器
所用模型列表:control_v11p_sd15_openpose_fp16.safetensors,control_v11p_sd15_softedge.pth,control_v11f1p_sd15_depth.pth,cntrol_v11p_sd15_lineart.pth。
功能介绍:利用Controlnet模型处理图像的条件输入,或者可以理解为最终输出视频与这部分输入的数据在某些程度上应该是相似的(类似于一致性)。这部分核心是4个ControlNet应用(高级)节点,从左到右4个ControlNet应用(高级)节点分别对应人物姿态控制,人物边缘线条的控制,人物深度控制以及背景控制。由于显存限制,无法一次性处理335帧的图像,因此在这里按17帧为一个批次进行分批处理,这一过程由帧数读取上限节点(本质是一个整数节点),跳过前K帧节点(本质是一个整数节点)以及Primitive元节点实现。对于最后一个高级ControlNet应用,这里不仅输入了原始帧的mask,还对其进行了遮罩反转(为了使前景人物为黑色,背景为白色,这样就在背景上对图像进行处理);其次还输入了预期背景风格的图像,该图像通过Linearart艺术线预处理器进行处理得到线稿,以方便后续通利用prompt对背景进行重绘,才能使背景与前景人物融到一起。每个ControlNet上的强度,开始时间以及结束时间参数表示该部分对于最终出图效果的影响程度。
第三步:模型加载
所用模型列表:dreamshaper_8.safetensors,vae-ft-mse-840000-ema-pruned.saftensors,lcm-lora-sdv1.5.safetensors。
功能介绍:这一部分是加载大模型的地方,从左到右,配置参数,加载模型,比较简单理解。右侧使用了lcm的模型以及lcm采样方法(可以在低步数的情况下获取较好的生成效果,可以降低一些显存消耗)。下方的提示词调度在这项任务里没有用到(可以为某一帧图像单独添加提示词进行控制),就不展开阐述了。
第四步:IPAdapter
所用模型列表:ip-adapter-plus_sd15.safetensors,CLIP-ViT-H-14-laion2B-s32B-b79K.safetensors。
功能介绍:这一部分相当于一个图像适配器。输入两张图像,一张人物图一张背景图,控制最后输出视频中的人物与背景同这里输入的人物与背景一致,其中控制强度由每一个应用IPAdapter节点中的权重控制。
注意事项:IPAdapter加载器在这里选取了STANDARD(medium strength),则对应在/models/ipadapter下保存模型ip-adapter-plus_sd15.safetensors。此外,每个应用IPAdapter节点并没有连clip视觉的输入,但是在实际使用中,应用IPAdapter节点还是会自动去/models/clip_vision中找模型,如果没有模型的话会报错,所以保证/models/clip_vision有一个官方模型,这里用的以下模型:
CLIP-ViT-H-14-laion2B-s32B-b79K.safetensors(注意官方的名字一定要写对,踩过的坑)。
第五步:AnimateDiff
所用模型列表:motionModel_v01.ckpt/mm_sd_v15_v2.ckpt。
功能介绍:AnimateDiff是最近提出的很火的动画生成模型。参数比较多(暂时还没搞懂所有参数)。FreeU_V2模型重加权中可调节B1参数对视频进行控制。
注意事项:实测如果加上这一步,在同一批次中的生成所有帧的背景只会小幅度变化(基本上可以说是同一批次内背景固定不变)。如果不加这一步,在同一批次中的生成所有帧的背景会疯狂变化(视觉效果上就是背景一直在闪烁,看着让人头晕)
第六步:采样输出
所用模型列表:/。
功能介绍:最后的生成解码阶段,这里使用了两个K采样器,左边的K采样器负责根据上述所有条件去生成仅保持人物动作不变而改变人物与背景的多张图像,然而这里输出的图像分辨率以及细节质量比较差。这就需要第二个K采样器,对上述输出的每一张图像进行1.5倍上采样,丰富纹理细节。最后通过RIFE VFI节点进行视频插帧并通过合并视频节点将多帧图像合并为1秒24帧的mp4进行输出。
其他思考:由于显存限制,处理一个335帧的视频,只能以20帧为一个批次进行转绘。但是发现每个批次与每个批次重绘的背景图有差异,导致两个批次生成的视频拼接到一起会有突然跳转(不平滑)的现象。①这个应该可以通过视频插帧的操作使得两个批次视频之间连接更流畅。②可以先生成第一个批次的视频,然后以第一批次的视频为输入,去控制后续批次视频的背景与第一批次生成的视频一致。这只是两个初步想法,以后有机会可以尝试一下。
最后,感谢https://www.bilibili.com/video/BV1zw4m127sg/?spm_id_from=333.999.0.0大佬的教学。
666