首页 > 其他分享 >这篇深入浅出贴 助你早日实现Stable diffusion自由

这篇深入浅出贴 助你早日实现Stable diffusion自由

时间:2024-02-05 12:02:16浏览次数:19  
标签:diffusion ControlNet AI 模型 深入浅出 生成 图像 Stable 图片

我也不想标题党,可它们就是好萌啊!看看下面这些你认识多少?

这篇深入浅出贴 助你早日实现Stable diffusion自由_参数设置

我是憨憨,一个不会画画的设计师。过去半年里,AI绘画曾经多次引爆公众讨论,网络上那些精致的二次元同人插画、堪比真人的AI穿搭博主、打破次元壁的赛博Coser……背后都有一个“幕后黑手” —— Stable Diffusion,其背后的技术便是人们常说的扩散模型(扩散模型这个概念源自热力学,在图像生成问题中得以应用)。

想知道上面这些精致的插画是如何实现的吗?接下来,我将结合这个案例带你走进 Stable Diffusion 的世界,帮你系统性地了解并掌握这神奇AI绘画魔法。

这篇深入浅出贴 助你早日实现Stable diffusion自由_UI_02

这篇深入浅出贴 助你早日实现Stable diffusion自由_参数设置_03

虽然我们把这个过程称之为AI绘画,但实际上它并不是像人类画图一样打草稿、构线描边,再去上色、对细节加工……这样按部就班地去完成一幅画作的,它采取了一个人类不曾设想的路径 —— Diffusion(扩散)。

一、Diffusion:眼一闭一睁,一张图画好了

有一个非常形象的方式,来解释 Diffusion 的原理。

这是我家的傻狗,你可以将自己的角色带入到执行绘画指令的AI中,现在让你把这幅画用宫崎骏风格重新绘制一遍,你做得到吗?你可以尝试着把眼睛眯成一条缝去看它(如果你近视可以摘掉自己的眼镜),它是不是变得模糊了?保持这个状态,想象着它正在逐渐变成动漫里的样子,随后慢慢睁开眼睛……

这篇深入浅出贴 助你早日实现Stable diffusion自由_UI_04

这就是一个扩散模型工作的基本流程了。

在这个过程中,AI会将图片通过增加噪声的方式进行“扩散”,使它变得模糊,就像是眯起眼睛的你一样,当内容模糊了以后,你就有更充分的空间去从它原本的形态抽离,并且想象它是否能变成其他模样。AI通过深度学习的方式,将很多不同的图像都转换成了这样的抽象内容,并逐渐开始理解了这个“扩散”的过程,每学一张图,它就会通过一些方式提取图像里的信息特征,并和它的原图建立关联。

在刚才的例子中,当提到宫崎骏风格的时候,你的脑海里肯定也会跳出跟这类作品相关的风格特质来,因为你看过并且记得,这个时候,我们开始去想象它变成动画片里的样子,并且用一个动漫的方式“睁开眼睛”,让图片恢复清晰,这就是在对图像进行逆向的扩散,也就是去噪。这幅画,就已经被你脑海里关于宫崎骏的想象重新绘制一遍了。

这篇深入浅出贴 助你早日实现Stable diffusion自由_UI_05

这一原理,为我们在AI绘画中的操作提供了理论基础和指导思想。当然,这只是一个简单的比喻,在真实的AI图像生成过程中要远复杂得多,我们只需要知道,在SD里面我们能接触到的各种提示词、模型、controlNet 等,其实控制的都只是AI的学习、转化、去噪过程,而非它一笔一画的动作。

二、一副AI绘画作品 = 提示词 + 参数设置 + 模型

这是 Stable Diffusion webUI,我们所有的操作都是在这里完成的。webUI其实只是一个执行的程序,用来屏蔽掉 Stable Diffusion 复杂的模型和代码操作。当你在浏览器里打开了这个webUI以后,就可以利用它开始作画了。

这篇深入浅出贴 助你早日实现Stable diffusion自由_重绘_06

WebUI 上面一整排标签栏对应了不同的功能,做图最常用的是前两个:文生图与图生图,它代表的是两种绘制的基本方式,第三个标签的更多主要用于对图片进行AI放大处理,它可以让你生成更清晰的大图。

看过《哈利波特》的影迷一定会记得,在霍格沃滋的魔法世界里,一个魔咒想要成功施展,不仅需要集中精神念对咒语,还需要一根魔杖,以及正确地挥动魔杖的手势,任何一个步骤出现错误,都有可能导致魔咒发动的失败,极端情况甚至会被反噬,在AI绘画的魔法世界里也是类似。

这篇深入浅出贴 助你早日实现Stable diffusion自由_UI_07

1、提示词:指挥AI作图的咒语

WebUI 中被我们输入进去的描述文字或图像信息,就是 Prompts (提示词):用于生成图像的文字输入,需要使用英文输入,但你也可以通过探索 Extensions 来实现中文输入。提示词的涵盖范围很广,可以包括:主体、风格、颜色、质感特点等一些具体要素。

这篇深入浅出贴 助你早日实现Stable diffusion自由_参数设置_08

提示词分成两部分,一部分是正向的提示词,另一部分是反向提示词,分别用来控制你想要在画面里出现的、想排除在外的内容。

AI 生成出来的东西是具有随机性的,每次生成出来的东西都会不太一样,这个过程就像是在“抽卡”:想出好的图片,得靠运气来抽。 比如:一个女孩在林中漫步,这其实只是一个非常概括的描述,这个女孩长什么样子、森林里有什么、时间是早上还是晚上、天气如何……这些AI都不知道,提示词太过于笼统,那AI就只能瞎蒙、抽卡了。我们可以把自己想象成一个无情的甲方,向AI沟通你的需求、AI需要改进的地方。我们对AI提的要求其实就是提示词 Prompts ,如果AI没有达到想要的效果,就不断补充、说明,多试几次总有一次可以抽到想要的效果~

虽说AI是人工智能,但它和人类智慧还是有一定差距的,有时候你会发现即使提示词已经给了很多,自己依然很难向AI表达清楚自己的需求。其实在现实生活里,这种对于需求的传递偏差与错误解读其实也普遍存在着,比如:总是干架的产品经理和程序员、甲方客户与设计师。拿我熟悉的设计举例,假如你是需求方,除了不断对着设计师一遍又一遍的咆哮需求以外,还有什么办法让他快速开窍呢?

这篇深入浅出贴 助你早日实现Stable diffusion自由_参数设置_09

你可以拿着一张海报或者banner,告诉设计师我想要的感觉是这样的,那他就会更直观、具体的感受到你的想法。AI绘画也是一样,当你觉得提示词不足以表达你的想法,或者希望以一个更为简单清晰的方式传递一些要求的时候,那就再丢一张图片给他就好了。此时,图片的作用和文字是相当的,就是都作为一种信息输送到AI那里,让它拿来生成一张新的图片,这就是图生图。

2、参数设置:控制咒语施放的魔杖

这部分内容介绍一下在AI绘画过程中,webUI里面这些复杂的参数设置。

这篇深入浅出贴 助你早日实现Stable diffusion自由_参数设置_10

(1)采样算法(Sampler) 简单来说,通过这些采样算法,噪声图像可以逐渐变得更清晰。webUI提供的算法选项非常多,包括 Euler a、DPM、DDIM 等。我分享几个我们经常会用到的:

•想使用快速、新颖且质量不错的算法,可以尝试 DPM++ 2M Karras,设置 20~30 步;

•想要高质量的图像,那么可以考虑使用 DPM++ SDE Karras,设置 10~15 步(计算较慢的采样器)、或者使用 DDIM 求解器,设置 10~15 步;

•喜欢稳定、可重现的图像,请避免使用任何原始采样器(SDE 类采样器);

•Euler、Euler a 比较适合插画风格,出图比较朴素;

(2)采样迭代步数(Steps) 与采样算法配合使用,表示生成图像的步数。步数越大,需要等待的时间越长。通常 20-30 步就足够了。默认的采样步数一般都是20。如果你的算力充足且想追求更高的细致度,就设置为30-40,最低不要低于10,不然你可能会被你自己产出的作品吓到。

(3)面部修复 在画人物的时候需要勾选上,他可以改善细节、纠正不准确的特征,让生成的人脸显得更加自然和美观,类似美图秀秀的一键美颜。

(4)宽度 & 高度 生成图像的宽度和高度分辨率。默认的分辨率是 512 x 512, 但这个分辨率下的图片,哪怕是细节再丰富,看起来也很模糊,所以设备允许的情况下,我们一般把它提到1000左右。相同的提示词用更高的分辨率跑出来,质感完全都不一样。当然,分辨率设置的太高也会有问题,显卡显存扛不住,出现 “CUDA out of memory”的提示。为了让我的AI绘画有强悍的性能,保证我的出图效率和体验,我使用了京东云GPU云主机,它拥有超强的并行计算能力,在深度学习、科学计算、图形图像处理、视频编解码等场景广泛使用,可以提供触手可得的算力,有效缓解计算压力,让我在高清出图时不再有“爆显存”的烦恼。

这篇深入浅出贴 助你早日实现Stable diffusion自由_UI_11

(5)平铺/分块(Tiling)**用来生成无缝贴满整个屏幕的、纹理性图片的,如果没有需要慎重勾选哦,它会让你的画面变得很奇怪。

(6)提示词相关性(SFG Scale)**CFG Scale 的范围是 1-30,默认值为 7。我们可以通过调整不同的 Scale 值来观察图像的变化。它的数值越高,AI绘画忠实地反应你提示词的程度就越高,7~12之间是比较安全的数值,数值太高则容易引起图片变形。

(7)随机种子(Seed)**生成图像的随机种子,类似于抽奖的幸运种子,会影响生成的图像结果,是我们用来控制画面内容一致性的重要参数。如果我们想要画面保持一样的风格,就可以使用同一个随机种子。在这个随机种子里面,有2个功能按钮,点击右侧的骰子,可以把随机参数设置成-1,每一次都抽一张新的卡;点击中间的循环按钮,就会把种子设置成上一张图片抽出来的数字。

(8)生成批次、每批数量 每批、每次次生成的图像数量,如果显存不够大,建议调小数值。因为AI绘画的不确定性,即使是同一组提示词,也需要反复试验。这个试验过程有时候会很漫长,如果你想让AI一直不断地按照同一组提示词和参数出图,可以尝试批次数调高,绘制的过程则会不断重复地进行。所以完全可以让它一口气来上个几十次甚至上百次,自己去吃个饭、睡一觉,让显卡默默地在这里打黑工。增大 \[每批数量\] 可以让每批次绘制的图像数量增多,理论上效率会更高,但它同一批绘制的方法是:把这些图片拼在一起看作一张更大的图片,所以如果你的设备不好,非常容易爆显存。

标签:diffusion,ControlNet,AI,模型,深入浅出,生成,图像,Stable,图片
From: https://blog.51cto.com/u_15714439/9603275

相关文章

  • 深入浅出Java多线程(十):CAS
    引言大家好,我是你们的老伙计秀才!今天带来的是[深入浅出Java多线程]系列的第十篇内容:CAS。大家觉得有用请点赞,喜欢请关注!秀才在此谢过大家了!!!在多线程编程中,对共享资源的安全访问和同步控制是至关重要的。传统的锁机制,如synchronized关键字和ReentrantLock等,能够有效防止多个线程同时......
  • 深入浅出Java多线程(八):volatile
    引言大家好,我是你们的老伙计秀才!今天带来的是[深入浅出Java多线程]系列的第八篇内容:volatile。大家觉得有用请点赞,喜欢请关注!秀才在此谢过大家了!!!在当今的软件开发领域,多线程编程已经成为提高系统性能和响应速度的重要手段。Java作为广泛应用的多线程支持语言,其内存模型(JMM)设计......
  • 深入浅出Java多线程(七):重排序与Happens-Before
    引言大家好,我是你们的老伙计秀才!今天带来的是[深入浅出Java多线程]系列的第七篇内容:重排序与Happens-Before。大家觉得有用请点赞,喜欢请关注!秀才在此谢过大家了!!!在上一篇文章中,我们简单提了一下重排序与Happens-Before。在这篇文章中我们将深入讲解一下重排序与Happens-Before,然......
  • Stable Code 3B:轻量级编程助手,无GPU本地运行
    引言StabilityAI近期发布了StableCode3B,这是一个集中了多项创新技术的轻量级编程辅助模型。它在保持轻量的同时,展现出了与大型模型如CodeLLaMA7B相媲美的性能,这一特性使其在没有GPU的环境中也能运行,极大地拓宽了其应用范围。模型概述StableCode3B,作为一款拥有30亿参数的编程......
  • 深入浅出Java多线程(六):Java内存模型
    引言大家好,我是你们的老伙计秀才!今天带来的是[深入浅出Java多线程]系列的第六篇内容:Java内存模型。大家觉得有用请点赞,喜欢请关注!秀才在此谢过大家了!!!在并发编程中,有两个关键问题至关重要,它们是线程间通信机制和线程间同步控制。线程间通信机制线程间通信是指在一个多线程程序......
  • 深入浅出Java多线程(八):volatile
    引言大家好,我是你们的老伙计秀才!今天带来的是[深入浅出Java多线程]系列的第八篇内容:volatile。大家觉得有用请点赞,喜欢请关注!秀才在此谢过大家了!!!在当今的软件开发领域,多线程编程已经成为提高系统性能和响应速度的重要手段。Java作为广泛应用的多线程支持语言,其内存模型(JMM)设计巧妙......
  • sql server执行dbcc修复,提示:(类型为 In-row data)的对象 "hr_bd_BusTables",计数 In-ro
    问题:数据库执行DBCCCHECKDBwithNO_INFOMSGS检查提示:计数In-rowdataUSEDpage不正确。请运行DBCCUPDATEUSAGE。DBCCCHECKDBwithNO_INFOMSGS;消息2508,级别16,状态1,第1行对于索引ID为1、分区ID为311221045166080、分配单元ID为311221045166080(类型......
  • 10000+AI绘画关键词-涵盖Mid和StableDiffusion
    下载地址:https://pan.quark.cn/s/90634ffdf31910000+AI绘画关键词-涵盖Mid和StableDiffusion......
  • 深入浅出Java多线程(五):线程间通信
    引言大家好,我是你们的老伙计秀才!今天带来的是[深入浅出Java多线程]系列的第五篇内容:线程间通信。大家觉得有用请点赞,喜欢请关注!秀才在此谢过大家了!!!在现代编程实践中,多线程技术是提高程序并发性能、优化系统资源利用率的关键手段。Java作为主流的多线程支持语言,不仅提供了丰富的......
  • [stable/nginx-ingress] [emerg] 46#46: bind() to 0.0.0.0:80 failed (13: Permissio
    该报错与nginx的报错是一样的,不同的是发生在kubernetes-ingress场景。使用NginxIngressController时,以Deployment的方式启动POD时会报错。使用的Deployment配置示例:https://github.com/nginxinc/kubernetes-ingress/blob/main/deployments/deployment/nginx-ingress.yaml这......