图像超分辨重构的原理, 输入一张像素点少, 像素较低的图像, 输出一张像素点多, 像素较高的图像
而在作者的文章中, 作者使用 downsample_up, 使用 imresize(img, []) 将图像的像素从原理的 384,384 降低到 96, 96, 从而构造出高水平的图像和低水平的图像
作者使用了三个部分构成网络,
第一部分是生成网络, 用于进行图片的生成, 使用了 16 层的残差网络, 最后的输出结果为 tf.nn.tanh(), 即为 - 1, 1, 因为图像进行了 - 1,1 的预处理
第二部分是判别网络, 用于进行图片的判别操作, 对于判别网络而言, 是希望将生成的图片判别为假, 将真的图片判别为真
第三部分是 VGG19 来提取生成图片和真实图片的 conv5 层卷积层的输出结果, 用于生成局部部位的损失值 mse
损失值说明:
- d_loss:
- d_loss_1: tl.cost.sigmoid_cross_entropy(logits_real, tf.ones_like(logits_real)) # 真实图像的判别结果的损失值
- d_loss_2: tl.cost.sigmoid_cross_entrpopy(logits_fake, tf.zeros_like(logits_real)) # 生成图像的判别结果的损失值
- g_loss:
- g_gan_loss: 1e-3 * tl.cost.sigmoid_cross_entropy(logits_fake, tf.ones_like(logits_real)) # 损失值表示为 -log(D(g(lr))) # 即生成的图像被判别为真的损失值
- mse_loss: tl.cost.mean_squared_error(net_g.outputs, t_target_image) # 计算真实值与生成值之间的像素差
- vgg_loss: tl.cost.mean_squared_error(vgg_predict_emb.outputs, vgg_target_emb.outputs) # 用于计算生成图片和真实图片经过 vgg19 的卷积层后, 特征图之间的差异, 用来获得特征细节的差异性
训练说明:
首先进行 100 次迭代, 用来优化生成网络, 使用 tf.train.AdamOptimer(lr_v, beta1=beta1).minimize(mse_loss, var_list=g_var)
等生成网络迭代好以后, 开始迭代生成网络和判别网络, 以及 VGG19 的损失值缩小
生成网络: 使用了 16 个残差模块, 在残差模块的输入与下一层的输出之间又进行一次残差直连
判别网络: 使用的是 feature_map 递增的卷积层构造成的判别网路
代码说明:
第一步: 将参数从 config 中导入到 main.py
第二步: 使用 tl.file.exists_or_mkdir() 构造用于储存图片的文件夹, 同时定义 checkpoint 的文件夹
第三步: 使用 sorted(tl.files.load_file_list) 生成图片的列表, 使用 tl.vis.read_images() 进行图片的读入
第四步: 构建模型的构架 Model
第一步: 定义输入参数 t_image = tf.placeholder('float32', [batch_size, 96, 96, 3]), t_target_image = tf.placeholder('float32', [batch_size, 384, 384, 3])
第二步: 使用 SGRAN_g 用来生成最终的生成网络, net_g, 输入参数为 t_image, is_training, reuse
第三步: 使用 SGRAN_d 用来生成判别网络, 输出结果为 net_d 网络架构, logits_real, 输入参数为 t_target_image, is_training, reuse, 同理输入 t_image, 获得 logits_fake
第四步: 使用 net_g.print_params(False) 和 net_g.print_layers() 不打印参数, 打印每一层
第五步: 将 net_g.outputs 即生成的结果和 t_target_image 即目标图像的结果输入到 Vgg_19_simple_api, 获得 vgg_net, 以及 conv 第五层的输出结果
第一步: tf.image.resize_images() 进行图片的维度变换, 为了可以使得其能输入到 VGG_19 中
第二步: 将变化了维度的 t_target_image 输入到 Vgg_19_simple_api, 获得 net_vgg, 和 vgg_target_emb 即第五层卷积的输出结果
第三步: 将变化了维度的 net_g.outputs 输入到 Vgg_19_simple_api, 获得 vgg_pred_emb 即第五层卷积的输出结果
第六步: 构造 net_g_test = SGRAN_g(t_image, False, True) 用于进行训练中的测试图片
第五步: 构造模型 loss, 还有 trian_ops 操作
第一步: loss 的构造
第一步: d_loss 的构造, d_loss_1 + d_loss_2
第一步: d_loss_1: 构造真实图片的判别损失值, 即 tl.cost.softmax_cross_entropy(logits_real, tf.ones_like(logits_real))
第二步: d_loss_2: 构造生成图片的判别损失值, 即 tl.cost.softmax_cross_entropy(logits_fake, tf.ones_like(logits_fake))
第二步: g_loss 的构造, g_gan_loss, mse_loss, vgg_loss
第一步: g_gan_loss, 生成网络被判别网络判别为真的概率, 使用 tl.cost.softmax_cross_entropy(logits_fake, tf.ones_like(logits_fake))
第二步: 生成图像与目标图像之间的像素点差值, 使用 tl.cost.mean_squared_error()
来源: http://www.bubuko.com/infodetail-3012872.html