Tutorial 8: 生成模型的应用

插值

以GAN为架构的生成模型学习将潜码空间中的点映射到生成的图像上。生成模型赋予了潜码空间的具体意义。一般来说,我们想探索潜码空间的结构,我们可以做的一件事是在潜码空间的两个端点之间插入一系列点,观察这些点生成的结果。(例如,我们认为,如果任何一个端点都不存在的特征出现在线性插值路径的中间点,则说明潜码空间是纠缠在一起的,动态属性没有得到适当的分离。)

我们为用户提供了一个应用脚本。你可以使用apps/interpolate_sample.py的以下命令进行无条件模型的插值。

python apps/interpolate_sample.py \
    ${CONFIG_FILE} \
    ${CHECKPOINT} \
    [--show-mode ${SHOW_MODE}] \
    [--endpoint ${ENDPOINT}] \
    [--interval ${INTERVAL}] \
    [--space ${SPACE}] \
    [--samples-path ${SAMPLES_PATH}] \
    [--batch-size ${BATCH_SIZE}] \

在这里,我们提供两种显示模式(SHOW_MODE),即序列(sequence)和组(group)。在序列模式下,我们首先对一连串的端点进行采样,然后按顺序对两个端点之间的点进行插值,生成的图像将被单独保存。在组模式下,我们先采样几对端点,然后在每对端点之间进行插值,生成的图像将被保存在一张图片中。此外,space 指的是潜码空间,你可以选择’z’或’w’(指StyleGAN系列中的风格空间),endpoint 表示你要采样的端点数量(在 group 模式中应设置为偶数),interval表示你在两个端点之间插值的点的数量(包括端点)。

注意,我们还提供了更多的自定义参数来定制你的插值程序。 请使用python apps/interpolate_sample.py --help来查看更多细节。

如同上面的方法,你可以使用apps/conditional_interpolate.py和下列命令进行条件模型的插值。

python apps/conditional_interpolate.py \
    ${CONFIG_FILE} \
    ${CHECKPOINT} \
    [--show-mode ${SHOW_MODE}] \
    [--endpoint ${ENDPOINT}] \
    [--interval ${INTERVAL}] \
    [--embedding-name ${EMBEDDING_NAME}]
    [--fix-z] \
    [--fix-y] \
    [--samples-path ${SAMPLES_PATH}] \
    [--batch-size ${BATCH_SIZE}] \

在这里,与无条件模型不同,如果标签嵌入在 conv_blocks 之间共享,你需要提供嵌入层的名称。否则,你应该将 embedding-name 设置为 NULL。考虑到条件模型有噪声和标签作为输入,我们提供 fix-z 来固定噪声,fix-y 来固定标签。

投影

求生成网络 g 的逆是一个有趣的问题,有很多应用。例如,在潜码空间中操作一个给定的图像需要先为它找到一个匹配的潜码。一般来说,你可以通过对潜码进行优化来重建目标图像,使用 lpips 和像素级损失作为目标函数。

事实上,我们已经向用户提供了一个应用脚本,为给定的图像找到 StyleGAN 系列生成网络的匹配潜码向量 w。你可以使用apps/stylegan_projector.py的以下命令来执行投影。

python apps/stylegan_projector.py \
    ${CONFIG_FILE} \
    ${CHECKPOINT} \
    ${FILES}
    [--results-path ${RESULTS_PATH}]

这里,FILES 指的是图像的路径,而投影的潜码和重建的图像将被保存在 results-path 中。 注意,我们还提供了更多的自定义参数来定制你的投影程序。请使用python apps/stylegan_projector.py --help来查看更多细节。

编辑

基于 StyleGAN 模型的一个常见应用是操纵潜码空间来控制合成图像的属性。在这里,我们向用户提供了一个基于SeFa的简单而流行的算法。这里,我们在计算特征向量时对原始版本进行了修改,并提供了一个更灵活的接口。

为了操纵你的生成器,你可以用以下命令运行脚本apps/modified_sefa.py

python apps/modified_sefa.py --cfg ${CONFIG} --ckpt ${CKPT} \
    -i ${INDEX} -d ${DEGREE} --degree-step ${D_STEP} \
    -l ${LAYER_NO} \
    [--eigen-vector ${PATH_EIGEN_VEC}]

在这个脚本中,如果 eigen-vectorNone,程序将计算生成器参数的特征向量。同时,我们将把该向量保存在 ckpt 文件的同一目录下,这样用户就可以应用这个预先计算的向量。Positional Encoding as Spatial Inductive Bias in GANs 的演示就来自这个脚本。下面是一个例子,供用户获得与我们的演示类似的结果。

${INDEX}表示我们将应用哪个特征向量来操作图像。在一般情况下,每个索引控制一个独立的属性,这是由 StyleGAN 中的解耦表示保证的。我们建议用户可以尝试不同的索引来找到你想要的那个属性。--degree 设定了乘法因子的范围。在我们的实验中,我们观察到像 [-3, 8] 这样的非对称范围是非常有帮助的。因此,我们允许在这个参数中设置下限和上限。--layer--l 定义了我们将应用哪一层的特征向量。有些属性,比如光照,只与生成器中的 1-2 层有关。

以光照属性为例,我们在 MS-PIE-StyleGAN2-256 模型上运行以下命令。

python apps/modified_sefa.py \
    --config configs/positional_encoding_in_gans/mspie-stylegan2_c2_config-f_ffhq_256-512_b3x8_1100k.py \
    --ckpt https://download.openmmlab.com/mmgen/pe_in_gans/mspie-stylegan2_c2_config-f_ffhq_256-512_b3x8_1100k_20210406_144927-4f4d5391.pth \
    -i 15 -d 8. --degree-step 0.5 -l 8 9 --sample-path ./work_dirs/sefa-exp/ \
    --sample-cfg chosen_scale=4 randomize_noise=False

注意到,在设置 chosen_scale=4 之后,我们可以用一个简单的分辨率为256的生成器来操作512x512的图像。