AI绘画火爆,以昆仑万维AIGC为例,揭秘AI绘画背后的模型算法

AI绘画火爆,以昆仑万维AIGC为例,揭秘AI绘画背后的模型算法

一、前言

最近AI绘画让人工智能再次走进大众视野。在人工智能发展早起,一直认为人工智能能实现的功能非常有限。通常都是些死板的东西,像是下棋、问答之类的,不具有创造性。那时的人们应该想不到现在的AI已经能够绘画、谱曲、作诗了。这些曾被认为是人类独有的东西,如今也被AI涉猎了。
今天我们要讨论的就是现今大火的AI绘画,我们来看看AI是不是真的有了创造力,还是只是不停的搬运。
可以实现AI绘画的模型有很多种,今天我们主要讨论Conditional GAN和Stable Diffusion两种模型。现在已经有了对应的商业版本,比如昆仑万维的AI绘图就是采用了Stable Diffusion分支模型,并取得了不菲的成绩。

二、GAN

这里我们讨论Conditional GAN(Generative Adversarial Network)实现AI的原理。在讲Conditional GAN之前,我们来看看GAN是怎么回事。

2.1 生成

生成网络一直被认为是赋予AI创造力的突破口,生成包括文本生成、图像生成、音频生成等。
GAN是一种比较成熟的生成网络,通常用来生成图像。GAN有许多变种,包括DCGAN、CycleGAN等。

2.2 专家与赝品

GAN的中文名叫生成对抗网络,在提到GAN时经常会用两个对立的角色来举例。一个是造假专家,专门负责制作赝品;另一个是鉴别专家,专门负责鉴定赝品。他们最开始都不是专家,而是在对抗中学习,最终造假专家能够制造出人都难以识别出来的赝品。最终我们会抛弃鉴别专家,让造假专家为我们服务。
上面提到的造假专家就是G网络,也就是Generator;而鉴别专家就是D网络,也就是Discriminator。它们在互相对抗中学习,最终成为各自领域的专家,这就是GAN的思想。

2.3 Generator

下面我们以生成动漫头像的例子来讨论GAN网络的Generator和Discriminator。
首先讨论Generator,它在GAN中充当造假的作用,也是用它来生成图像。Generator接收一个随机变量,这个随机变量满足一种特定的简单分布,比如高斯分布。接收输入的随机变量后,网络经过运算生成一个非常长的向量,我们可以把这个向量reshape成w×h×3,也就是彩色图像。
在这里插入图片描述
Generator的具体结构可以是多种多样的,通常是以卷积为基础的网络。比如在DCGAN中,Generator由5层反卷积组成,其网络结构如下图:

在这里插入图片描述
输入一个维度为100的向量,输出一张64×64×3的图像,其PyTorch实现如下:

class Generator(nn.Module):def __init__(self, ngpu):super(Generator, self).__init__()self.ngpu = ngpuself.main = nn.Sequential(# input is Z, going into a convolutionnn.ConvTranspose2d( nz, ngf * 8, 4, 1, 0, bias=False),nn.BatchNorm2d(ngf * 8),nn.ReLU(True),# state size. (ngf*8) x 4 x 4nn.ConvTranspose2d(ngf * 8, ngf * 4, 4, 2, 1, bias=False),nn.BatchNorm2d(ngf * 4),nn.ReLU(True),# state size. (ngf*4) x 8 x 8nn.ConvTranspose2d( ngf * 4, ngf * 2, 4, 2, 1, bias=False),nn.BatchNorm2d(ngf * 2),nn.ReLU(True),# state size. (ngf*2) x 16 x 16nn.ConvTranspose2d( ngf * 2, ngf, 4, 2, 1, bias=False),nn.BatchNorm2d(ngf),nn.ReLU(True),# state size. (ngf) x 32 x 32nn.ConvTranspose2d( ngf, nc, 4, 2, 1, bias=False),nn.Tanh()# state size. (nc) x 64 x 64)def forward(self, input):return self.main(input)

2.4 Discriminator

Discriminator是GAN中非常重要的一个角色,它是一个接受一个图片输入的网络,输入的图像会包含一部分真实图像real(我们收集的动漫图像),还会包含一部分虚假图像fake(Generator生成的图像),然后输出一个结果。这个结果可以是fake是真实图像的概率,也可以是fake的类别(0表示假,1表示真)。对于Discriminator而言,它的目的就是调整网络参数,让网络知道fake图像是假的。

在这里插入图片描述
关于Discriminator的结构,并没有非常固定的约束,通常是一个卷积网络。这里同样参考DCGAN,这里实现PyTorch的一个实现:

class Discriminator(nn.Module):def __init__(self, ngpu):super(Discriminator, self).__init__()self.ngpu = ngpuself.main = nn.Sequential(# input is (nc) x 64 x 64nn.Conv2d(nc, ndf, 4, 2, 1, bias=False),nn.LeakyReLU(0.2, inplace=True),# state size. (ndf) x 32 x 32nn.Conv2d(ndf, ndf * 2, 4, 2, 1, bias=False),nn.BatchNorm2d(ndf * 2),nn.LeakyReLU(0.2, inplace=True),# state size. (ndf*2) x 16 x 16nn.Conv2d(ndf * 2, ndf * 4, 4, 2, 1, bias=False),nn.BatchNorm2d(ndf * 4),nn.LeakyReLU(0.2, inplace=True),# state size. (ndf*4) x 8 x 8nn.Conv2d(ndf * 4, ndf * 8, 4, 2, 1, bias=False),nn.BatchNorm2d(ndf * 8),nn.LeakyReLU(0.2, inplace=True),# state size. (ndf*8) x 4 x 4nn.Conv2d(ndf * 8, 1, 4, 1, 0, bias=False),nn.Sigmoid())def forward(self, input):return self.main(input)

这里比较特别的就是LeakyReLU的使用。

2.5 GAN

有了Generator和Discriminator就可以组成GAN网络了。
最开始Generator和Discriminator是两个懵懂小孩,Generator不知道如何生成,Discriminator也不知道如何辨别。GAN网络的训练分为下面几个步骤。

  • 第一步:训练Discriminator网络,此时Generator提供的照片都是噪声,先训练Discriminator可以让 Discriminator知道如何区分真实图像和噪声
  • 第二步:固定Discriminator,训练Generator,让Generator生成的图像能够瞒过Discriminator
  • 第三步:再循环训练Discriminator-Generator,直到Generator生成的图像能够满足我们的需求
  • 第四步:用Generator生成图像
    上述步骤可以看作下图:

在这里插入图片描述
以上就是GAN网络的训练过程。其实就是Generator和Discriminator交替训练的过程,其PyTorch实现如下:

# Create the generator
netG = Generator(ngpu).to(device)
if (device.type == 'cuda') and (ngpu > 1):netG = nn.DataParallel(netG, list(range(ngpu)))
netG.apply(weights_init)# Create the Discriminator
netD = Discriminator(ngpu).to(device)if (device.type == 'cuda') and (ngpu > 1):netD = nn.DataParallel(netD, list(range(ngpu)))
netD.apply(weights_init)criterion = nn.BCELoss()fixed_noise = torch.randn(64, nz, 1, 1, device=device)
real_label = 1.
fake_label = 0.
optimizerD = optim.Adam(netD.parameters(), lr=lr, betas=(beta1, 0.999))
optimizerG = optim.Adam(netG.parameters(), lr=lr, betas=(beta1, 0.999))# Training Loop# Lists to keep track of progress
img_list = []
G_losses = []
D_losses = []
iters = 0print("Starting Training Loop...")
# For each epoch
for epoch in range(num_epochs):# For each batch in the dataloaderfor i, data in enumerate(dataloader, 0):############################# (1) Update D network: maximize log(D(x)) + log(1 - D(G(z)))############################# Train with all-real batchnetD.zero_grad()# Format batchreal_cpu = data[0].to(device)b_size = real_cpu.size(0)label = torch.full((b_size,), real_label, dtype=torch.float, device=device)# Forward pass real batch through Doutput = netD(real_cpu).view(-1)# Calculate loss on all-real batcherrD_real = criterion(output, label)# Calculate gradients for D in backward passerrD_real.backward()D_x = output.mean().item()## Train with all-fake batch# Generate batch of latent vectorsnoise = torch.randn(b_size, nz, 1, 1, device=device)# Generate fake image batch with Gfake = netG(noise)label.fill_(fake_label)# Classify all fake batch with Doutput = netD(fake.detach()).view(-1)# Calculate D's loss on the all-fake batcherrD_fake = criterion(output, label)# Calculate the gradients for this batch, accumulated (summed) with previous gradientserrD_fake.backward()D_G_z1 = output.mean().item()# Compute error of D as sum over the fake and the real batcheserrD = errD_real + errD_fake# Update DoptimizerD.step()############################# (2) Update G network: maximize log(D(G(z)))###########################netG.zero_grad()label.fill_(real_label)  # fake labels are real for generator cost# Since we just updated D, perform another forward pass of all-fake batch through Doutput = netD(fake).view(-1)# Calculate G's loss based on this outputerrG = criterion(output, label)# Calculate gradients for GerrG.backward()D_G_z2 = output.mean().item()# Update GoptimizerG.step()# Output training statsif i % 50 == 0:print('[%d/%d][%d/%d]\tLoss_D: %.4f\tLoss_G: %.4f\tD(x): %.4f\tD(G(z)): %.4f / %.4f'% (epoch, num_epochs, i, len(dataloader),errD.item(), errG.item(), D_x, D_G_z1, D_G_z2))# Save Losses for plotting laterG_losses.append(errG.item())D_losses.append(errD.item())# Check how the generator is doing by saving G's output on fixed_noiseif (iters % 500 == 0) or ((epoch == num_epochs-1) and (i == len(dataloader)-1)):with torch.no_grad():fake = netG(fixed_noise).detach().cpu()img_list.append(vutils.make_grid(fake, padding=2, normalize=True))iters += 1

经过一段时间的训练后,我们就可以生成一些动漫图像了。关于DCGAN的代码实现可以参考https://pytorch.org/tutorials/beginner/dcgan_faces_tutorial.html#sphx-glr-beginner-dcgan-faces-tutorial-py。

三、Conditional GAN

通过上面的GAN网络,我们可以生成动漫图像。但是这个生成是不可控的,我们只知道它生成的是动漫图像,至于图像内容我们无法得知。我们无法根据描述来生成图像,这个是GAN网络的局限,因此提出一种变形叫Conditional GAN,这种GAN网络可以解决上面的问题。

3.1 Generator

Conditional GAN不同于GAN的地方在于其Generator和Discriminator接收参数的数量不同。Generator在接收随机变量的同时还接收一个“思想向量”,这个思想向量可以是对句子的一个编码。此时我们的Generator的结构变成了输入两个向量,输出一个图像的网络。
在这里插入图片描述
比如上图,我们将red eyes这个句子转化成向量交给Generator,然后让它生成红眼的动漫图像。通过修改x我们可以得到不同的图像,又因为z这个随机变量的存在,我们即使给同样的x也可以得到不同的图像。

为了能让网络学习到文字和描述之间的关系,我们需要准备好(文字描述-图像)这种组合的数据集。

3.2 Discriminator

Discriminator同样需要输入两个向量,分别是Generator生成的图像和输入到Generator的x,然后输出是否正确。
在这里插入图片描述
交给Generator的训练数据需要把(正确描述-正确图像)作为类别1,把(正确描述,不正确图像)、(正确描述,正确图像,但图像和描述不匹配)作为类别0。

如果不包含(正确描述,正确图像,但图像和描述不匹配)作为训练数据,我们的网络得不到很好的结果。

知道了Generator和Discriminator网络后,我们可以使用和GAN类似的方式进行训练,最后的Generator就是我们的AI画师了。我们给它文字描述,它给我们返回一张对应的图。

四、Stable Diffusion

Stable Diffusion和Conditional GAN有很多相似的地方,因为都可以用来解决Text-to-image的问题,因此模型都是接收一个文本以及影响图像的高斯噪声。只不过使用的网络结构有所区别,而且Stable Diffusion引入了Latent Diffusion,让训练更加顺利。

Latent Diffusion包括了三个部分,分别是自编码器、U-Net、Text-Encoder。

其中自编码器包括编码器和解码器两部分。编码器的输出会交给U-Net进行处理。而U-Net得输出则会交给解码器。

U-Net在接收编码器输入的同时,还接收一个句子的向量。这个句向量由Text-Encoder给出。下图是U-Net的结构。
在这里插入图片描述
因为U-Net是在低维空间上工作的,因此Latent Diffusion快速有效。Stable Diffusion的整体流程如下图:

在这里插入图片描述

五、昆仑万维-天工巧绘体验

现在有许多现成的平台可以AI绘画,相比GAN,Stable Diffusion要更擅长绘画,这里可以用昆仑天宫的天工巧绘(SkyPaint)来进行一个简单的体验,天工巧绘SkyPaint就是采用全球第一款多语言Stable Diffusion分支模型,是国内为数不多的支持中英双语的文图生成模型。

昆仑万维AI绘画模型在模型训练过程中主要采取了如下策略:

  • 在增加中文提示词输入能力的同时兼容原版stable_diffusion的英文提示词模型,之前用户积累的英文提示词手册依然可以在模型上使用;
  • 使用1.5亿级别的平行语料优化提示词模型实现中英文对照,不仅涉及翻译任务语料,还包括了用户使用频率高的提示词中英语料,古诗词中英语料,字幕语料,百科语料,图片文字描述语料等多场景多任务的海量语料集合;
  • 训练时采用模型蒸馏方案和双语对齐方案,使用教师模型对学生模型蒸馏的同时辅以解码器语言对齐任务辅助模型训练。

在文本生成图像以及图片生成文本两种应用中,昆仑天工的天工巧绘 SkyPaint 模型均与 AI 作画领域最先进模型相当,下表对比了不同模型在 Flickr30K-CN 数据集上的性能表现。

在这里插入图片描述

下面是几个测试的例子。

  1. 戴帽子拿剑的猫
    我原本的设想是得到近似穿长靴的猫一样的图像,下面几个结果有一些穿长靴的猫的韵味

在这里插入图片描述
2. 梵高星空

其中第一个效果图和原作场景有几分相似的地方,而其余几幅画则不太一样

在这里插入图片描述
3. 阿拉斯加千年不化的雪山 一架红色直升机正在起飞

这次的描述包含很多细节,红色直升机,起飞等。从下面的结果来看AI把握了这些细节,每张图都没有太多违和感,不过细看螺旋桨还是有一些不太满意的地方。

在这里插入图片描述
大家可以自己去尝试一下AI绘图的效果。

六、总结与展望

从Conditional GAN的实现来AI绘画并不是简单的照搬,在训练Conditional GAN的时候,我们在做的时学习到图像的分布。对于一张64×64×3的8bit图,可以有12288^256种组合,而这么多组合里面只有极小一部分是我们需要的图像,而Generator网络就是把z从一个简单的分布(比如高斯分布),映射一个复杂的分布(图像的分布)。当学习到这个分布后,我们只需要从z的分布中采样一个点,就可以对应到一张图像。这就是我们Generator在做的事情。
可喜的是,基于对人工智能技术的前瞻性判断,昆仑万维从2020年开始布局AIGC领域,训练集群200张卡,投入数千万元,组建了二百余人的研发团队,2020年底至2021年4月份研发出百亿参数的中文GPT-3模型,并于2021年8月开始研发基于自有大文本模型的对话机器人,;2022年1月启动SkyMusic音乐实验室,2022年4月达到人工智能领域最优效果;2022年9月份启动编程、图像、文本方向的AIGC产品。值得一提的是,目前AI图像、AI文本、AI编程的模型已经在GitHub上开源。

官网链接,体验跳转:http://www.kunlun.com/
昆仑天工开源地址:
Github:https://github.com/SkyWorkAIGCHuggingface https://huggingface.co/SkyWork
Huggingface:https://huggingface.co/SkyWork
相关网站:
天工巧绘SkyPaint:
https://sky-paint.singularity-ai.com
天工智码SkyCode:
https://sky-code.singularity-ai.com
天工妙笔SkyText:
https://openapi.singularity-ai.com
可以相信,通过AIGC模型算法方面的技术创新和开拓,开源AIGC算法和模型社区的发展将会越来越壮大,AIGC技术在各行各业的使用和学习门槛也会逐步降低,属于AIGC的新时代将会到来。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/53293.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【zabbix】企业微信告警

本篇基于我的前两章环境续写: 1、【zabbix】docker安装zabbix、yum安装zabbix-agent 2、【zabbix】MySQL模板创建与监控 企业微信部分 一、首先得有个企业微信号 添加部门 应用管理创建应用 我的企业里面找到企业id,和上面两条一起,总共三…

服务器请求微信后台(api.weixin.qq.com)过慢处理

问题描述:服务器请求微信后台(api.weixin.qq.com)的测试结果,每次请求都需要4,5秒甚至更慢。 2016.12.16 16:31:57 start:1481877117.4148 request:https://api.weixin.qq.com/cgi-bin/message/custom/send?access_t…

转行退路?后端开发人员可选12个职业方向

部分数据来源:ChatGPT 引言 后端开发是当前互联网行业非常热门的职业之一,如果你想要开启全新的职业生涯,也可以选择其他的职业。本文将介绍一些适合后端开发人员转行的就业方向,并从就业市场和就业前景角度进行分析。 1. 区块链…

云炬Android开发笔记 7登陆注册功能开发

阅读目录1.注册UI及验证逻辑实现 1.1 布局 1.2 注册信息的验证和逻辑 2.登录UI及验证逻辑实现 2.1 布局 2.2 登录的逻辑框架 3.服务器数据简单介绍 3.1 服务器的数据 3.2 数据端访问的数据 3.3 打印信息的级别类封装 4.与基于GreenDao的数据库框架设计 4.1 添加依赖和配置 …

让 GPT-4 设计一个分布式缓存系统,它从尝试到被“逼疯”!

整理 | 屠敏 出品 | CSDN(ID:CSDNnews) 比 ChatGPT 背后 GPT-3.5 更为强大的模型 GPT-4,已在上周正式对外发布。在 OpenAI 官方发布的 GPT-4 Developer Livestream(https://www.youtube.com/watch?voutcGtbnMuQ&#…

增强型语言模型——走向通用智能的道路?!?

增强型语言模型——走向通用智能的道路?!? FesianXu 20230325 at Baidu Search Team 前言 继AlphaGo在2016年横扫了人类棋手之后,2022年末的chatGPT横空出世,再次引爆了全球对人工智能技术的热情。基于语言模型的chat…

新版nonebot,go-cqhttp搭建qq机器人保姆级教程

前言 前段时间QQ进行了更新,所以导致了非手表协议扫码登陆报错的问题,不过好在大佬已经推出rc5版本的go-cqhttp,解决了这一头疼的问题 在开始之前,我需要说明一下,本文章是针对没有经验和基础的用户,所以…

文心一言初次体验,说说感觉~

文心一言,被称为国内版ChatGPT,一直被寄予厚望。 在未出来前,网络上都是各种调侃。 甚至还用ChatGPT来调侃。 但是在发布会的时候,感觉李彦宏关于文心一言讲了很多东西。 但是吧,又感觉啥也没讲,说话底气还…

王垠的过去和现状

王垠的过去和现状 转自&#xff1a;http://blog.csdn.net/simoncoder/article/details/49803827 我曾在2006年冬季接触到王垠的三篇文章&#xff1a;《完全用Linux工作》、《写给支持和反对<完全用Linux工作>的人们》、《清华梦的粉碎--写给清华大学的退学申请》&#…

百度副总裁 AIG总负责人王海峰:决胜AI时代(财新专访实录)

12月5日&#xff0c;百度副总裁、AI技术平台体系(AIG)总负责人、兼百度研究院院长王海峰接受了财新专访。 这里是视频地址&#xff08;复制链接打开&#xff09;&#x1f447; http://video.caixin.com/2017-12-05/101180688.html 王海峰表示&#xff0c;人工智能正在成为这个…

王慧文收购国产AI框架OneFlow,为中国版ChatGPT疯狂抢人抢基建

杨净 发自 凹非寺量子位 | 公众号 QbitAI ChatGPT热潮下&#xff0c;人才已经被抢疯了。 现在&#xff0c;国内首起ChatGPT相关收购已经浮出水面。 据多方媒体消息&#xff0c;美团联创王慧文的光年之外与国产AI框架一流科技&#xff08;Oneflow&#xff09;将达成并购意向。 原…

拉开中兴帷幕 张朝阳再造搜狐

对于搜狐而言&#xff0c;如果能在媒体和视频这两条核心主线上走出一条不同的路径&#xff0c;未来持续增长当指日可期。 一点财经 刘书艳&#xff5c;作者 严 睿&#xff5c;编辑 减亏65.38%&#xff0c;营收同比增长6%&#xff0c;2020年Q1财报略超市场预期的搜狐信心满满&a…

人工智能领域研发热点回眸

本篇文章是博主在人工智能等领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对人工智能等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅解。文章分类在学习摘录和笔记专…

ChatGPT on Notes/Domino

大家好&#xff0c;才是真的好。 随着春节过去&#xff0c;小盆友也开始陆续到幼儿园报到&#xff0c;我们又回来和大家一起继续Notes/Domino传奇之旅。 去年年底ChatGPT横空出世&#xff0c;让大家震惊了一把。 可能有些老Notes/Domino人&#xff0c;还不知道ChatGPT是什么…

阿里研究员吴翰清离职,下一步或将开启 AI 短视频创业

作者 | 苏宓 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 5 月 25 日&#xff0c;据 Tech 星球报道&#xff0c;阿里巴巴集团研究员吴翰清已从阿里离职&#xff0c;接下来其将深度拥抱 AI 新时代&#xff0c;投身于 AI 短视频赛道创业。 这位被阿里程序员誉为大…

最新!OpenAI掌门人自曝GPU短缺,未来GPT-4会更快、更便宜

作者 | 金鹿 本文经授权转自公众号腾讯科技&#xff08;ID:qqtech&#xff09;&#xff0c;如需转载&#xff0c;请联系对方&#xff1a; 机器学习和人工智能初创公司Humanloop首席执行官拉扎哈比比&#xff08;Raza Habib&#xff09;&#xff0c;5月29日邀请OpenAI首席执…

汇正财经靠谱吗?大盘窄幅震荡

盘面回顾&#xff1a; 沪指全天窄幅震荡&#xff0c;大金融银行板块涨超1%&#xff0c;截止收盘沪指小涨0.07%&#xff1b;创业板全天低迷&#xff0c;锂电、光伏、风电等新能源方向领跌&#xff0c;新能源权重票下挫拖累创指&#xff0c;截止收盘创业板指跌1.39%。传媒、旅游…

2023年股票开户哪家手续费最低?融资融券利息率最低多少?万1融5!支持量化交易的券商

2023年融资融券费率最低是多少&#xff1f;利率5%&#xff0c;股票万一全佣&#xff0c;支持量化交易 股票开户费率参考&#xff1a; 1、股票佣金万1.2&#xff0c;最低万1(含规费&#xff09;&#xff0c;信用账户一致 2、场内基金&#xff08;ETF、LOF&#xff09;万0.6&…

谷歌的智能AI聊天机器人Bard已免费开放申请,赶紧加入等待列表体验一把

前言 2023年&#xff0c;真是一个Ai元年&#xff0c;随意ChatGPT的大火&#xff0c;各路网络巨头都按捺不住了&#xff0c;Google更是一度启动了红色警报&#xff0c;这是有史以来&#xff0c;谷歌感受到最大的压力&#xff0c;不过谷歌平时也并不是没有技术沉淀的&#xff0c…

如何快速看懂别人的代码

我们在写程式时&#xff0c;有不少时间都是在看别人的代码。 例如看小组的代码&#xff0c;看小组整合的守则&#xff0c;若一开始没规划怎么看&#xff0c; 就会“噜看噜苦&#xff08;台语&#xff09; ” 不管是参考也好&#xff0c;从开源抓下来研究也好&#xff0c;为…