[hidecontent type="logged" desc="隐藏内容:登录后可查看"]
pip install dominate requests
pip install dlib
git clone https://github.com/NVIDIA/vid2vid
cd vid2vid
docker
文件夹中找到一个 docker image。请先通过运行下载示例数据集python scripts/download_datasets.py
。
接下来,通过运行编译FlowNet2的快照python scripts/download_flownet2.py
。
城市景观
请通过以下方式下载预训练的 Cityscapes 模型:
python scripts/street/download_models.py
测试模型 ( bash ./scripts/street/test_2048.sh
):
#!./scripts/street/test_2048.sh
python test.py --name label2city_2048 --label_nc 35 --loadSize 2048 --n_scales_spatial 3 --use_instance --fg --use_single_G
测试结果将保存在:./results/label2city_2048/test_latest/
.
我们还提供了一个使用单个 GPU 训练的较小模型,它在 1024 x 512 分辨率下产生的性能稍差。
python scripts/street/download_models_g1.py
bash ./scripts/street/test_g1_1024.sh
):#!./scripts/street/test_g1_1024.sh
python test.py --name label2city_1024_g1 --label_nc 35 --loadSize 1024 --n_scales_spatial 3 --use_instance --fg --n_downsample_G 2 --use_single_G
您可以在该目录中找到更多示例脚本scripts/street/
。
Faces
python scripts/face/download_models.py
bash ./scripts/face/test_512.sh
):
#!./scripts/face/test_512.sh
python test.py --name edge2face_512 --dataroot datasets/face/ --dataset_mode face --input_nc 15 --loadSize 512 --use_single_G
./results/edge2face_512/test_latest/
.datasets
请按照提供示例图像的相同方式将获取的图像添加到文件夹中。python scripts/download_models_flownet2.py
。bash ./scripts/street/train_512.sh
)#!./scripts/street/train_512.sh
python train.py --name label2city_512 --label_nc 35 --gpu_ids 0,1,2,3,4,5,6,7 --n_gpus_gen 6 --n_frames_total 6 --use_instance --fg
bash ./scripts/street/train_1024.sh
):#!./scripts/street/train_1024.sh
python train.py --name label2city_1024 --label_nc 35 --loadSize 1024 --n_scales_spatial 2 --num_D 3 --gpu_ids 0,1,2,3,4,5,6,7 --n_gpus_gen 4 --use_instance --fg --niter_step 2 --niter_fix_global 10 --load_pretrain checkpoints/label2city_512
./checkpoints/label2city_1024/logs
如果您安装了 TensorFlow,您可以通过添加--tf_log
到训练脚本来看到 TensorBoard 登录。
使用单个 GPU 进行训练:
bash ./scripts/street/train_g1_256.sh
)#!./scripts/street/train_g1_256.sh
python train.py --name label2city_256_g1 --label_nc 35 --loadSize 256 --use_instance --fg --n_downsample_G 2 --num_D 1 --max_frames_per_gpu 6 --n_frames_total 6
以全 (2k x 1k) 分辨率进行训练
bash ./scripts/street/train_2048.sh
)。如果只有 12G/16G 内存的 GPU 可用,请使用脚本./scripts/street/train_2048_crop.sh
,它会在训练期间裁剪图像。此脚本不保证性能。python scripts/download_datasets.py
。python data/face_landmark_detection.py train
bash ./scripts/face/train_512.sh
)
python train.py --name edge2face_512 --dataroot datasets/face/ --dataset_mode face --input_nc 15 --loadSize 512 --num_D 3 --gpu_ids 0,1,2,3,4,5,6,7 --n_gpus_gen 6 --n_frames_total 12
max_frames_per_gpu
.scripts/face/
。python scripts/download_datasets.py
。bash ./scripts/pose/train_256p.sh
)
python train.py --name pose2body_256p --dataroot datasets/pose --dataset_mode pose --input_nc 6 --num_D 2 --resize_or_crop ScaleHeight_and_scaledCrop --loadSize 384 --fineSize 256 --gpu_ids 0,1,2,3,4,5,6,7 --batchSize 8 --max_frames_per_gpu 3 --no_first_img --n_frames_total 12 --max_t_step 4
max_frames_per_gpu
.scripts/pose/
。--label_nc N
请在训练和测试期间使用。--input_nc N
其中 N 是输入通道的数量(RGB 图像的默认值为 3)。scaleWidth
,这会将所有训练图像的宽度缩放到opt.loadSize
(1024),同时保持纵横比。如果您想要不同的设置,请使用该--resize_or_crop
选项进行更改。例如,scaleWidth_and_crop
首先将图像调整为宽度opt.loadSize
,然后随机裁剪 size (opt.fineSize, opt.fineSize)
。crop
跳过调整大小的步骤,只执行随机裁剪。scaledCrop
在重新训练原始纵横比的同时裁剪图像。randomScaleHeight
将随机缩放图像高度在opt.loadSize
和之间opt.fineSize
。如果您不需要任何预处理,请指定none
,这只会确保图像可以被 32 整除。我们按顺序在视频中生成帧,当前帧的生成取决于之前的帧。要为模型生成第一帧,有 3 种不同的方法:
--use_single_G
。这是我们在测试脚本中使用的选项。--use_real_img
。--no_first_img
。这必须在推理之前单独训练。我们训练模型的方式如下:假设我们有 8 个 GPU,4 个用于生成器,4 个用于鉴别器,我们要训练 28 帧。此外,假设每个 GPU 只能生成一帧。第一个 GPU 生成第一帧,并将其传递给下一个 GPU,依此类推。生成 4 个帧后,将它们传递给 4 个鉴别器 GPU 以计算损失。然后最后生成的帧成为下一批的输入,训练序列中接下来的 4 帧被加载到 GPU 中。重复 7 次 (4 x 7 = 28),以训练所有 28 帧。
一些重要的标志:
n_gpus_gen
:用于生成器的 GPU 数量(而其他用于鉴别器)。我们将生成器和鉴别器分离到不同的 GPU 中,因为在处理高分辨率时,即使是一帧也无法放入 GPU 中。如果数字设置为-1
,则没有分离,所有 GPU 都用于生成器和鉴别器(仅适用于低分辨率图像)。n_frames_G
:输入生成器网络的输入帧数;即,n_frames_G - 1
是我们查看过去的帧数。默认值为 3(以前两帧为条件)。n_frames_D
:输入时间鉴别器的帧数。默认值为 3。n_scales_spatial
:空间域中的尺度数。我们从最粗糙的尺度一直训练到最精细的尺度。默认值为 3。n_scales_temporal
:时间鉴别器的尺度数。最精细的比例采用原始帧速率的序列。n_frames_D
在将帧馈送到鉴别器之前,较粗尺度对帧进行二次采样。例如,如果n_frames_D = 3
和n_scales_temporal = 3
,鉴别器有效地看到 27 帧。默认值为 3。max_frames_per_gpu
:训练期间一个 GPU 中的帧数。如果遇到内存不足错误,请先尝试减少此数字。如果您的 GPU 内存可以容纳更多帧,请尝试使这个数字更大以加快训练速度。默认值为 1。max_frames_backpropagate
:损失反向传播到先前帧的帧数。例如,如果此数字为 4,则第 n 帧的损失将反向传播到第 n-3 帧。增加这个数字会略微提高性能,但也会导致训练不太稳定。默认值为 1。n_frames_total
:我们想要训练的序列中的总帧数。我们在训练期间逐渐增加这个数字。niter_step
:我们加倍了多少个时代n_frames_total
。默认值为 5。niter_fix_global
:如果这个数字不为 0,则在开始微调所有尺度之前,只为这个时期数训练最好的空间尺度。batchSize
:一次训练的序列数。我们通常将 batchSize 设置为 1,因为通常一个序列足以占用所有 GPU。如果要batchSize > 1,目前只batchSize == n_gpus_gen
支持。no_first_img
:如果未指定,模型将假定第一帧已给定并合成后续帧。如果指定,模型还将尝试合成第一帧。fg
:如果指定,请使用论文中所述的前景-背景分离模型。前景标签必须由 指定--fg_labels
。no_flow
:如果指定,则不使用流扭曲并直接合成帧。我们发现当背景是静态的时候,这通常仍然工作得相当好,同时节省内存和训练时间。sparse_D
:如果指定,则仅在序列中的稀疏帧上应用时间鉴别器。这有助于节省内存,同时对性能影响很小。对于其他标志,请参阅options/train_options.py
所有options/base_options.py
训练标志;查看options/test_options.py
所有options/base_options.py
测试标志。
edge2face 示例的附加标志:
no_canny_edge
:不要使用精明的边缘作为背景作为输入。no_dist_map
:默认情况下,我们在人脸边缘图上使用距离变换作为输入。此标志将使其直接使用边缘贴图。pose2body 示例的附加标志:
densepose_only
:仅使用密集结果作为输入。还请记得改成input_nc
3。openpose_only
:仅使用 openpose 结果作为输入。还请记得改成input_nc
3。add_face_disc
:添加一个仅适用于面部区域的附加鉴别器。remove_face_labels
:去除人脸的densepose结果,并为openpose人脸结果添加噪声,这样网络可以对不同的人脸形状更加鲁棒。如果您打算对半身视频进行推理,这一点很重要(如果不是,通常不需要此标志)。random_drop_prob
:在训练期间随机丢弃每个姿势片段的概率,因此网络可以在推理时对丢失的姿势更加鲁棒。默认值为 0.05。basic_point_only
:如果指定,则仅使用基本关节关键点进行 OpenPose 输出,而不使用任何手部或面部关键点。如果您发现这对您的研究有用,请引用以下论文。
@inproceedings{wang2018vid2vid,
author = {Ting-Chun Wang and Ming-Yu Liu and Jun-Yan Zhu and Guilin Liu
and Andrew Tao and Jan Kautz and Bryan Catanzaro},
title = {Video-to-Video Synthesis},
booktitle = {Advances in Neural Information Processing Systems (NeurIPS)},
year = {2018},
}
[/hidecontent]