6. 优化器测试
文件opt_tester.sh是一个用于测试不同优化器效果的 Bash 脚本,其功能包括生成图像并比较使用不同学习率的优化器的表现,最终生成一个可视化的拼贴图来展示结果。
#!/bin/bash
TEXT="A painting in the style of Paul Gauguin"
OUT_DIR="/home/nerdy/github/VQGAN-CLIP/Saves/OptimiserTesting-60it-Noise-NPW-1"
ITERATIONS=60
SAVE_EVERY=60
HEIGHT=256
WIDTH=256
SEED=`shuf -i 1-9999999999 -n 1` # Keep the same seed each epoch for more deterministic runs
# Main
#################
export CUBLAS_WORKSPACE_CONFIG=:4096:8
mkdir -p "$OUT_DIR"
function do_optimiser_test () {
OPTIMISER="$1"
LR="$2"
STEP="$3"
NPW="$4"
for i in {1..10}
do
PADDED_COUNT=$(printf "%03d" "$COUNT")
echo "Loop for $OPTIMISER - $LR"
python generate.py -p "$TEXT" -in pixels -o "$OUT_DIR"/"$PADDED_COUNT"-"$OPTIMISER"-"$LR"-"$NPW".png -opt "$OPTIMISER" -lr "$LR" -i "$ITERATIONS" -se "$SAVE_EVERY" -s "$HEIGHT" "$WIDTH" --seed "$SEED" -d True -iw 1 -nps 666 -npw "$NPW" -d True
LR=$(echo $LR + $STEP | bc)
((COUNT++))
done
}
# Test optimisers
COUNT=0
do_optimiser_test "Adam" .1 .1 1
COUNT=10
do_optimiser_test "AdamW" .1 .1 1
COUNT=20
do_optimiser_test "Adamax" .1 .1 1
COUNT=30
do_optimiser_test "Adagrad" .1 .25 1
COUNT=40
do_optimiser_test "AdamP" .1 .25 1
COUNT=50
do_optimiser_test "RAdam" .1 .25 1
COUNT=60
do_optimiser_test "DiffGrad" .1 .25 1
# Make montage
mogrify -font Liberation-Sans -fill white -undercolor '#00000080' -pointsize 14 -gravity NorthEast -annotate +10+10 %t "$OUT_DIR"/*.png
montage "$OUT_DIR"/*.png -geometry 256x256+1+1 -tile 10x7 collage.jpg
对上述功能的具体说明如下所示。
(1)参数设置
- TEXT:设定生成图像的文本提示,表示希望生成的图像风格。
- OUT_DIR:指定生成图像保存的输出目录。
- ITERATIONS、SAVE_EVERY、HEIGHT、WIDTH:定义图像生成的迭代次数、保存频率和图像的高度与宽度。
- SEED:生成一个随机种子,确保每次运行的结果在相同参数下具有可重复性。
- 创建输出目录:使用 mkdir -p 创建指定的输出目录,以便存储生成的图像。
(2)优化器测试函数
- do_optimiser_test 函数接受优化器名称、学习率、学习率增量和噪声提示权重作为参数,并在指定范围内循环生成图像。
- 在每次循环中,它调用 generate.py 脚本,传入文本提示和当前优化器、学习率等参数,生成图像并保存到输出目录。
(3)测试不同的优化器:脚本依次测试多种优化器(如 Adam、AdamW、Adamax、Adagrad 等),为每个优化器调用 do_optimiser_test 函数。
(4)生成拼贴图
- 使用 mogrify 命令为生成的图像添加标签,方便查看每个图像的对应优化器和学习率。
- 最后,使用 montage 命令将所有生成的图像合并为一个拼贴图,便于直观比较不同优化器的表现。
通过这些功能,脚本文件opt_tester.sh为图像生成优化器的效果评估提供了一种便捷的方法,帮助用户直观了解不同设置的影响。
7. 视频帧风格化
文件video_styler.sh是一个用于对视频帧进行风格化处理的 Bash 脚本。它的主要功能是提取视频中的帧,将每一帧应用特定的风格化文本,然后将风格化的帧合成为新的视频。
#!/bin/bash
# Style text
TEXT="Oil painting of a woman in the foreground | pencil art landscape background"
FRAMES_IN="/home/nerdy/github/VQGAN-CLIP/VideoFrames"
FRAMES_OUT="/home/nerdy/github/VQGAN-CLIP/Saves/VideoStyleTesting"
HEIGHT=640
WIDTH=360
ITERATIONS=25
SAVE_EVERY=$ITERATIONS
OPTIMISER=Adagrad # Adam, AdamW, Adagrad, Adamax
LR=0.2
SEED=`shuf -i 1-9999999999 -n 1` # Keep the same seed each frame for more deterministic runs
mkdir -p "$FRAMES_IN"
mkdir -p "$FRAMES_OUT"
export CUBLAS_WORKSPACE_CONFIG=:4096:8
ffmpeg -y -i "$1" -q:v 2 "$FRAMES_IN"/frame-%04d.jpg
ls "$FRAMES_IN" | while read file; do
FILENAME="$FRAMES_OUT"/"$file"-"out".jpg
echo "Input frame: $file"
echo "Style text: $TEXT"
echo "Output file: $FILENAME"
python generate.py -p "$TEXT" -ii "$FRAMES_IN"/"$file" -o "$FILENAME" -opt "$OPTIMISER" -lr "$LR" -i "$ITERATIONS" -se "$SAVE_EVERY" -s "$HEIGHT" "$WIDTH" -sd "$SEED" -d True
done
ffmpeg -y -i "$FRAMES_OUT"/frame-%04d.jpg-out.jpg -b:v 8M -c:v h264_nvenc -pix_fmt yuv420p -strict -2 -filter:v "minterpolate='mi_mode=mci:mc_mode=aobmc:vsbmc=1:fps=60'" style_video.mp4
对上述代码的具体说明如下所示:
(1)参数设置
- TEXT:定义用于风格化图像的文本提示,描述所期望的艺术风格。
- FRAMES_IN 和 FRAMES_OUT:分别指定输入视频帧和输出风格化帧的目录。
- HEIGHT 和 WIDTH:设置生成的图像的高度和宽度。
- ITERATIONS 和 SAVE_EVERY:定义生成图像时的迭代次数和保存频率。
- OPTIMISER 和 LR:指定优化器类型(如 Adagrad)和学习率。
- SEED:生成一个随机种子,确保每帧在相同参数下具有可重复性。
(2)创建目录:使用 mkdir -p 创建输入和输出帧的目录,以便存储提取的帧和风格化后的图像。
(3)提取视频帧:使用 ffmpeg 命令从输入视频文件中提取所有帧,保存为 JPEG 格式的图像文件到指定的输入帧目录。
(4)风格化处理:
- 首先,遍历输入帧目录中的所有图像文件。
- 对每一帧,生成一个对应的输出文件名,并使用 generate.py 脚本将文本提示和当前帧作为输入,进行图像生成和风格化处理。
- 最后,将风格化后的图像保存到指定的输出目录。
(5)合成视频:使用 ffmpeg 命令将所有风格化后的帧合并为一个新的视频文件,并使用特定的编码和插值技术(如 minterpolate)提高帧率。
通过这些功能,脚本文件video_styler.sh为视频帧风格化提供了一个简便的方法,使用户能够将艺术风格应用于整个视频,生成具有独特视觉效果的新视频。
8. 生成随机图像
文件random.sh的功能是生成随机文本提示,并利用这些提示通过文件generate.py生成对应的图像。
#!/bin/bash
text_one=("A painting of a" "A pencil art sketch of a" "An illustration of a" "A photograph of a")
text_two=("spinning" "dreaming" "watering" "loving" "eating" "drinking" "sleeping" "repeating" "surreal" "psychedelic")
text_three=("fish" "egg" "peacock" "watermelon" "pickle" "horse" "dog" "house" "kitchen" "bedroom" "door" "table" "lamp" "dresser" "watch" "logo" "icon" "tree"
"grass" "flower" "plant" "shrub" "bloom" "screwdriver" "spanner" "figurine" "statue" "graveyard" "hotel" "bus" "train" "car" "lamp" "computer" "monitor")
styles=("Art Nouveau" "Camille Pissarro" "Michelangelo Caravaggio" "Claude Monet" "Edgar Degas" "Edvard Munch" "Fauvism" "Futurism" "Impressionism"
"Picasso" "Pop Art" "Modern art" "Surreal Art" "Sandro Botticelli" "oil paints" "watercolours" "weird bananas" "strange colours")
pickword() {
local array=("$@")
ARRAY_RANGE=$((${#array[@]}-1))
RANDOM_ENTRY=`shuf -i 0-$ARRAY_RANGE -n 1`
UPDATE=${array[$RANDOM_ENTRY]}
}
# Generate some images
for number in {1..50}
do
# Make some random text
pickword "${text_one[@]}"
TEXT=$UPDATE
pickword "${text_two[@]}"
TEXT+=" "$UPDATE
pickword "${text_three[@]}"
TEXT+=" "$UPDATE
pickword "${text_three[@]}"
TEXT+=" and a "$UPDATE
pickword "${styles[@]}"
TEXT+=" in the style of "$UPDATE
pickword "${styles[@]}"
TEXT+=" and "$UPDATE
python generate.py -p "$TEXT" -o "$number".png
done
对上述代码的具体说明如下所示:
(1)文本数组定义:脚本定义了多个数组(如 text_one, text_two, text_three, 和 styles),每个数组包含不同类型的描述词和风格,用于构建随机的艺术描述。
(2)随机选择函数:pickword 函数从传入的数组中随机选择一个元素。该函数通过使用 shuf 命令获取一个随机索引来选择数组元素。
(3)图像生成循环:在 for 循环中,脚本生成 50 个随机图像:
- 每次循环调用 pickword 函数从不同的文本数组中随机选择词,并将其拼接成一个完整的文本提示。
- 生成的文本描述包括不同的艺术风格和主题内容,最后使用 generate.py 脚本通过 -p 参数传递这个随机生成的文本提示。
- 生成的图像将保存为 PNG 文件,文件名为数字序列(1.png, 2.png, 等等)。
9. 调试运行
(1)准备预训练模型
执行脚本文件download_models.sh自动下载项目所需的预训练模型,运行这个脚本会从指定的源下载模型文件并将其放置在“checkpoints”目录中。
(2)运行生成图像
要根据文本提示生成图像,可以使用以下命令实现:
python generate.py -p "A painting of an apple in a fruit bowl"
(3)多个提示
可以使用管道符号(|)来指定多个文本和图像提示,还可以使用冒号和数字设置提示权重。例如:
python generate.py -p "A painting of an apple in a fruit bowl | psychedelic | surreal:0.5 | weird:0.25"
也可以使用相同的方式分割图像提示:
python generate.py -p "A picture of a bedroom with a portrait of Van Gogh" -ip "samples/VanGogh.jpg | samples/Bedroom.png"
(4)故事模式
可以使用插入符号(^)创建一组文本提示,生成一种故事模式。例如:
python generate.py -p "A painting of a sunflower|photo:-1 ^ a painting of a rose ^ a painting of a tulip ^ a painting of a daisy flower ^ a photograph of daffodil" -cpe 1500 -zvid -i 6000 -zse 10 -vl 20 -zsc 1.005 -opt Adagrad -lr 0.15 -se 6000
(5)风格迁移
使用输入图像和风格文本结合少量迭代,可以实现风格迁移效果,例如:
python generate.py -p "A painting in the style of Picasso" -ii samples/VanGogh.jpg -i 80 -se 10 -opt AdamW -lr 0.25
(6)视频风格迁移
可以通过指定视频帧目录来实现视频风格迁移效果,输出将保存在步骤目录中,使用原始视频帧文件名。可以将此与故事模式结合使用,以便在每幅图像上应用不同的风格。
(7)反馈示例
通过将生成的图像反馈并进行轻微更改,可以创建一些有趣的效果。使用 zoom.sh 脚本来应用缩放和旋转到生成的图像,再将其反馈。例如:
./zoom.sh "A painting of a red telephone box spinning through a time vortex" Telephone.png 150
如果没有安装 ImageMagick,可以使用以下命令安装:
sudo apt install imagemagick
(8)随机文本示例
使用 random.sh 脚本生成一批随机文本的图像。编辑文本和生成图像的数量以满足个人需求:
./random.sh
到此为止,整个项目介绍完毕,执行效果如图5-8所示。
图5-8 生成的图像