#教计算机学画卡通人物#生成式对抗神经网络GAN原理、Tensorflow搭建网络生成卡通人脸

生成式对抗神经网络GAN原理、Tensorflow搭建网络生成卡通人脸

下面这张图是我教计算机学画画,计算机学会之后画出来的,具体实现在下面。
在这里插入图片描述
▲以下是对GAN形象化地表述
●赵某不务正业、游手好闲,却整天做着发财梦。有一天,他突发奇想,准备用造假币来实现他的“梦想”。第一次,他造了一张假币,去超市买东西,但是由于第一次造假币,手法比较粗糙,一下就被收银员识破。于是,他改进了技术,又一次造出了假币,这次收银员并没有马上发现这是假币,不料却被验钞机检验了出来。赵某不甘心,这次斥巨资购买了“专业设备”,果然,这次不仅骗过了收银员,连验钞机也没有检测出来。
●在上面的例子中,赵某不断和收银员和验钞机在技术上对抗,最终的结果是赵某愈挫愈勇,最后达到以假乱真的效果,实际上GAN就是这么一个过程。这里面有两个核心内容:*1.*赵某造假币,2.假币不断和真币比较,接受检验。
●在GAN中,1赵某造假币就是生成器(Generator,2假币不断和真币比较,接受检验就是判别器(Discriminator,生成器和判别器两者相互博弈。

GAN原理
●GAN的主要灵感来源于博弈论中零和博弈的思想,应用到深度学习神经网络上来说,通过生成器G(Generator)和判别器D(Discriminator)不断博弈,从而使G学习到真实的数据分布,如果用到图片生成上,则训练完成后,G可以从一组随机数中生成逼真的图像。
在这里插入图片描述
●包含一个生成模型 G和一个判别模型D,对于判别模型来说,就是要把上面的真实图像判别为1,把下面的生成模型判别为0;但是对于生成模型来说,就是要把生产的分布判别为1,这样才能学习;由此产生了一个生成模型和判别模型的博弈。
在这里插入图片描述
训练过程示意图
在这里插入图片描述
生成模型G:将一个随机变量z映射到数据空间,最小化log(1-D(G(x)))
判别模型D:最大化分配给训练数据x和生成数据G(z)正确标签的概率。
GAN所建立的一个学习框架,实际上就是生成模型和判别模型之间的一个模仿游戏。生成模型的目的就是要尽量模仿和学习真实数据的分布;判别模型的目的就是判断自己得到的一个输入数据究竟是来自真实的数据分布还是一个生成模型。
在这里插入图片描述
●损失函数的构造思路
对于生成器来说,他认为生成模型的标签label=1,因为真实数据标签label=1,这样才能学习;对于判别模型来说,它认为生成器生成的数据标签label=0,真实数据的标签label=1;
生成器认为生成数据label=1,或者趋于1;
判别器认为生成数据label=0,或者趋于0;
这就生成了对抗,到最后生成数据很优秀时,两者可能都是0.5。
loss=label-out,学习好后,就不需要判别器了,直接用生成器。

●激活函数选择
D网络除了最后一层输出不激活,其他用Relu激活
G网络最后一层用sigmoid激活,之前层用Relu激活
标准差stddev=0.01

▲变种之DCGAN
●DCGAN是继GAN 之后较好的改进,其改进主要是在网络结构上,到目前为止,DCGAN的网络结构还是被广泛应用,DCGAN极大地提升了GAN的训练稳定度和生成结果的质量。
在这里插入图片描述
●DCGAN的生成器网络结构如图所示,相较于GAN,DCGAN几乎全部使用了卷积层代替全连接层,判别器几乎是和生成器对称的,从上图可以看出,G网络没有Pooling层,使用了转置卷积(Conv2d_transpose)并且步长大于等于2进行上采样。
●DCGAN网络结构设计要点
1.在D网络中用strided卷积(strided>1)代替pooling层,在G网络中,Conv2d_transpose代替上采样层;
2.G和D网络中直接将batch_normallization(归一化)应用到所有层会导致样本震荡和模型不稳定,通过在generator输出层和discriminator输入层不采用batch_normallization可以防止这种现象;
3.G网络除了输入层用tanh,其他都用Relu激活;
4.D网络都只用LeakyRelu;
5.不适用全连接层作为输出;
●DCGAN训练细节
1.预处理环节,将图像scale到tanh的[-1,1];
2.所有参数初始化由(0,0.02)的正态分布中随机得到;
3.leakyRelu的斜率为0.2(默认);
4.优化器使用预先调好超参的Adam optimizer;
5.learning rate = 0.0002(Adam优化器的参数);
6.Adamoptimizer(0.0002,betal=0.5);
7.将momentum的参数beta从0.9降到0.5来防止震荡和不稳定;
8.用5×5的卷积核尽可能多的取数据;

▲用Tensorflow框架搭建DCGAN生成卡通人脸
这是卡通人脸数据集
在这里插入图片描述
●首先写一个图片采样程序,每次拿100张图片

import matplotlib.image as implt
import PIL.Image as pimg
import numpy as np
import os
image_path=r"F:\study\20191203_DCGAN_Cartoon_Face\face\faces"
# image_savepath=r"F:\study\20191203_DCGAN_Cartoon_Face\face\faces_save"
class MyDataset:
    def __init__(self):
        self.image_data=[]
        for filename in os.listdir(image_path):
            # img=pimg.open("{0}\{1}".format(image_path,filename))
            img=implt.imread(os.path.join(image_path,filename))
            # self.img=np.array(img)/255
            self.image_data.append(img)
    def get_batch(self,size):
        xs=[]
        for _ in range(size):
            index=np.random.randint(0,len(self.image_data))
            xs.append(self.image_data[index])
        xs=(np.array(xs)/255-0.5)*2
        # print(xs)
        return xs
if __name__ == '__main__':
    mydatdset=MyDataset()
    x=mydatdset.get_batch(100)
    # x=(x/2+0.5)*255
    # x=pimg.fromarray(np.uint8(x))
    # x.save(image_savepath)



●然后写DCGAN网络

下面是所有完整程序

import tensorflow as tf
import PIL.Image as pimg
import matplotlib.pyplot as plt
import numpy as np
from Samping import MyDataset
class D_net:
    def __init__(self):
        self.w1=tf.Variable(tf.truncated_normal(shape=[5,5,3,64],stddev=0.02,dtype=tf.float32))
        self.b1=tf.Variable(tf.zeros(shape=[64],dtype=tf.float32))
        self.w2 = tf.Variable(tf.truncated_normal(shape=[5, 5, 64, 128], stddev=0.02, dtype=tf.float32))
        self.b2 = tf
### 如何在计算机图形学中实现渐变色效果 在计算机图形学中,实现渐变色效果通常涉及多个方面和技术。对于二维和三维图形来说,具体的方法有所不同。 #### 1. 基础原理 为了理解如何实现渐变色,首先要明白色彩是如何在计算机中表示的。颜色一般由红(Red)、绿(Green)、蓝(Blue)三个分量组成,即RGB模式。每个分量可以是一个0到255之间的整数或者一个0到1之间的小数值[^1]。 #### 2. 二维图形中的线性渐变 在线段或矩形这样的简单形状上应用线性渐变可以通过插值来完成。假设有一个水平方向上的线性渐变,那么可以根据像素位置计算出相应的颜色比例因子k=(x-xmin)/(xmax-xmin),其中xmin,xmax分别是起始端点的位置坐标。接着利用此比例因子对两端的颜色进行混合得到中间各点的颜色: ```cpp Color interpolateColors(const Color& start, const Color& end, float t){ return { (int)(start.r * (1-t) + end.r*t), (int)(start.g * (1-t) + end.g*t), (int)(start.b * (1-t) + end.b*t) }; } ``` 这段代码实现了两个给定颜色间的线性插值操作[^3]。 #### 3. 三角形内的平滑着色(Gouraud Shading) 当涉及到更复杂的多边形时,比如三角形内部的颜色过渡,则需要用到不同的技术——Gouraud shading就是其中之一。该方法首先为每一个顶点指定一种颜色,之后沿着边缘按照距离加权平均的方式分配颜色值直到对面相交处相遇为止。这样做的好处是可以获得较为自然的效果而不需要额外增加太多计算成本[^2]。 #### 4. 使用重心坐标法绘制带颜色变化的对象 另一种常用的技术是基于重心坐标的算法,它特别适合用于处理像正六面体这类封闭表面物体的颜色渐变问题。通过定义各个顶点的颜色属性,并依据当前测试点相对于这三个顶点所形成的面积比来进行权重分配从而决定最终呈现出来的色调[^4]。 ```python def barycentric_coords(p, a, b, c): v0 = [b[i]-a[i] for i in range(len(a))] v1 = [c[i]-a[i] for i in range(len(a))] v2 = [p[i]-a[i] for i in range(len(a))] d00 = sum([v0[i]*v0[i] for i in range(len(v0))]) d01 = sum([v0[i]*v1[i] for i in range(len(v0))]) d11 = sum([v1[i]*v1[i] for i in range(len(v1))]) d20 = sum([v2[i]*v0[i] for i in range(len(v2))]) d21 = sum([v2[i]*v1[i] for i in range(len(v2))]) denom = d00*d11-d01*d01 u = (d11*d20-d01*d21)/denom v = (d00*d21-d01*d20)/denom w = 1-u-v return u,v,w ``` 上述Python函数用来求解任意一点P关于已知三点A,B,C构成三角形ABC内对应的比例系数u,v,w,进而可用于确定位于该区域内任一位置的颜色组合方式。 #### 5. 利用现代GPU加速渲染流程 借助于当今强大的图形处理器及其支持的语言如GLSL编写自定义着色器程序能够极大地提升效率并创造出更加丰富的视觉体验。例如,在OpenGL ES框架下,开发者可以直接操控顶点着色器(Vertex Shader)与片段着色器(Fragment Shader),前者负责设定每帧画面里所有可见几何实体的空间变换关系及初步赋色工作;后者则进一步细化至单个象素层面,精确控制其最终呈现出的具体外观特征。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值