GAN生成对抗网络-PIX2PIXGAN原理与基本实现-图像翻译09

Pix2Pix GAN是一种适用于图像翻译任务的生成对抗网络,其G部分接受图像作为输入,输出同样大小的图像。与传统GAN不同,它不使用随机向量。U-Net结构通过skip-connection来共享信息,D网络采用Patch-D策略减少计算量。此外,L1 Loss用于保持输入和输出图像的一致性。论文链接:https://phillipi.github.io/pix2pix/,并提供了数据集信息。
摘要由CSDN通过智能技术生成

什么是pix2pix Gan

在这里插入图片描述
普通的GAN接收的G部分的输入是随机向量,输出是图像
;D部分接收的输入是图像(生成的或是真实的),输出是对或
者错。这样G和D联手就能输出真实的图像。

对于图像翻译任务来说,它的G输入显然应该是一张图x,
输出当然也是一张图y。
不需要添加随机输入。

对于图像翻译这些任务来说,输入和输出之间会共享很多
的信息。比如轮廓信息是共享的。
在这里插入图片描述
如果使用普通的卷积神经网络,那么会导致每一层都承载
保存着所有的信息,这样神经网络很容易出错。
在这里插入图片描述
U-Net也是Encoder-Decoder模型,是变形的EncoderDecoder模型。
所谓的U-Net是将第i层拼接到第n-i层,这样做是因为第i层
和第n-i层的图像大小是一致的,可以认为他们承载着类似
的信息。
在这里插入图片描述
但是D的输入却应该发生一些变化,因为除了要生成真实图
像之外,还要保证生成的图像和输入图像是匹配的。
于是D的输入就做了一些变动。
D中要输入成对的图像。这类似于conditonal GAN

在这里插入图片描述
Pix2Pix中的D被论文中被实现为Patch-D,所谓Patch,是
指无论生成的图像有多大,将其切分为多个固定大小的
Patch输入进D去判断。
这样设计的好处是: D的输入变小,计算量小,训练速度快。

D网络损失函数:
输入真实的成对图像希望判定为1.
输入生成图像与原图像希望判定为0 G网络损失函数:
输入生成图像与原图像希望判定为1

对于图像翻译任务而言,G的输入和输出之间其实共享了很
多信息,比如图像上色任务,输入和输出之间就共享了边信
息。因而为了保证输入图像和输出图像之间的相似度,还加
入了L1 Loss
在这里插入图片描述
cGAN,输入为图像而不是随机向量
U-Net,使用skip-connection来共享更多的信息
Pair输入到D来保证映射
Patch-D来降低计算量提升效果
L1损失函数的加入来保证输入和输出之间的一致性.
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(论文地址: https://phillipi.github.io/pix2pix/)
所使用的版本,是原数据集的一部分。
数据集中 语义分割图 与 原始图像 一起显示在图片中。这是
用于语义分割任务的最佳数据集之一。

数据集包含 2975 张训练图片和 500 张验证图片。
每个图像文件是 256x512 像素,每张图片都是一个组合,
图像的左半部分是原始照片,
右半部分是标记图像(语义分割输出)

代码

import tensorflow as tf
import os
import glob
from matplotlib import pyplot as plt
%matplotlib inline
import time
from IPython import display
imgs_path = glob.glob(r'D:\163\gan20\pix2pix\datasets\cityscapes_data\train\*.jpg')

在这里插入图片描述

def read_jpg(path):
    img = tf.io.read_file(path)
    img = tf.image.decode_jpeg(img, channels=3)
    return img
def normalize(input_image, input_mask):
    input_image = tf.cast(input_image, tf.float32)/127.5 - 1
    input_mask = tf.cast(input_mask, tf.float32)/127.5 - 1
    return input_image, input_mask
def load_image(image_path):
    image = read_jpg(image_path)
    w = tf.shape(image)[1]
    w = w // 2
    input_image = image[:, :w, :]
    input_mask = image[:, w:, :]
    input_image = tf.image.resize(input_image, (64, 64))
    input_mask = tf.image.resize(input_mask, (64, 64))
    
    if tf.random.uniform(()) > 0.5:
        input_image = tf.image.flip_left_right(input_image)
        input_mask = tf.image.flip_left_right(input_mask)

    input_image, input_mask = normalize(input_image, input_mask)

    return input_mask, input_image
dataset = tf.data.Dataset.from_tensor_slices(imgs_path)
train = dataset.map(load_image, num_parallel_calls=tf.data.experimental.AUTOTUNE)

在这里插入图片描述

BATCH_SIZE = 8
BUFFER_SIZE = 100
train_dataset = train.shuffle(BUFFER_SIZE).batch(BATCH_SIZE)
train_dataset = train_dataset.prefetch(buffer_size=tf.data.experimental.AUTOTUNE)
plt.figure(figsize=(5, 2))
for img, musk in
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值