StableDiffusion深度思考(连续性)
在面试创业团队的时候被问到在StableDiffusion中如何解决离散图片/视频生成视频连续性的问题,在该应用场景上我目前完整复现了开源效果,被大佬质疑如何比开源效果还好,我认为有监督才是解决的唯一方法,临时想了一些方案被否定了,这里事后整理一些设想。
SD深度原理
首先SD是在Diffusion上的进步,把图片通过Perceptual Compress方式压缩到latent层面然后做前向加噪和反向去噪过程,并且对text prompt基于CLIP生成的embedding引入了UNet中的multi head attention结构中。
一些重点:
- Image映射到latent的过程是通过VAE encoder/decoder来实现的;
- CLIP模型的训练过程是在0.4B数据上同时对image和text编码,缩小二者embedding余弦差距;
- Attention引入text embedding的过程是在QKV的KV中加入经过domain encoder编码的信息(text segmention等等),Q中仍然是是基于time step的latent,就形成了所谓的Condition UNet;
- 训练过程中通过time step控制noise强度,来让模型分别在不同的time step学习高频/低频信息;
- 反向去噪的采样过程中,Karras提出噪音计划表,在采样后期降低噪声影响;DPM++是DPM的二阶方法,求解SDE(随机微分方程)问题;
开源解法
开源的image/video风格化基于mov2mov的思路,每一帧通过固定参数SD生成风格化图像然后合成在一起。
一些trick包括:
分割前景,获得更可控方案
叠加controlnet,hed +openpose等,提高稳定性
使用第一帧的seed来生成所有图像
multi frame render ,使用inpainting方法,左边放前帧,右边放第一帧,中间扣mask生成,有颜色退化问题,更稳定
Lora单独控制面部,获得更精细和可控的面部生成细节
为什么multi frame render可以取得好的效果,因为前后帧对中间帧的生成起到了reference image的作用,这在talking head的连续性解决上非常常用。
23.5.16补充: runway的 gen2论文还没出来,只有gen1的论文
gen1通过对视频进行扩散,同时引入视频的深度图作为监督,用CLIP获取单帧描述信息进行嵌入,目的是在推理时向DDIM过程注入视频的深度信息+CLIP信息,从而进行有监督的视频风格转换。
有监督方案
为了可控生成,最有名的开源有监督方案就是controlnet,类似于lora,controlnet引入了额外的网络信息,使用zero 1x1 conv初始化,然后输入不同的监督信息,控制生成的方向。
我个人比较常用的openpose控制姿态,HED/Depth控制细节。
理论上为了解决离散图像/视频到视频的连续性问题,可以通过引入具有离散时序信息的controlnet来解决,可以是光流/motion动量,通过获取前后离散帧的该信息,通过平均的方式获取中间补帧的信息,从而有条件控制生成。
当然如果是某一动漫人物,可以通过lora来控制生成该人物角色的信息。
无监督方案(称是这种)
首先关注picsart的Text2Video-Zero, 在初始GaussianNoise上做工作,引入MotionDynamic信息,全局运动向量(类似于上文的光流),引入到每一帧的latent编码中,然后提出帧间注意力机制,在QKV的KV中引入所有帧的KV;最后结合controlnet。
这是我认为最接近无监督方案的一种方案(实际上也引入了前后帧的运动向量,本身也是一种监督),而该开源方案刚出来就做了测试,效果很差不可接受。
明确一点,diffusion模型就是随机模型,即使给定相同的Gaussian Noise,采样过程也是不稳定的,在时间序列(或者说前后帧)上是不相关的。
所以大佬提到具体的无监督(我理解无注入信息)的连续性SD生成问题,我不知道怎么解决,可能是一些控制高斯噪声或者lora的方法吧。
突发奇想:
diffusion的前n steps使用前一帧 (sd webui中有实现的条件,目前还没人做)
训练一个一致性lora
训练一个关键帧风格lora
用单张src和生成图片训练一个过拟合controlnet,数据增强(平移 放缩 mask), (已经被controlnet实现了,reference模式)