代码:https://github.com/MONI-JUAN/Tensorflow_Study/tree/master/ch09-pix2pix模型与自动上色技术
目录
-
- 一、概念
-
- 1.GAN缺陷
- 2.cGAN
- 3.GAN 和 cGAN对比
- 4.应用
- 5.pix2pix 模型
- 二、pix2pix
-
- 1.下载数据集
- 2.查看数据集
- 3.训练模型
- 4.查看训练情况
- 5.测试模型
- 6.其他数据集
-
- a)为食物图片上色
- b)为动漫图片上色
一、概念
1.GAN缺陷
使用 GAN 可以对样本进行无监督学习,然后生成全新的样本。但虽然能生成新的样本,却无法确切控制新样本的类型。
如使用 GAN 生成 MNIST 数字,虽然可以生成数字,但生成的结果是随机 的,因为是根据输入的随机躁声生成图片,没再办法控制模型生成的具体数字。
2.cGAN
cGAN( Conditional Generative Adversarial Networks),条件对抗生成网络,它为生成器、判别器都额外加入了一个条件y,这个条件实际是希望生成的标签。生成器G 必须要生成和条件y匹配的样本,判别器不仅要判别图像是否真实,还要判别图像和条件y 是否匹配。
3.GAN 和 cGAN对比
-
GAN
-
生成器 G,输入为一个噪声 z,输出一个图像 G(z)
-
判别器 D,输入为一个图像 x,输出该图像为真实的概率D(x)
-
优化目标:
V(D,G)=Ex?Pdata [ln?D(x)]+Ez?pz(z)[ln?(1?D(G(z)))]V(D, G)=E_{x \sim P_{\text {data }}}[\ln D(x)]+E_{z \sim p_{z}(z)}[\ln (1-D(G(z)))] V(D,G)=Ex?Pdata ??[lnD(x)]+Ez?pz?(z)?[ln(1?D(G(z)))]
-
-
cGAN
-
生成器 G,输入为一个噪声 z, 一个条件y,输出一个图像 G(z|y)
-
判别器 D,输入为一个图像 x, 一个条件y,输出该图像在该条件下的概率D(x|y)
-
优化目标:
V(D,G)=Ex?Pdata [ln?D(x∣y)]+Ez?pz(z)[ln?(1?D(G(z∣y)))]V(D, G)=E_{x \sim P_{\text {data }}}[\ln D(x|y)]+E_{z \sim p_{z}(z)}[\ln (1-D(G(z|y)))] V(D,G)=Ex?Pdata ??[lnD(x∣y)]+Ez?pz?(z)?[ln(1?D(G(z∣y)))]
-
-
以 MNIST 为例的cGAN
- 生成器 G,输入为一个噪声 z, 一个数字标签y(0 ~ 9),输出一个符合标签的图像 G(z|y)
- 判别器 D,输入为一个图像 x, 一个数字标签y,输出该图像和数字符合的概率D(x|y)
- 在训练完成后,向 G 输入某个数字标签和噪声,可以生成对应数字的图像
4.应用
- 将街景的标注图像变为真实照片。
- 将建筑标注图像转换为照片。
- 将卫星图像转换为地圄。
- 将白天的图片转换为夜晚的图片。
- 将边缘轮廓线转段为真实物体。
5.pix2pix 模型
pix2pix 和 cGAN 的结构类似,同样是由生成器 G、判别器 D 两个网络组成。 设要将 Y类型的图像转换为 X类型的图像, G、 D 的任务分别为 :
- G 的输入是一个 Y 类图像 y ,输出为生成图像 G(y)。
- D 的输入为一个 X 类图像x,一个 Y 类图像y。D 需要判断 x 图像是否是真正的y对应的图像,并输出一个概率。
二、pix2pix
1.下载数据集
下载数据集facades.rar
用脚本:
python tools/download-dataset.py facades
或者百度云链接:https://pan.baidu.com/s/1LhYMOCiHRr_qRryG4FcB6A
提取码:8x8b
2.查看数据集
完成后 facades
文件夹中有三个文件夹,分别是 test
、train
、val
。
随便打开一张:
图片的左边称为 A类,右边为 B类。训练时可以指定是【A类翻译为B类】还是【B类翻译为A类】。
在 Facades 数据集中,希望程序能从图像的标注出发,生成真实的建筑图像。因此,根据图像的排列顺序,应该指定将 B 类图像转换成 A 类图像。
-
cGAN , 与原始 GAN 使用随机躁声生成样本不同, cGAN 可以根据指定标签生成样 本。
-
pix2pix 模型,可以看作是 cGAN 的一种特殊形式。
3.训练模型
python pix2pix.py \--mode train \ # 训练--output_dir facades_train \ # 输出路径--max_epochs 200 \ # 最大epoch数--input_dir facades/train \ # 数据集路径--which_direction BtoA # 学习从B类图像转换为A类
python pix2pix.py --mode train --output_dir facades_train --max_epochs 200 --input_dir facades/train --which_direction BtoA
4.查看训练情况
tensorboard --logdir facades_train
5.测试模型
python pix2pix.py \--mode test \ # 测试--output_dir facades_test \ # 输出路径--input_dir facades/val \ # 输入路径--checkpoint facades_train # 保存模型
python pix2pix.py --mode test --output_dir facades_test --input_dir facades/val --checkpoint facades_train
训练了三四个小时的结果,还凑合。
6.其他数据集
百度云可以下两个数据集,也就是食物和动漫的
百度云链接:https://pan.baidu.com/s/1LhYMOCiHRr_qRryG4FcB6A
提取码:8x8b
除此以外还有几个可以用脚本下载:
python tools/download-dataset.py facades
python tools/download-dataset.py cityscapes
python tools/download-dataset.py maps
python tools/download-dataset.py edges2shoes
python tools/download-dataset.py edges2handbags
每次训练时间太长了,这两个就没有跑,有空的可以试试
a)为食物图片上色
在chapter_9_data/中提供的food_resized.zip 文件解压到目录~/datasets/colorlization/下,最终形成的文件 夹结构应该是:
~/datasetscolorlization/food_resized/train/val/
训练命令:
python pix2pix.py \
--mode train \
--output_dir colorlization_food \
--max_epochs 70 \
--input_dir ~/datasets/colorlization/food_resized/train \
--lab_colorization
测试命令:
python pix2pix.py \--mode test \--output_dir colorlization_food_test \--input_dir ~/datasets/colorlization/food_resized/val \--checkpoint colorlization_food
结果在colorlization_food_test文件夹中。
b)为动漫图片上色
将chapter_9_data/中提供的动漫图像数据集anime_reized.zip 解压到~/datasets/colorlization/目录下,形成的文件夹结构为:
~/datasetscolorlization/anime_resized/train/val/
训练命令:
python pix2pix.py \--mode train \--output_dir colorlization_anime \--max_epochs 5 \--input_dir ~/datasets/colorlization/anime_resized/train \--lab_colorization
测试命令:
python pix2pix.py \--mode test \--output_dir colorlization_anime_test \--input_dir ~/datasets/colorlization/anime_resized/val \--checkpoint colorlization_anime
结果在colorlization_anime_test文件夹中。