GAN生成人脸图像

from __future__ import print_function, division
from keras.datasets import mnist
from keras.layers import Input, Dense, Reshape, Flatten, Dropout
from keras.layers import BatchNormalization, Activation, ZeroPadding2D
from keras.layers.advanced_activations import LeakyReLU
from keras.layers.convolutional import UpSampling2D, Conv2D
from keras.models import Sequential, Model
from keras.optimizers import Adam
import matplotlib.pyplot as plt
import cv2
import sys
import os
import numpy as np

获得生成图像的数据
以及部分噪声

train=[]
image='face/1.pgm'#选取第people_num个人的随机第j个图片
img=cv2.imread(image,0)
train.append(img)#读取图片并进行矢量化
Train=np.array(train)
Xtrain = Train / 127.5 - 1.
Xtrain = np.expand_dims(Train, axis=3)
Xtrain.shape
image='face/1.pgm'#选取第people_num个人的随机第j个图片
img=cv2.imread(image,0)
img=img[0:80,:]#第a+1到b行,第m+1到第n行
c,r=img.shape
Nosie=img.reshape(1,c*r)
Nosie = Nosie / 127.5 - 1.
img_shape = (112, 92, 1)#图片的尺寸
latent_dim=112*92#图片矢量化成行,作为网络的输入节点
X_train = Xtrain
        # 创建标签
valid = np.ones((1, 1))
fake = np.zeros((1, 1))
kongbai=112*92-7360

搭建判别器并完善网络:

def build_discriminator():#输入为一张图片 判别器
        # ----------------------------------- #
        #   评价器,对输入进来的图片进行评价
        # ----------------------------------- #
    model = Sequential()
        # 输入一张图片
    model.add(Flatten(input_shape=img_shape))
    model.add(Dense(512))
    model.add(LeakyReLU(alpha=0.2))
    model.add(Dense(256))
    model.add(LeakyReLU(alpha=0.2))
        # 判断真伪
    model.add(Dense(1, activation='sigmoid'))


    img = Input(shape=img_shape)
    validity = model(img)

    return Model(img, validity)
discriminator = build_discriminator()
discriminator.compile(loss='binary_crossentropy',#相当于model.compile()
    optimizer= Adam(0.0002, 0.5),
    metrics=['accuracy'])#损失函数

搭建生成器

def build_generator():##生成器,由噪声数据产生图像
        # --------------------------------- #
        #   生成器,输入一串随机数字
        # --------------------------------- #
    model = Sequential()

    model.add(Dense(256, input_dim=latent_dim))#噪声的输入尺寸为latent_dim*1
    model.add(LeakyReLU(alpha=0.2))
    model.add(BatchNormalization(momentum=0.8))

    model.add(Dense(512))
    model.add(LeakyReLU(alpha=0.2))
    model.add(BatchNormalization(momentum=0.8))

    model.add(Dense(1024))
    model.add(LeakyReLU(alpha=0.2))
    model.add(BatchNormalization(momentum=0.8))

    model.add(Dense(np.prod(img_shape), activation='tanh'))
    model.add(Reshape(img_shape))

    noise = Input(shape=(latent_dim,))
    img = model(noise)

    return Model(noise, img)
generator = build_generator()
gan_input = Input(shape=(latent_dim,))
img = generator(gan_input)#生成数据img
# 在训练generate的时候不训练discriminator
discriminator.trainable = False
        # 对生成的假图片进行预测
validity = discriminator(img)#对生成的数据判别
combined = Model(gan_input, validity)#对输入数据和生成数据的结果进行建模
combined.compile(loss='binary_crossentropy', optimizer= Adam(0.0002, 0.5))

搭建训练网络:

def train(epochs, batch_size, sample_interval):#随机选128个图片作为,每隔sample_interval个训练批次保存一次
    for epoch in range(epochs):#epochs训练次数
            # --------------------------- #
            #   随机选取batch_size个图片
            #   对判别器进行训练
            # --------------------------- #    
        imgs = Xtrain#随机寻找128张图片作为真实数据
        gan_input =np.hstack((Nosie,np.random.normal(0, 1, (1,kongbai))))#保存图像的大小??,
# 输入的噪声图片为部分原图+随机产生的数据
        gen_imgs = generator.predict(gan_input)#生成器的预测模型,生成数据1*112*92*1
        d_loss_real =discriminator.train_on_batch(Xtrain, valid)##单次训练并计算损失,真实图片的损失值
        d_loss_fake = discriminator.train_on_batch(gen_imgs, fake)#生成图片的损失值
        d_loss = 0.5 * np.add(d_loss_real, d_loss_fake)#判别器的损失值

            # --------------------------- #
            #  训练generator
            # --------------------------- #       
        g_loss =combined.train_on_batch(gan_input, valid)
        print ("%d [D loss: %f, acc.: %.2f%%] [G loss: %f]" % (epoch, d_loss[0], 100*d_loss[1], g_loss))

        if epoch % sample_interval == 0:#每隔sample_interval次循环保存依次生成的图片
            noise =np.hstack((Nosie,np.random.normal(0, 1, (1,kongbai))))#保存图像的大小??25*37360的假数据
            gen_imgs = generator.predict(noise)
            plt.imshow(gen_imgs[0, :,:,0])
            plt.savefig("images/%d.png" % epoch)#存入images文件夹中
train(epochs=20, batch_size=1, sample_interval=2)
  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值