Rerender A Video - 官方 PyTorch 实现
Rerender A Video: 零样本文本引导的视频到视频转换
杨帅, 周一凡, 刘子为 和 罗乔恩
发表于 SIGGRAPH Asia 2023 会议论文集
项目主页 | 论文 | 补充视频 | 输入数据和视频结果
摘要: 大型文本到图像扩散模型在生成高质量图像方面展现出令人印象深刻的能力。然而,将这些模型应用到视频领域时,确保视频帧之间的时间一致性仍然是一个巨大的挑战。本文提出了一种新颖的零样本文本引导的视频到视频转换框架,以将图像模型适配到视频。该框架包括两个部分:关键帧转换和全视频转换。第一部分使用改进的扩散模型生成关键帧,同时应用分层的跨帧约束来强制形状、纹理和颜色的一致性。第二部分通过时间感知的补丁匹配和帧混合将关键帧传播到其他帧。我们的框架以较低的成本(无需重新训练或优化)实现了全局风格和局部纹理的时间一致性。该适配方法与现有的图像扩散技术兼容,使我们的框架能够利用它们的优势,例如使用LoRA定制特定对象,以及使用ControlNet引入额外的空间引导。大量的实验结果证明了我们提出的框架在渲染高质量和时间连贯的视频方面优于现有方法。
特点:
- 时间一致性: 跨帧约束实现低级时间一致性。
- 零样本: 无需训练或微调。
- 灵活性: 与现成模型(如ControlNet, LoRA)兼容,实现定制转换。
更新
- [2023年12月] Diffusers流水线现已可用: Rerender_A_Video社区流水线
- [2023年10月] 新功能: 松散跨帧注意力和FreeU。
- [2023年9月] 代码已发布。
- [2023年9月] 被SIGGRAPH Asia 2023会议论文集录用!
- [2023年6月] 集成到🤗 Hugging Face。欢迎体验网页演示!
- [2023年5月] 本网站创建。
待办事项
-
集成到Diffusers。 -
将FreeU集成到Rerender -
在README.md中添加推理说明。 -
在WebUI中添加示例。 -
在流水线中添加可选的泊松融合。 -
为Windows添加安装说明
安装
请确保您的安装路径只包含英文字母或下划线
- 克隆仓库。(别忘了--recursive。否则,请运行
git submodule update --init --recursive
)
git clone git@github.com:williamyang1991/Rerender_A_Video.git --recursive
cd Rerender_A_Video
- 如果您已安装PyTorch CUDA,可以直接用pip设置环境。
pip install -r requirements.txt
您也可以从头创建新的conda环境。
conda env create -f environment.yml
conda activate rerender
需要24GB显存。请参考https://github.com/williamyang1991/Rerender_A_Video/pull/23#issue-1900789461 以减少内存消耗。
- 运行安装脚本。所需模型将下载到
./models
。
python install.py
- 您可以用
rerender.py
运行演示
python rerender.py --cfg config/real2sculpture.json
(1) 推理
WebUI (推荐)
python webUI.py
Gradio应用程序还允许您灵活更改推理选项。尝试一下以了解更多详情。(对于WebUI,您需要在安装后下载revAnimated_v11和realisticVisionV20_v20到./models/
)
上传您的视频,输入提示词,选择种子,然后点击:
- 运行第一关键帧: 只转换第一帧,这样您可以在运行整个视频之前调整提示词/模型/参数以找到理想的输出外观。
- 运行关键帧: 根据第一帧的设置转换所有关键帧,这样您可以在运行整个视频之前调整与时间相关的参数以获得更好的时间一致性。
- 运行传播: 将关键帧传播到其他帧以实现完整视频转换
- 全部运行: 运行第一关键帧、运行关键帧和运行传播
我们提供了丰富的高级选项供您使用
使用自定义模型
- 使用LoRA/Dreambooth/微调/混合SD模型 - 修改`sd_model_cfg.py`以添加保存的SD模型路径 - 如何使用LoRA: https://github.com/williamyang1991/Rerender_A_Video/issues/39#issuecomment-1730678296 - 使用ControlNet的其他控制(如深度、姿势) - 在此处添加更多选项,如`control_type = gr.Dropdown(['HED', 'canny', 'depth']` https://github.com/williamyang1991/Rerender_A_Video/blob/b6cafb5d80a79a3ef831c689ffad92ec095f2794/webUI.py#L690 - 按照以下方式添加模型加载选项`elif control_type == 'depth':` https://github.com/williamyang1991/Rerender_A_Video/blob/b6cafb5d80a79a3ef831c689ffad92ec095f2794/webUI.py#L88 - 按照以下方式添加模型检测器`elif control_type == 'depth':` https://github.com/williamyang1991/Rerender_A_Video/blob/b6cafb5d80a79a3ef831c689ffad92ec095f2794/webUI.py#L122 - 这里给出了一个示例[链接](https://huggingface.co/spaces/Anonymous-sub/Rerender/discussions/10/files)第一帧翻译的高级选项
- 分辨率相关(帧分辨率,左/上/右/下裁剪长度):裁剪帧并将其短边调整为512。
- ControlNet相关:
- ControlNet强度:输出与输入控制边缘的匹配程度
- 控制类型:HED边缘或Canny边缘
- Canny低/高阈值:低值可获得更多边缘细节
- SDEdit相关:
- 去噪强度:重绘程度(低值使输出更接近原始视频)
- 保留颜色:保留原始视频的颜色
- SD相关:
- 步数:去噪步骤
- CFG比例:输出与提示的匹配程度
- 基础模型:基础Stable Diffusion模型(SD 1.5)
- Stable Diffusion 1.5:官方模型
- revAnimated_v11:半写实(2.5D)模型
- realisticVisionV20_v20:照片级真实模型
- 附加提示/负面提示:补充提示
- FreeU相关:
- FreeU第一/第二阶段骨干因子:=1无效果;>1增强输出颜色和细节
- FreeU第一/第二阶段跳跃因子:=1无效果;<1增强输出颜色和细节
关键帧翻译的高级选项
- 关键帧相关
- 关键帧频率(K):每K帧均匀采样关键帧。大幅或快速运动时使用小值。
- 关键帧数量(M):最终输出视频将有K*M+1帧,包含M+1个关键帧。
- 时间一致性相关
- 跨帧注意力:
- 跨帧注意力开始/结束:应用跨帧注意力以保持全局风格一致性的时间
- 跨帧注意力更新频率(N):每N个关键帧更新一次参考风格帧。长视频应使用大值以避免错误累积。
- 宽松跨帧注意力:在更少层使用跨帧注意力,以更好地匹配输入视频(适用于大幅运动的视频)
- 形状感知融合 勾选使用此功能
- 形状感知融合开始/结束:应用形状感知融合以保持局部形状一致性的时间
- 像素感知融合 勾选使用此功能
- 像素感知融合开始/结束:应用像素感知融合以保持像素级时间一致性的时间
- 像素感知融合强度:保留非修复区域的强度。小值避免错误累积。大值避免模糊纹理。
- 像素感知融合细节级别:锐化修复区域的强度。小值避免错误累积。大值避免模糊纹理。
- 平滑融合边界:勾选以平滑修复边界(避免错误累积)。
- 颜色感知AdaIN 勾选使用此功能
- 颜色感知AdaIN开始/结束:应用AdaIN使视频颜色与第一帧一致的时间
- 跨帧注意力:
完整视频翻译的高级选项
- 梯度混合:应用泊松混合以减少重影伪影。可能会减慢处理速度并增加闪烁。
- 并行进程数:多进程加速处理。建议使用大值(8)。
命令行
我们还提供了一个灵活的脚本rerender.py
来运行我们的方法。
简单模式
通过命令行设置选项。例如,
python rerender.py --input videos/pexels-antoni-shkraba-8048492-540x960-25fps.mp4 --output result/man/man.mp4 --prompt "梵高画作中的一个英俊男人"
该脚本将运行完整流程。将在result/man
创建一个工作目录,结果视频将保存为result/man/man.mp4
高级模式
通过配置文件设置选项。例如,
python rerender.py --cfg config/van_gogh_man.json
该脚本将运行完整流程。
我们在config
目录中提供了一些配置示例。
配置中的大多数选项与WebUI中的相同。
请查看WebUI部分的解释。
通过在配置中设置sd_model
来指定自定义模型。例如:
{
"sd_model": "models/realisticVisionV20_v20.safetensors",
}
自定义流程
与WebUI类似,我们提供三步工作流程:重新渲染第一个关键帧,然后重新渲染所有关键帧,最后通过传播重新渲染完整视频。要仅运行单个步骤,请指定选项-one
、-nb
和-nr
:
- 重新渲染第一个关键帧
python rerender.py --cfg config/van_gogh_man.json -one -nb
- 重新渲染所有关键帧
python rerender.py --cfg config/van_gogh_man.json -nb
- 通过传播重新渲染完整视频
python rerender.py --cfg config/van_gogh_man.json -nr
我们的Ebsynth实现
我们提供了一个单独的Ebsynth Python脚本video_blend.py
,使用Stylizing Video by Example中介绍的时间混合算法来插值关键帧之间的风格。
它可以独立于我们的Rerender算法,处理您自己的风格化关键帧。
用法:
video_blend.py [-h] [--output OUTPUT] [--fps FPS] [--beg BEG] [--end END] [--itv ITV] [--key KEY]
[--n_proc N_PROC] [-ps] [-ne] [-tmp]
name
位置参数:
name 输入视频路径
可选参数:
-h, --help 显示此帮助消息并退出
--output OUTPUT 输出视频路径
--fps FPS 输出视频的FPS
--beg BEG 要风格化的第一帧索引
--end END 要风格化的最后一帧索引
--itv ITV 关键帧间隔
--key KEY 风格化关键帧的子文件夹名称
--n_proc N_PROC 最大进程数
-ps 使用泊松梯度混合
-ne 不运行ebsynth(使用之前的ebsynth输出)
-tmp 保留临时输出
例如,要在视频man.mp4
上运行Ebsynth,
- 将风格化的关键帧每10帧放入
videos/man/keys
(命名为0001.png
、0011.png
等) - 将原始视频帧放入
videos/man/video
(命名为0001.png
、0002.png
等)。 - 使用泊松梯度混合在视频的前101帧上运行Ebsynth,并以25 FPS将结果保存为
videos/man/blend.mp4
,使用以下命令:
python video_blend.py videos/man \
--beg 1 \
--end 101 \
--itv 10 \
--key keys \
--output videos/man/blend.mp4 \
--fps 25.0 \
-ps
(2) 结果
关键帧翻译
白色古希腊雕塑,米洛的维纳斯,浅粉色和蓝色背景 | 一个英俊的希腊男人 | 中国水墨画中的传统山水 | 一只卡通老虎 |
水墨画风格的天鹅,单色调 | CG风格的美女 | 简洁干净的白玉雕塑 | 深邃黑蓝色海洋中的荧光水母 |
全视频转换
文本引导的虚拟角色生成。
视频风格化和视频编辑。
新特性
与会议版本相比,我们持续增加新功能。
松散跨帧注意力
通过在较少的层中使用跨帧注意力,我们的结果将更好地匹配输入视频,从而减少由不一致造成的重影伪影。可以通过在WebUI的关键帧转换高级选项中勾选"松散跨帧注意力"或在脚本中设置loose_cfattn
来激活此功能(参见config/real2sculpture_loose_cfattn.json
)。
FreeU
FreeU是一种无成本提高扩散模型样本质量的方法。我们发现使用FreeU后,我们的结果将具有更高的对比度和饱和度,更丰富的细节,以及更生动的色彩。可以通过在WebUI的第一帧转换高级选项中设置FreeU骨干因子和跳跃因子,或在脚本中设置freeu_args
来使用此功能(参见config/real2sculpture_freeu.json
)。
引用
如果您发现这项工作对您的研究有用,请考虑引用我们的论文:
@inproceedings{yang2023rerender,
title = {Rerender A Video: Zero-Shot Text-Guided Video-to-Video Translation},
author = {Yang, Shuai and Zhou, Yifan and Liu, Ziwei and and Loy, Chen Change},
booktitle = {ACM SIGGRAPH Asia Conference Proceedings},
year = {2023},
}
致谢
代码主要基于ControlNet、Stable Diffusion、GMFlow和Ebsynth开发。