前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >03:一文搞懂stable diffusion扩散去噪原理,玩转AI绘画

03:一文搞懂stable diffusion扩散去噪原理,玩转AI绘画

原创
作者头像
叫我阿柒啊
修改2024-04-18 14:27:31
2161
修改2024-04-18 14:27:31
举报

前言

本来想单独写Noise predictor这个U-Net模型的,奈何实力尚浅,觉得还是结合stable diffusion中的diffusion(扩散)的概念一起写,才能更好地理解Noise predictor。

所以,本篇文章主要针对概念性的扩散来写,且本篇文章和我们使用stable diffusion关系不大,只是让大家了解我们在使用stable diffusion时的原理。

扩散(Diffusion)

在stable diffusion的概念中,扩散分为正向扩散(Forward Diffusion)和逆向扩散(Forward diffusion)。下面都以图生图为例,因为一定程度上,文生图可以看成图生图的子集。

正向扩散(Forward Diffusion)

正向扩散,就像一滴墨水掉进了一杯水中,墨水滴在水中扩散,最后墨滴在水中随机分布,你也无法判断墨滴最初是落在杯子中心还是靠近边缘的地方。在stable diffusion中,输入的图片就是杯子,噪声(noise)就是墨滴。

在图生图中,我们要输入一张图片,图片被VAE Encoder解码成一个在Latent Space内的4 64 64的latent image

Forward Diffusion就是在latent image上,不断添加noise使其变成一个完全随机张量(random tensor),也就是我们说的噪声图。这里,不断添加是关键词,latent image并不是一步就变成了噪声图。

从图中可以看到,在Forward diffusion之后,原图是猫还是狗,从噪声图里根本分不出来。但是我们的目的是根据输入图片生成类似的图片,这都成噪声图了,如何再还原回去,那么就需要逆向扩散(Forward Diffusion)。

逆向扩散(Forward Diffusion)

Reverse diffusion就是正向扩散的逆过程。就是将噪声图编程一张图片。正向扩散是滴墨在水里扩散,那么逆向扩散就是时光倒流,我们将看到最初添加墨滴的位置。

噪声图通过逆向扩散,又由随机噪声图变成了猫/狗的图片。

看完图,对Reverse diffusion到底是如何逆向转换的,是一点没有明白,所以接下来就讲如何将噪声图转换成原图?

首先,在Forward Diffusion中,stable diffusion是逐步添加noise将图片转换成噪声图。那么我们就需要知道这个图像每一步加了多少噪声,我们噪声图一步步减去添加的noise,最终就能得到原图了

如图,这是一个step去噪的过程,我们通常将steps设置为20 ~ 50,经过多次去噪之后,stable diffusion就会生成我们需要的图片。

那如何知道每一步的要减去的噪声,stable diffusion中的Noise predictor的U-Net神经网络模型,就是专门训练用来预测每一步添加的噪声。

Noise predictor

stable diffusion中的模型都会训练一个Noise Predictor。

训练Noise predictor

  1. 挑选一张训练图片(以猫为例)
  2. 生成一个随机噪声图片
  3. 将噪声图以不同强度(Denoising strength)叠加到训练图上来破坏训练图像
  4. 教会Noise predictor告诉我们添加多少噪声

在每个步骤中顺序地添加噪声,Noise predictor估计加在每个步骤上的总噪声。经过训练后,我们有了一个能够估计添加到图像中的噪声的噪声预测器。如果我们使用别人的大模型,训练这个根本不需要我们考虑,这些都是封装在大模型中的。

使用Noise predictor

我们在前向扩散中将图片转换成了一个噪声图,我们从原图噪声图中减去Noise predictor预测的噪声,重复几步之后,就会得到一个猫/狗的图片(因为我们在前向扩散训练使用的是猫/狗的图片)。

但是经过Reverse diffusion之后,我们无法控制最终图片是生成狗还是猫。所以这时候上篇文章讲的条件控制(conditioning) 就解决了这个问题。

conditioning就是text prompt转换来的,我们在text prompt中输入“cat”,或者在negative prompt中输入“not dog”,stable diffusion就明白了你要生成的图片是猫,而非狗。

架构

在文生图中,text prompt被转换成conditioning作为唯一条件进入Noise predictor用来生成图片,而图生图中,还有被转换成latent image的图片作为唯二条件,与conditioning一同进入Noise predictor。

从图中可以看出,Noise predictor通过text prompt和depth map来预测潜在图像的噪声。而Depth map是在图生图中,通过controlNet处理我们输入的图片得到的。

既然经过Reverse diffusion之后才会生成图片,而经过Reverse diffusion是根据输入图片转换的噪声图来生成图片,也就是需要基于一张噪声图来生成图片。那么在文生图中,这个噪声图是如何来的。

文生图中,stable diffusion是直接生成了一个完全随机噪声图,然后再Reverse diffusion处理。

在stable diffusion中,Forward Diffusion添加的噪声强度是由Denoising strength决定的,如果Denoising strength为0,则一点噪声也不添加,如果为1,则图生图输入的图片就会变成文生图中完全随机噪声图,这个时候文生图 == 图生图,所以在图生图中通常为0.75。

我们使用下面的text prompt进行测试:

ultra high res,1boy,motorcycle,handsome,l,chibi,cute,smile,openmouth,flower,outdoors,music,beret,jacket,blush,tree,:3,shirt,shorthair,cherryblossoms,greenheadwear,blurry,brownhair,blushstickers,longsleeves,bangs,headphones,blackhair,pinkflower,(beautifuldetailedface),(beautifuldetailedeyes),<lora:blindbox_v1_mix:1>,

当Denoising strength为0时:

text prompt是一点作用也没起,直接原样输出。

当Denoising strength为0.75时:

结语

本篇文章主要讲了文生图和图生图中,正向扩散和逆行扩散的理论知识,以及Noise predictor的作用,文中提及的controlNet是什么,如何将输入的图片变成depth map的,下一篇文章会写。

我正在参与2024腾讯技术创作特训营最新征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 扩散(Diffusion)
    • 正向扩散(Forward Diffusion)
      • 逆向扩散(Forward Diffusion)
      • Noise predictor
        • 训练Noise predictor
          • 使用Noise predictor
          • 架构
          • 结语
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档