Pix2pix项目(Keras)环境配置步骤指导说明

前言

本文章记录了本人在深度学习课程大作业过程中,整个环境的配置过程步骤。

我的项目名称是《基于Pix2pix的建筑标签图像翻译》:

基于深度学习框架Keras,实现Pix2pix图像生成对抗网络,以实现通过建筑语义标签图(以及带建筑的街道语义标签图)生成对应的“真实”建筑图像。

玖涯博客

实验环境

  • Windows10
  • Anaconda3-2020.02-Windows-x86_64
  • Pycharm 2019.2.4
  • Python 3.6.5
  • Tensorflow-gpu 1.12.0
  • Keras 2.2.4
  • Tensorboard 1.12.2
  • Pydot-ng 2.0.0 + pydotplus 2.0.2

环境搭建步骤

一、下载Anaconda并安装

  1. 在浏览器中输入 https://www.anaconda.com/distribution/ ,需要选择Windows环境下的Python3.7版本,点击图中适合自己的版本,进行下载。
    玖涯博客
  2. 下载好软件后,双击安装软件
    ①注意软件名称及版本
    玖涯博客②如出现windows10自带提示,均选择坚持运行(Run)
    玖涯博客③一步一步进行安装
    玖涯博客
    玖涯博客
    玖涯博客
    玖涯博客④注意一定要勾选这两个选项(注意:在选择安装文件夹时,所安装的完

    整路径中都不能有文件夹名称有空格或包含中文字符)
    玖涯博客点击install即可安装
  3. 配置环境变量
    将自己的Python环境变量添加到path下:
    玖涯博客
    玖涯博客
  4. 测试Python的安装情况
    同时按下电脑 Windows+R 键打开运行窗口,输入 cmd,点击确定。在命令行中键入Python,然后回车,会出现如图的显示:
    玖涯博客
  5. 安装完毕后,可以在开始菜单中看到如下图标
    玖涯博客

二、下载Pycharm并安装

  1. 访问官网 https://www.jetbrains.com/pycharm/download/ ,点击图中适合自己的版本,进行下载。下载完成后,选择安装包进行安装:
    玖涯博客
  2. 选择安装目录:
    玖涯博客
    玖涯博客
  3. 一路确定,完成安装:
    玖涯博客
    玖涯博客
  4. 激活Pycharm:
    登录官网申请学生账户(使用学校的学生邮箱申请):
    玖涯博客账户申请成功并通过验证之后,打开pycharm,在help -> register中输入用户名密码:
    玖涯博客最终激活成功如下:
    玖涯博客

三、在Pycharm中配置Anaconda环境

  1. 进入PyCharm,依次点击File-> Setting->Project Interpreter:
    玖涯博客
  2. 点击齿轮选择Add Local,点击第三个选项卡,将路径选为anaconda安装路径下的python.exe,确定后成功配置anaconda环境:
    玖涯博客
  3. 之后,在该环境下创建的工程就可以使用anaconda中已有的库了。

四、安装GPU的Tensorflow和Keras

因为在图像处理的神经网络上gpu和cpu速度差别很大。因此,安装gpu版本的tensorflow和keras。tensorflow-gpu是tensorflow的gpu版本,它必须通过 cuda 和 cudnn 来调用电脑的 gpu。

  1. 确认自身电脑的显卡所对应支持的 CUDA:
    我的电脑上的显卡GPU为NVIDA GeForce GTX 1050
    玖涯博客
    https://developer.nvidia.com/cuda-gpus网站确认该型号是否支持CUDA:
    玖涯博客可以看到我的显卡型号是支持的。
  2. 到NVIDA官方网站https://developer.nvidia.com/cuda-90-download-archive?tdsourcetag=s_pctim_aiomsg 下载安装 CUDA Toolkit 9.0
    玖涯博客打开下载好的安装包,一路确定进行安装:
    玖涯博客安装成功之后,输入以下命令检查:
    玖涯博客
  3. https://developer.nvidia.com/cudnn 下载 cuDNN v7.6.5,并解压到目录,把对应的目录地址添加到path环境变量
    玖涯博客下载cuDNN,需要先注册一个NVIDA的账号。点击Join now,注册账号,在邮箱中完成验证。
    玖涯博客然后再到
    https://www.tensorflow.org/install/source_windows 查找CUDA对应版本的cuDNN:
    玖涯博客由于我的python版本是3.6.5,并且CUDA版本是9.0,因此综合考虑我选择安装红框的组合版本,即安装7.x.x版本的cuDNN。

    登录账号,下载cuDNN的安装包。
    玖涯博客
    玖涯博客解压安装后,将安装地址添加到环境变量:
    玖涯博客
  4. 安装对应的 tensorflow GPU版本和keras版本:
    确定对应CUDA和cuDNN版本的GPU版的tensorflow:
    玖涯博客安装1.12.0版本的tensorflow-gpu:
    pip install tensorflow_gpu==1.12.0
    玖涯博客确定对应tensorflow-gpu版本的Keras版本:
    玖涯博客安装2.2.4版本的Keras:
    pip install keras==2.2.4
    玖涯博客
  5. 安装完成后,使用命令查看所有设备:
    from tensorflow.python.client import device_lib
    print(device_lib.list_local_devices())
    玖涯博客
  6. 使用GPU进行训练可以看到每一个epoch的训练速度快了很多:
    玖涯博客

五、安装Tensorboard

TensorBoard是TensorFlow下的一个可视化的工具,能在训练大规模神经网络时将复杂的运算过程可视化。TensorBoard能展示你训练过程中绘制的图像、网络结构等。
考虑到实验训练过程中,我使用的是以Tensorflow为后端的Keras,因此按照道理也可以使用Tensorboard来实现。

  1. 使用pip安装1.12.2版本的tensorboard:
    输入pip install tensorboard==1.12.2命令以安装
    玖涯博客
  2. 启动tensorboard:
    执行tensorboard --logdir=D:\ideaWorkPlace\Pycharm\pix2pix\boardLog,再访问localhost:6006
    玖涯博客
    玖涯博客
  3. 如果启动报错ImportError: cannot import name '_message' from 'google.protobuf.pyext',如下所示:
    玖涯博客原因在于protobuf安装的是较新版本3.10.1, 出现了不兼容的问题。把protobuf进行降级,从3.10.1降级到3.6.1,再重新启动即可。

六、安装pydot和graphviz——keras可视化

Keras支持将模型的结构图进行输出,从而实现整个模型以及各层结构的可视化。
运行项目中keras.utils的plot_model功能,需要安装官网上说的两个依赖包:pydot和graphviz。

  1. pip install pydot-ng
    玖涯博客
  2. pip install graphviz
    玖涯博客
  3. pip install pydotplus
    玖涯博客注意这里,之前我安装的是pydot,但会出现如下的错误:
    玖涯博客
    原因是python3.5和3.6以上版本不再支持Graphviz,因此需要卸载pydot,安装pydotplus。
  4. 找到keras里面的utils\vis_utils.py,把里面的pydot的都替换成pydotplus
    玖涯博客
  5. 安装Graphviz软件
    到官网下载graphviz的安装包(可选择msi格式):
    玖涯博客安装.msi安装包,并一直next确认:
    玖涯博客
    玖涯博客将安装的客户端配置一下环境变量:
    玖涯博客测试Graphviz是否安装成功:在cmd中输入
    dot -version并回车,若显示出graphviz的相关版本信息,则安装配置成功。
    玖涯博客
  6. 通过models.py文件中的如下代码进行测试:
    # 加载U-Net generator(decoder由upsampling上采样实现)
    if model_name == "generator_unet_upsampling":
    model = generator_unet_upsampling(img_dim, bn_mode, model_name=model_name)
    model.summary()
    if do_plot: # 用plot_model函数将模型的形状保存为图片
    from keras.utils import plot_model
    plot_model(model, to_file="../../figures/%s.png" % model_name, show_shapes=True, show_layer_names=True)
    return model
    玖涯博客
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
pix2pix算法是一种图像翻译(image-to-image translation)算法,其主要作用是将一种图像转换为另一种图像,例如将黑白线条图转换为彩色图。 以下是一个基于TensorFlow实现的pix2pix算法的简单代码示例: ```python import tensorflow as tf import numpy as np import matplotlib.pyplot as plt # 定义生成器模型 def generator_model(): inputs = tf.keras.layers.Input(shape=[256,256,3]) conv1 = tf.keras.layers.Conv2D(64, [4,4], strides=[2,2], padding='same', activation='relu')(inputs) conv2 = tf.keras.layers.Conv2D(128, [4,4], strides=[2,2], padding='same', activation='relu', use_bias=False)(conv1) norm2 = tf.keras.layers.BatchNormalization()(conv2) conv3 = tf.keras.layers.Conv2D(256, [4,4], strides=[2,2], padding='same', activation='relu', use_bias=False)(norm2) norm3 = tf.keras.layers.BatchNormalization()(conv3) conv4 = tf.keras.layers.Conv2D(512, [4,4], strides=[2,2], padding='same', activation='relu', use_bias=False)(norm3) norm4 = tf.keras.layers.BatchNormalization()(conv4) conv5 = tf.keras.layers.Conv2D(512, [4,4], strides=[2,2], padding='same', activation='relu', use_bias=False)(norm4) norm5 = tf.keras.layers.BatchNormalization()(conv5) conv6 = tf.keras.layers.Conv2D(512, [4,4], strides=[2,2], padding='same', activation='relu', use_bias=False)(norm5) norm6 = tf.keras.layers.BatchNormalization()(conv6) conv7 = tf.keras.layers.Conv2D(512, [4,4], strides=[2,2], padding='same', activation='relu', use_bias=False)(norm6) norm7 = tf.keras.layers.BatchNormalization()(conv7) conv8 = tf.keras.layers.Conv2DTranspose(512, [4,4], strides=[2,2], padding='same', activation='relu', use_bias=False)(norm7) norm8 = tf.keras.layers.BatchNormalization()(conv8) drop8 = tf.keras.layers.Dropout(0.5)(norm8) conv9 = tf.keras.layers.Conv2DTranspose(512, [4,4], strides=[2,2], padding='same', activation='relu', use_bias=False)(drop8) norm9 = tf.keras.layers.BatchNormalization()(conv9) drop9 = tf.keras.layers.Dropout(0.5)(norm9) conv10 = tf.keras.layers.Conv2DTranspose(512, [4,4], strides=[2,2], padding='same', activation='relu', use_bias=False)(drop9) norm10 = tf.keras.layers.BatchNormalization()(conv10) drop10 = tf.keras.layers.Dropout(0.5)(norm10) conv11 = tf.keras.layers.Conv2DTranspose(256, [4,4], strides=[2,2], padding='same', activation='relu', use_bias=False)(drop10) norm11 = tf.keras.layers.BatchNormalization()(conv11) conv12 = tf.keras.layers.Conv2DTranspose(128, [4,4], strides=[2,2], padding='same', activation='relu', use_bias=False)(norm11) norm12 = tf.keras.layers.BatchNormalization()(conv12) conv13 = tf.keras.layers.Conv2DTranspose(64, [4,4], strides=[2,2], padding='same', activation='relu', use_bias=False)(norm12) norm13 = tf.keras.layers.BatchNormalization()(conv13) conv14 = tf.keras.layers.Conv2DTranspose(3, [4,4], strides=[2,2], padding='same', activation='tanh')(norm13) return tf.keras.models.Model(inputs=inputs, outputs=conv14) # 定义判别器模型 def discriminator_model(): inputs = tf.keras.layers.Input(shape=[256,256,6]) conv1 = tf.keras.layers.Conv2D(64, [4,4], strides=[2,2], padding='same', activation='relu')(inputs) conv2 = tf.keras.layers.Conv2D(128, [4,4], strides=[2,2], padding='same', activation='relu', use_bias=False)(conv1) norm2 = tf.keras.layers.BatchNormalization()(conv2) conv3 = tf.keras.layers.Conv2D(256, [4,4], strides=[2,2], padding='same', activation='relu', use_bias=False)(norm2) norm3 = tf.keras.layers.BatchNormalization()(conv3) conv4 = tf.keras.layers.Conv2D(512, [4,4], strides=[2,2], padding='same', activation='relu', use_bias=False)(norm3) norm4 = tf.keras.layers.BatchNormalization()(conv4) outputs = tf.keras.layers.Conv2D(1, [4,4], strides=[1,1], padding='same')(norm4) return tf.keras.models.Model(inputs=inputs, outputs=outputs) # 定义损失函数 def generator_loss(disc_generated_output, gen_output, target): gan_loss = tf.keras.losses.BinaryCrossentropy(from_logits=True)(tf.ones_like(disc_generated_output), disc_generated_output) l1_loss = tf.reduce_mean(tf.abs(target - gen_output)) total_gen_loss = gan_loss + (100 * l1_loss) return total_gen_loss def discriminator_loss(disc_real_output, disc_generated_output): real_loss = tf.keras.losses.BinaryCrossentropy(from_logits=True)(tf.ones_like(disc_real_output), disc_real_output) generated_loss = tf.keras.losses.BinaryCrossentropy(from_logits=True)(tf.zeros_like(disc_generated_output), disc_generated_output) total_disc_loss = real_loss + generated_loss return total_disc_loss # 定义优化器 generator_optimizer = tf.keras.optimizers.Adam(2e-4, beta_1=0.5) discriminator_optimizer = tf.keras.optimizers.Adam(2e-4, beta_1=0.5) # 定义训练循环 @tf.function def train_step(input_image, target): with tf.GradientTape() as gen_tape, tf.GradientTape() as disc_tape: # 生成器生成一张假图像 gen_output = generator(input_image, training=True) # 将真实图像和假图像合并 disc_input = tf.concat([input_image, gen_output], axis=-1) # 判别器判别真实图像和假图像 disc_real_output = discriminator([input_image, target], training=True) disc_generated_output = discriminator([input_image, gen_output], training=True) # 计算生成器和判别器的损失函数 gen_loss = generator_loss(disc_generated_output, gen_output, target) disc_loss = discriminator_loss(disc_real_output, disc_generated_output) # 计算生成器和判别器的梯度并更新模型参数 gradients_of_generator = gen_tape.gradient(gen_loss, generator.trainable_variables) gradients_of_discriminator = disc_tape.gradient(disc_loss, discriminator.trainable_variables) generator_optimizer.apply_gradients(zip(gradients_of_generator, generator.trainable_variables)) discriminator_optimizer.apply_gradients(zip(gradients_of_discriminator, discriminator.trainable_variables)) # 加载数据集 def load_images(path): images = [] for image_path in sorted(tf.io.gfile.glob(path)): image = tf.io.read_file(image_path) image = tf.image.decode_jpeg(image) image = tf.cast(image, tf.float32) image = (image / 127.5) - 1 images.append(image) return images # 定义训练参数 BUFFER_SIZE = 400 BATCH_SIZE = 1 EPOCHS = 200 PATH = './datasets/facades' # 加载数据集 input_images = load_images(PATH+'/train/*.jpg') target_images = load_images(PATH+'/train/*.png') # 将数据集打包在一起 train_dataset = tf.data.Dataset.from_tensor_slices((input_images, target_images)).shuffle(BUFFER_SIZE).batch(BATCH_SIZE) # 定义生成器和判别器 generator = generator_model() discriminator = discriminator_model() # 训练模型 for epoch in range(EPOCHS): print('Epoch', epoch+1) for input_image, target in train_dataset: train_step(input_image, target) if (epoch+1) % 10 == 0: # 取一张测试图像进行测试 test_input = input_images[0] test_target = target_images[0] test_input = tf.expand_dims(test_input, 0) test_target = tf.expand_dims(test_target, 0) # 生成一张假图像 test_prediction = generator(test_input, training=True) # 将图像还原到0到1之间 test_prediction = (test_prediction + 1) / 2.0 test_target = (test_target + 1) / 2.0 # 显示结果 plt.figure(figsize=(15,15)) display_list = [test_input[0], test_target[0], test_prediction[0]] title = ['Input Image', 'Ground Truth', 'Predicted Image'] for i in range(3): plt.subplot(1, 3, i+1) plt.title(title[i]) # 获取图像像素值 plt.imshow(display_list[i]) # 隐藏坐标轴 plt.axis('off') plt.show() ``` 在这个示例中,我们定义了一个生成器模型和一个判别器模型,并分别使用二元交叉熵损失函数和Adam优化器进行训练。在训练过程中,我们将图像分别输入到生成器和判别器进行训练,并计算生成器和判别器的损失函数。最后,我们使用matplotlib库将训练过程中的结果可视化展示出来。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值