刘畅、李锐、张凯东、兰云伟、刘东
[ Paper
] / [ Project
] / [ Models (Huggingface)
] / [ DAVIS-Edit (HuggingFace)
] / [ Models (wisemodel)
] / [ DAVIS-Edit (wisemodel)
] / [ Models (ModelScope)
] / [ DAVIS-Edit (ModelScope)
]
StableV2V
概述StableV2V
的推断(命令行)StableV2V
进行基于草图的编辑StableV2V
进行视频修复StableV2V
的推理(Gradio Demo)DAVIS-Edit
如果您对这项工作有任何疑问,请随时开始新问题或提出 PR。
StableV2V
概述StableV2V
提出了一种以形状一致的方式执行视频编辑的新颖范例,特别是在用户提示导致编辑内容发生重大形状变化时处理编辑场景。此外,考虑到不同模式的各种用户提示, StableV2V
在处理各种下游应用程序时表现出卓越的灵活性。
<返回目录>
DAVIS-Edit
上传到 ModelScope。StableV2V
的交互式使用,本节提供了详细的插图。DAVIS-Edit
上传到wisemodel.cn。DAVIS-Edit
更新到我们的 HuggingFace 数据集存储库,并将StableV2V
所需的所有模型权重上传到我们的 HuggingFace 模型存储库。StableV2V
的代码库DAVIS-Edit
上传到我们的 HuggingFace 存储库StableV2V
所需的所有模型权重上传到我们的 HuggingFace 存储库<返回目录>
StableV2V
├── LICENSE
├── README.md
├── assets
├── datasets <----- Code of datasets for training of the depth refinement network
├── models <----- Code of model definitions in different components
├── runners <----- Code of engines to run different components
├── inference.py <----- Script to inference StableV2V
├── train_completion_net.py <----- Script to train the shape-guided depth completion network
└── utils <----- Code of toolkit functions
<返回目录>
我们提供一键式命令行来安装代码所需的所有依赖项。首先,使用conda
创建虚拟环境:
conda create -n stablev2v python=3.10
然后,您可以执行以下行来使用pip
安装依赖项:
bash install_pip.sh
您还可以按照以下命令行使用conda
安装依赖项:
bash install_conda.sh
然后,您就可以使用conda activate stablev2v
了。
在开始推理过程之前,您需要准备StableV2V
所需的模型权重。
模型 | 成分 | 关联 |
---|---|---|
举例绘制 | 聚四氟乙烯 | Fantasy-Studio/Paint-by-Example |
指导Pix2Pix | 聚四氟乙烯 | timbrooks/instruct-pix2pix |
SD 修补 | 聚四氟乙烯 | botp/stable-diffusion-v1-5-inpainting |
ControlNet + SD Inpaint | 聚四氟乙烯 | lllyasviel 的 ControlNet 模型 |
任意门 | 聚四氟乙烯 | xichenhku/AnyDoor |
筏 | ISA | Google Drive |
米达斯 | ISA | Link |
U2网 | ISA | Link |
深度细化网络 | ISA | Link |
标清v1.5 | 化学工业协会 | stable-diffusion-v1-5/stable-diffusion-v1-5 |
控制网络(深度) | 化学工业协会 | lllyasviel/control_v11f1p_sd15_depth |
Ctrl-适配器 | 化学工业协会 | hanlincs/Ctrl-Adapter ( i2vgenxl_depth ) |
I2VGen-XL | 化学工业协会 | ali-vilab/i2vgen-xl |
下载所有模型权重后,将它们放入checkpoints
文件夹中。
笔记
如果您的网络环境可以访问HuggingFace,则可以直接使用HuggingFace repo ID下载模型。否则,我们强烈建议您在本地准备模型权重。
具体来说,请确保使用 DINO-v2 预训练权重的路径修改AnyDoor
的配置文件models/anydoor/configs/anydoor.yaml
:
(at line 83)
cond_stage_config:
target: models.anydoor.ldm.modules.encoders.modules.FrozenDinoV2Encoder
weight: /path/to/dinov2_vitg14_pretrain.pth
<返回目录>
StableV2V
的推断(命令行)您可以参考以下命令行来运行StableV2V
:
python inference.py --raft-checkpoint-path checkpoints/raft-things.pth --midas-checkpoint-path checkpoints/dpt_swin2_large_384.pt --u2net-checkpoint-path checkpoints/u2net.pth --stable-diffusion-checkpoint-path stable-diffusion-v1-5/stable-diffusion-v1-5 --controlnet-checkpoint-path lllyasviel/control_v11f1p_sd15_depth --i2vgenxl-checkpoint-path ali-vilab/i2vgen-xl --ctrl-adapter-checkpoint-path hanlincs/Ctrl-Adapter --completion-net-checkpoint-path checkpoints/depth-refinement/50000.ckpt --image-editor-type paint-by-example --image-editor-checkpoint-path /path/to/image/editor --source-video-frames examples/frames/bear --external-guidance examples/reference-images/raccoon.jpg --prompt " a raccoon " --outdir results
争论 | 默认设置 | 是否需要 | 解释 |
---|---|---|---|
模型参数 | - | - | - |
--image-editor-type | - | 是的 | 定义图像编辑器类型的参数。 |
--image-editor-checkpoint-path | - | 是的 | PFE 所需的图像编辑器的模型权重路径。 |
--raft-checkpoint-path | checkpoints/raft-things.pth | 是的 | ISA 要求的 RAFT 模型权重路径。 |
--midas-checkpoint-path | checkpoints/dpt_swin2_large_382.pt | 是的 | ISA 要求的 MiDaS 模型权重路径。 |
--u2net-checkpoint-path | checkpoints/u2net.pth | 是的 | U2-Net的模型权重路径,ISA需要获取视频帧的分割掩码(不久的将来将被SAM取代) |
--stable-diffusion-checkpoint-path | stable-diffusion-v1-5/stable-diffusion-v1-5 | 是的 | CIG 要求的 SD v1.5 模型权重路径。 |
--controlnet-checkpoint-path | lllyasviel/control_v11f1p_sd15_depth | 是的 | CIG 所需的 ControlNet(深度)模型权重路径。 |
--ctrl-adapter-checkpoint-path | hanlincs/Ctrl-Adapter | 是的 | CIG 所需的 Ctrl-Adapter 模型权重路径。 |
--i2vgenxl-checkpoint-path | ali-vilab/i2vgen-xl | 是的 | CIG 所需的 I2VGen-XL 模型权重路径。 |
--completion-checkpoint-path | checkpoints/depth-refinement/50000.ckpt | 是的 | CIG 所需的 I2VGen-XL 模型权重路径。 |
输入参数 | - | - | - |
--source-video-frames | - | 是的 | 输入视频帧的路径。 |
--prompt | - | 是的 | 编辑视频的文字提示。 |
--external-guidance | - | 是的 | 如果您使用Paint-by-Example 、 InstructPix2Pix 和AnyDoor ,则图像编辑器的外部输入。 |
--outdir | results | 是的 | 输出目录的路径。 |
--edited-first-frame | - | 不 | 自定义的第一个编辑框的路径,如果配置了该参数,将不会使用图像编辑器。 |
--input-condition | - | 不 | 自定义深度图的路径。如果未配置此参数,我们直接使用MiDaS 从源视频帧中提取深度图 |
--input-condition | - | 不 | 自定义深度图的路径。如果未配置此参数,我们将直接使用MiDaS 从源视频帧中提取深度图。 |
--reference-masks | - | 不 | AnyDoor 所需的参考图像的分割掩模的路径。如果未配置此参数,我们将自动从参考图像中提取分割掩码。 |
--image-guidance-scale | 1.0 | 不 | InstructPix2Pix 所需的超参数。 |
--kernel-size | 9 | 不 | 二进制膨胀操作的内核大小,以确保粘贴过程覆盖编辑内容的区域。 |
--dilation-iteration | 1 | 不 | 二元膨胀运算的迭代。 |
--guidance-scale | 9.0 | 不 | 无分类器指导量表。 |
--mixed-precision | BF16 | 不 | StableV2V 中模型的精度。 |
--n-sample-frames | 16 | 不 | 已编辑视频的视频帧数。 |
--seed | 42 | 不 | 随机种子。 |
笔记
推理时需要额外注意的一些具体点:
--image-editor-checkpoint-path
,路径将根据您的--image-editor-type
自动传递到相应的编辑器。因此,请不要担心代码库中的一些额外参数。Paint-by-Example
、 InstructPix2Pix
、 AnyDoor
,则需要配置--external-guidance
参数,该参数相应地对应于参考图像和用户指令。xformers
,这可能会导致生成的结果出现伪影。如果可能的话,此类问题将来可能会得到解决。 StableV2V
执行基于草图的编辑要获得手绘草图,您需要在平板电脑等外部设备上手动绘制它们,然后导出结果以供以后使用。特别是,我们在iPad应用程序Sketchbook
上获得了手绘草图。手绘草图示例可能如下所示:
ControlNet (scribble)
生成第一个编辑帧获得手绘草图后,下一步就是获取第一个编辑过的帧。在此过程中,我们使用ControlNet (scribble)
,您需要提前准备ControlNet (scribble)
和SD Inpaint
的模型权重。假设我们将之前的手绘草图放在inputs/hand-drawn-sketches
中,您可以通过运行ControlNet (scribble)
来执行以下命令行:
python scripts/inference_controlnet_inpaint.py --controlnet-checkpoint-path lllyasviel/control_v11p_sd15_scribble --stable-diffusion-checkpoint-path botp/stable-diffusion-v1-5-inpainting --prompt " an elephant " --input-mask inputs/masks/bear.png --controlnet-guidance inputs/hand-drawn-sketches/bear-elephant-sketch.png --outdir results/sketch-guided-result.png
结果可能看起来像:
最后,您就可以生成整个编辑后的视频了。我们提供了一个示例命令行,如下所示:
python inference.py --raft-checkpoint-path checkpoints/raft-things.pth --midas-checkpoint-path checkpoints/dpt_swin2_large_384.pt --u2net-checkpoint-path checkpoints/u2net.pth --stable-diffusion-checkpoint-path stable-diffusion-v1-5/stable-diffusion-v1-5 --controlnet-checkpoint-path lllyasviel/control_v11f1p_sd15_depth --i2vgenxl-checkpoint-path ali-vilab/i2vgen-xl --ctrl-adapter-checkpoint-path hanlincs/Ctrl-Adapter --completion-net-checkpoint-path checkpoints/depth-refinement/50000.ckpt --source-video-frames examples/frames/bear --edited-first-frame inputs/edited-first-frames/bear-elephant.png --prompt " an elephant walking on the rocks in a zoo " --outdir results
通过配置--edited-first-frame
,代码库将自动跳过第一帧编辑过程,我们在其中可视化源视频和编辑后的视频,如下所示:
<返回目录>
StableV2V
执行视频修复在修复第一个视频帧之前,我们建议您使用以下脚本扩展带注释的分段掩码(如果有):
python scripts/run_dilate_mask.py --input-folder inputs/masks/car-turn.png --output-folder inputs/dilated-masks --kernel-size 15 --iterations 1
原始(左)和扩展(右)蒙版可能如下所示:
IOPaint
生成第一个修复帧为了方便使用,我们推荐您使用IOPaint
库。要安装它,您只需运行:
pip install iopaint
然后,您可以通过库执行LaMa
:
iopaint run --model=lama --image inputs/frames/car-turn/00000.jpg --mask inputs/dilated-masks/car-turn.png --output inputs/edited-first-frames/
原始和修复后的第一帧可能如下所示:
最后,您就可以生成整个编辑后的视频了。我们提供了一个示例命令行,如下所示:
python inference.py --raft-checkpoint-path checkpoints/raft-things.pth --midas-checkpoint-path checkpoints/dpt_swin2_large_384.pt --u2net-checkpoint-path checkpoints/u2net.pth --stable-diffusion-checkpoint-path stable-diffusion-v1-5/stable-diffusion-v1-5 --controlnet-checkpoint-path lllyasviel/control_v11f1p_sd15_depth --i2vgenxl-checkpoint-path ali-vilab/i2vgen-xl --ctrl-adapter-checkpoint-path hanlincs/Ctrl-Adapter --completion-net-checkpoint-path checkpoints/depth-refinement/50000.ckpt --source-video-frames examples/frames/car-turn --edited-first-frame inputs/edited-first-frame/car-turn-inpainted.png --prompt " an elephant walking on the rocks in a zoo " --outdir results
通过配置--edited-first-frame
,代码库将自动跳过第一帧编辑过程,我们在其中可视化源视频和编辑后的视频,如下所示:
<返回目录>
StableV2V
的推理(Gradio Demo)我们还提供了一个 gradio 演示,通过交互式 UI 尝试StableV2V
。在开始之前,我们建议您按照本节中的说明在本地准备所有所需的模型权重(在./checkpoints
文件夹中)。然后,您可以通过简单地运行来测试它:
python app.py
下图我们展示了Gradio demo中不同模块的功能:
如果对演示有任何其他疑问,请随时开始新问题或提出 PR。
<返回目录>
DAVIS-Edit
我们按照与DAVIS
相同的数据结构构建DAVIS-Edit
,如下所示:
DAVIS-Edit
├── Annotations <----- Official annotated masks of DAVIS
├── bear
├── blackswan
├── ...
└── train
├── JPEGImages <----- Official video frames of DAVIS
├── bear
├── blackswan
├── ...
└── train
├── ReferenceImages <----- Annotated reference images for image-based editing on DAVIS-Edit
├── bear.png
├── blackswan.png
├── ...
└── train.png
├── .gitattributes
├── README.md
├── edited_video_caption_dict_image.json <----- Annotated text descriptions for image-based editing on DAVIS-Edit
└── edited_video_caption_dict_text.json <----- Annotated text descriptions for text-based editing on DAVIS-Edit
具体来说, edited_video_caption_dict_image.json
和edited_video_caption_dict_text.json
被构造为Python字典,其键为JPEGImages
中视频文件夹的名称。例如在edited_video_caption_dict_text.json
中:
{
"bear" : {
"original" : " a bear walking on rocks in a zoo " ,
"similar" : " A panda walking on rocks in a zoo " ,
"changing" : " A rabbit walking on rocks in a zoo "
},
# ...
}
参考图像的注释包含两个子文件夹,即similar
和changing
,分别对应DAVIS-Edit-S
和DAVIS-Edit-C
的注释,其中结构的构造与JPEGImages
中的文件夹名称相同。
我们强烈建议您通过注释文件在DAVIS-Edit
中索引不同元素。具体可以参考下面的脚本:
import os
import json
from tqdm import tqdm
from PIL import Image
# TODO: Modify the configurations here to your local paths
frame_root = 'JPEGImages'
mask_root = 'Annotations'
reference_image_root = 'ReferenceImages/similar' # Or 'ReferenceImages/changing'
annotation_file_path = 'edited_video_caption_dict_text.json'
# Load the annotation file
with open ( annotation_file_path , 'r' ) as f :
annotations = json . load ( f )
# Iterate all data samples in DAVIS-Edit
for video_name in tqdm ( annotations . keys ()):
# Load text prompts
original_prompt = annotations [ video_name ][ 'original' ]
similar_prompt = annotations [ video_name ][ 'similar' ]
changing_prompt = annotations [ video_name ][ 'changing' ]
# Load reference images
reference_image = Image . open ( os . path . join ( reference_image_root , video_name + '.png' ))
# Load video frames
video_frames = []
for path in sorted ( os . listdir ( os . path . join ( frame_root , video_name ))):
if path != 'Thumbs.db' and path != '.DS_store' :
video_frames . append ( Image . open ( os . path . join ( frame_root , path )))
# Load masks
masks = []
for path in sorted ( os . listdir ( os . path . join ( mask_root , video_name ))):
if path != 'Thumbs.db' and path != '.DS_store' :
masks . append ( Image . open ( os . path . join ( frame_root , path )))
# (add further operations that you expect in the lines below)
<返回目录>
YouTube-VOS
数据集我们使用YouTube-VOS
来进行形状引导深度细化网络的训练过程。在开始训练过程之前,您需要首先从此链接下载其源视频和注释。下载后,数据遵循以下结构:
youtube-vos
├── JPEGImages <----- Path of source video frames
├── Annotations <----- Path of segmentation masks
└── meta.json <----- Annotation file for the segmentation masks
MiDaS
标注深度图一旦视频帧准备好,下一步就是注释它们相应的深度图。具体来说,请确保从此链接下载MiDaS
模型权重。然后,您可以使用我们的自动脚本执行以下命令行:
python scripts/extract_youtube_vos_depths.py --midas-path checkpoints/dpt_swin2_large_384.pt --dataset-path data/youtube-vos/JPEGImages --outdir data/youtube-vos/DepthMaps
U2-Net
注释第一帧形状掩模我们的深度细化网络使用额外的网络通道以第一帧形状掩模作为指导,因此您需要为YouTube-VOS
数据集对它们进行注释。首先,请确保从此链接下载U2-Net
模型权重。然后,您使用我们的自动脚本执行以下命令行:
python scripts/extract_youtube_vos_shapes.py --video-root data/youtube-vos/JPEGImages --model-dir checkpoints/u2net.pth --outdir data/youtube-vos/FirstFrameMasks
最后,您可以使用以下命令行执行训练过程:
python train_completion_net.py --video-path data/youtube-vos/JPEGImages --shape-path data/youtube-vos/FirstFrameMasks --max-train-steps 50000 --outdir results/shape-guided-depth-refinement --checkpoint-freq 2000 --validation-freq 200
训练后的模型权重将保存在results/checkpoints
,中间结果的可视化可以通过tensorboard
检查,日志保存在results/tensorboard
。
<返回目录>
请参阅我们的项目页面,了解StableV2V
执行的更多结果和比较。
<返回目录>
如果您发现这项工作对您的研究有帮助,或使用我们的测试基准DAVIS-Edit
,请引用我们的论文:
@misc{liu-etal-2024-stablev2v,
title={StableV2V: Stablizing Shape Consistency in Video-to-Video Editing},
author={Chang Liu and Rui Li and Kaidong Zhang and Yunwei Lan and Dong Liu},
year={2024},
eprint={2411.11045},
archivePrefix={arXiv},
primaryClass={cs.CV},
}
<返回目录>
<返回目录>
此存储库基于 Diffusers、Ctrl-Adapter、AnyDoor 和 RAFT 进行了大量修改。我们衷心感谢作者的出色实现。
<返回目录>