AIGC入门系列1:感性的认识扩散模型

1、序言

大家好,欢迎来到AI手工星的频道,我是专注AI领域的手工星。AIGC已经成为AI又一个非常爆火的领域,并且与之前的AI模型不同,AIGC更适合普通人使用,我们不仅可以与chatgpt对话,也能通过绘画模型生成想要的图片。很多朋友都想去深入的了解和掌握AIGC的原理,但是AIGC需要一定的学习成本,其入门门槛较高。因此手工星制作了这一系列的入门教程,希望能够帮助到有需要的朋友。大家注意哦,由于AIGC的范围较广,而手工星的能力有限,因此这一系列的入门教程将限定在适用于图像、视频生成的扩散模型领域,手工星将围绕扩散模型的原理,环境搭建、使用、改进、数学推导等多个方面来帮助大家入门。注意到这里手工星将数学推导放在了最后,那是因为手工星觉得对于扩散模型一开始就讲解数学推导,会令很多朋友索然无味,早早放弃。我们先通过感性的方式认识扩散模型,使用扩散模型,了解了一些基本概念,有了一定的实践基础之后,再去推导数学公式就水到渠成了。总之,这个系列的规划大致就是这样子的,可能的文章顺序大概是这样的(不排除编写过程中做调整):

  • AIGC入门系列1:感性的认识扩散模型
  • AIGC入门系列2:如何控制扩散模型生成我们想要的内容
  • AIGC入门系列3:什么是潜在扩散模型
  • AIGC入门系列4:扩散模型的应用(文生图、图生图以及图像编辑)
  • AIGC入门系列5:扩散模型环境搭建(diffusers)
  • AIGC入门系列6:在diffusers上尝试文生图、图生图以及图像编辑
  • AIGC入门系列7:DreamBooth
  • AIGC入门系列8:ControlNet
  • AIGC入门系列9:扩散模型的数学原理
  • AIGC入门系列10:扩散模型的改进
  • AIGC入门系列11:扩散模型的展望

由于手工星工作比较忙,出教程的速度可能无法保证,还请大家多多见谅。如果你喜欢手工星的频道的话,记得点赞收藏哦。

2、什么是扩散模型?

2.1、污水的扩散

本期教程作为AIGC入门系列的第一篇,我们来聊聊什么是扩散模型。当然,我们限定在感性认知的前提下。首先想到扩散,我们很容易想到这是一个由小到大,或者由浅入深的过程。例如,工厂偷偷向湖泊里面排放污水,污水会逐渐扩散,最后将整个湖泊都污染了,使得我们原来干净透彻的湖水变得面目全非。

那么如果我们要治理污水,恢复湖泊本来的面目。我们可以怎么做呢?第一步,我们可以先用化学试剂与污染物起反应,消除掉一部分污染物,此时河面会稍微清澈一些。然后我们可以往河水里加入絮凝剂,又可以沉淀掉一些污染物,河水也更干净了一些。最后我们可以种植一些能够吸收污染物的绿色植物,将湖泊里的污染物彻底清理干净。自此,前面扩散的污染就被全部清理干净,湖泊恢复了本来的面貌。(注意哦,手工星完全不懂治污流程,上面的过程纯粹是瞎编的!)

通过上面的流程,我们其实就已经经历了扩散与逆扩散的过程。工厂偷偷排污,以致于污染了整个湖泊,这就是一个污染物扩散的过程;而治理污水就是一个逆扩散的过程,将扩散出来的污染物一点点的清除掉。有了这个感性的认识,我们再来看看AIGC当中大名鼎鼎的扩散模型。

2.2、扩散模型的概念

如果我们对一张干净的图片进行“排污",这里我们用高斯噪声作为污染物,所以"排污"就是对图片加噪的过程。那么随着持续的加噪,噪声扩散的强度越来越大,使得我们原来干净的图片变得逐渐模糊,以至于最后面目全非,完全分辨不出是一个骑行的小姐姐了,如下图所示。

如果此时我们训练一个“治污模型”,它能够将图片恢复,就像上面的湖泊“治污”流程那样,一步一步的治理污染,去除噪声,慢慢的将面目全非的图片恢复到干净的原始图片,如下图所示。

那么这个“治污模型”就是一个非常好用的生成模型了。为什么这么说呢?这个“治污模型”不只是把一张被污染的很严重的图片给恢复了而已吗?它并没有生成新的图片啊?这个思考非常棒,也很有代表性。那么既然它没法生成新的图片,为什么手工星称它已经是一个非常好用的生成模型呢?其实它确实具备了生成图片的能力。因为当你把一张图片持续加噪,得到一张面目全非的图片,那么这张面目全非的图片,实际上跟我们直接从高斯分布随机取一张噪声图,是等价的。也就是说,当有了一个“治污”模型之后,我们直接送给他一张随机生成的噪声图,它也能通过一步一步的去噪流程,生成一张符合我们审美的图片了。amazing!是不是很神奇,这样的话,我们是不是确实可以称它为“生成模型了”。

2.3、时间步的概念(time-step)

前面的流程我们一直在强调一步一步的加噪或者一步一步的降噪。为什么没法一步到位,直接进行一步加噪和一步降噪呢?想象一下我们湖泊污染过程,污水是慢慢扩散到整个湖泊的,而不是瞬间就把整个湖泊给污染了。同样的,治污过程也不是一蹴而就的,没法直接快速的将所有污染治理干净,一般都是一步一步,一点一点的治理的。这在直觉上很好理解,一步一步的操作总要比一步到位简单很多,同样的在扩散模型中也是一步一步的降噪比一步到位的降噪更容易学习。因此也会有更好的效果。所以扩散模型中一般都有时间步的概念(time-step),就是事先定义好花多少步将一张图片完全加噪为面目全非的随机噪声,同样也对应着降噪过程花多少步慢慢的恢复到正常图片。当然,这里的时间步会存在一个矛盾,就像治理污水一样,步数太多,虽然每一步的效果比较容易保证,但是需要的步数太多,流程太慢。而步数如果定义的太少,那么虽然效率提升了,但是并不容易得到好的恢复效果。不过最后,手工星还是要友情提醒一下,这里是我们感性认识扩散模型的部分,实际上的加噪过程是可以通过数学公式简化,实现一步到位的。但是对于目前我们入门来说,可以暂时先不考虑优化。另外这个时间步通常是很大的,例如可以是1000步,所以当前阶段,大家只要要时间步的概念,并且知道它通常是比较大的就行了。

3、扩散模型的训练

我们都知道,AI是基于学习的方法。AIGC也不例外,扩散模型也不例外。学习就意味着需要提供很多数据。那么我们需要如何准备数据才能训练出一个治污高手模型(去噪模型)呢?这里我们使用一个例子来说明。手工星非常喜欢宠物狗,手机壁纸都是狗子的图片,每次锁屏都想看到不一样的狗子,奈何手机里面狗子的图片不多。因此想用扩散模型方法训练一个去噪模型,这样就能生成无穷无尽的狗子图片。

首先是搜集狗子的图片,并且越多越好,于是手工星从网络上爬取了大量的狗子图片,做成了一个狗子数据集。

然后我们开发一个“排污”程序(加噪程序),它的作用就是按照前面介绍的加噪方法,给正常图片一步一步的加入噪声,直到图片面目全非。然后从加噪过程随机选择一些“时间步-噪声-加噪后图片”组成的训练三元组。

有了这些训练三元组,我们就可以很方便的训练去噪模型了。对于去噪模型来说,输入就是加噪后的图片以及时间步,输出就是去噪模型预测的噪声。我们训练的目的就是让去噪模型在每一个时间步预测的噪声和真实噪声尽量接近。当经过几万、几十万次的训练后,我们的去噪模型预测的噪声已经和真实噪声非常接近了。

4、扩散模型的推理

有了上面训练出来的狗子去噪模型,下面就是激动人心的时刻了,我们可以使用去噪模型生成狗子图片了。首先我们从高斯分布中随机采集一张高斯噪声图片,然后送入到去噪模型当中,假设我们的时间步设置的是1000,那么就将高斯噪声图片经过去噪模型的1000次降噪,最后就会得到一个狗子图片了。而且这个狗子图片和我们训练数据中的狗子图片不一样,完全是去噪模型生成出来的,就像是我们的大脑脑补出来的图片一样。并且当我们采集的高斯噪声不同,生成出来的狗子图片也完全不同,此时我们就已经实现了一个能够生成无穷无尽狗子图片的“生成模型”了!

5、总结

这一期的感性认识扩散模型到这里就结束了,是不是并没有想象相中的那么难!我们从湖泊的污染和治理说起,引申到图片的加噪与去噪。最后介绍了如何用去噪模型生成图片。下一期我们将介绍扩散模型中的文本控制。大家有没有发现我们现在的生成模型缺少控制能力。例如上面介绍的狗子去噪模型,它训练完之后确实能生成狗子的图片,但是假如我想生成一张黄皮肤、大眼睛的狗子图片,我们的狗子去噪模型就无能为力了。因为它生成的图片具有一定的随机性,虽然是一只狗子,但是狗子的属性我们完全无法控制。而在很多生成领域,我们其实是希望能够具体控制模型生成的效果的。因此下一期将介绍如何通过文本描述来控制模型生成一张符合我们要求的图片,喜欢的朋友可以收藏手工星的频道“AI手工星”,我们下期见吧。

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

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

相关文章

使用ASP.NET MiniAPI 调试未匹配请求路径

本文将介绍如何在使用ASP.NET MiniAPI时调试未匹配到的请求路径。我们将详细讨论使用MapFallback方法、中间件等工具来解决此类问题。 1. 引言 ASP.NET MiniAPI是一个轻量级的Web API框架,它可以让我们快速地构建和部署RESTful服务。然而,在开发过程中如…

PACC:数据中心网络的主动 CNP 生成方案

PACC:数据中心网络的主动 CNP 生成方案 文章目录 PACC:数据中心网络的主动 CNP 生成方案PACC算法CNP数据结构PACC参数仿真结果参考文献 PACC算法 CNP数据结构 PACC参数 仿真结果 PACC Hadoop Load0.2 的情况: PACC Hadoop Load0.4 的情况&a…

go slice源码探索(切片、copy、扩容)和go编译源码分析

文章目录 概要一、数据结构二、初始化2.1、字面量2.2、下标截取2.2.1、截取原理 2.3、make关键字2.3.1、编译时 三、复制3.1、copy源码 四、扩容4.1、append源码 五:切片使用注意事项六:参考 概要 Go语言的切片(slice)是对数组的…

axios的使用及说明

目录 1.说明 2.直接使用 3.封装使用 4.注意 1.说明 官网:Axios 实例 | Axios中文文档 | Axios中文网 Axios 是一个基于 promise 网络请求库,作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使…

Java超高精度无线定位技术--UWB (超宽带)人员定位系统源码

UWB室内定位技术是一种全新的、与传统通信技术有极大差异的通信新技术。它不需要使用传统通信体制中的载波,而是通过发送和接收具有纳秒或纳秒级以下的极窄脉冲来传输数据,从而具有GHz量级的带宽。 UWB(超宽带)高精度定位系统是一…

java零拷贝zero copy MappedByteBuffer

目录 调用操作系统的 mmap 未使用 mmap 的文件通过网络传输的过程 使用 mmap 的文件通过网络传输的过程 使用例子 调用操作系统的 sendfile() 在 java 中的具体实现 mmap的优劣 mmap 的不足 mmap 的优点 mmap 的使用场景 对于零拷贝(zero copy&#xff09…

C语言实验4:指针

目录 一、实验要求 二、实验原理 1. 指针的基本概念 1.1 指针的定义 1.2 取地址运算符(&) 1.3 间接引用运算符(*) 2. 指针的基本操作 2.1 指针的赋值 2.2 空指针 3. 指针和数组 3.1 数组和指针的关系 3.2 指针和数…

【Linux】内核编译 镜像制作

文章目录 一、Ubuntu内核编译1.1 为什么自己编译内核1.2 Ubuntu 内核源码下载1.21 内核的作用1.22 Linux内核与ubuntu内核1.23 Ubuntu内核源码获取 1.3 在Windows系统下编译ubuntu内核1.4 在Linux系统下编译ubuntu内核 二、镜像制作 一、Ubuntu内核编译 1.1 为什么自己编译内核…

用LCD循环右移显示“Welcome to China“

#include<reg51.h> //包含单片机寄存器的头文件 #include<intrins.h> //包含_nop_()函数定义的头文件 sbit RSP2^0; //寄存器选择位&#xff0c;将RS位定义为P2.0引脚 sbit RWP2^1; //读写选择位&#xff0c;将RW位定义为P2.1引脚 sbit EP2^2; //使能…

Debezium日常分享系列之:向 Debezium 连接器发送信号

Debezium日常分享系列之&#xff1a;向 Debezium 连接器发送信号 一、概述二、激活源信号通道三、信令数据集合的结构四、创建信令数据集合五、激活kafka信号通道六、数据格式七、激活JMX信号通道八、自定义信令通道九、Debezium 核心模块依赖项十、部署自定义信令通道十一、信…

【C# 技术】 C# 常用排序方式——自定义数据排序

C# 常用排序方式——自定义数据排序 前言 在最近的项目中经常会对C#中的数据进行排序&#xff0c;对于基本数据类型&#xff0c;其排序方式比较简单&#xff0c;只需要调用内置算法即可实现&#xff0c;但对于自定义数据类型以及自定义排序规则的情况实现起来就比较麻烦&…

区分LR(0),SLR(1),LR(1)和LALR(1)

目录 对于LR(0)文法&#xff1a; 对于SLR(1)文法&#xff1a; 对于LR(0)和SLR(1)文法&#xff1a; 对于LR(1)和SLR(1)文法&#xff1a; 对于LALR(1)文法&#xff1a; 例题1&#xff1a; 例题2&#xff1a; 例题3&#xff1a; 例题4&#xff1a; 这几个文法大致的步骤都…

推荐几个贼有意思的开源项目!

这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等&#xff0c;涵盖多种编程语言 Python、Java、Go、C/C、Swift...让你在短时间内感受到开源的魅力&#xff0c;对编程产生兴趣&#xff01; C 项目 1、kilo&#xff1a;不到 1 千行代码实现的迷你文本编辑器。该项…

Portraiture4.1汉化版PS磨皮插件(支持原生m1芯片m2)

Portraiture汉化版PS磨皮插件。本期推荐一款全新ai算法ps2024中文汉化版ps磨皮插件Portraiture 4.1.2美颜滤镜安装包最新版ps调整肤色插件! 全新Portraiture 4.1.2版本PS人像修图美颜磨皮插件&#xff0c;升级AI算法&#xff0c;并支持多人及全身磨皮美化模式&#xff0c;推荐…

【嵌入式开发 Linux 常用命令系列 7.3 -- linux 命令行数值计算】

文章目录 linux 命令行数值计算使用 awk使用 bc 命令使用 Bash 的内置算术扩展使用 expr脚本命令实现 linux 命令行数值计算 在 Linux 命令行中&#xff0c;您可以使用多种方法来执行基本的数学运算。以下是一些示例&#xff1a; 使用 awk awk 是一个强大的文本处理工具&…

【C#】知识点实践序列之Lock的输出多线程信息

大家好&#xff0c;我是全栈小5&#xff0c;欢迎来到《小5讲堂之知识点实践序列》文章。 2023年第2篇文章&#xff0c;此篇文章是C#知识点实践序列之Lock知识点&#xff0c;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 本篇在Lock锁定代码…

【python_数据分组】

对excel按照标签进行分组&#xff0c;例如按照“开票主体和对方公司”进行分组&#xff0c;并获取对应的明细。 表格如下&#xff1a; def main(excel_data):result {}for d in excel_data:if str(d[0])str(d[1]) in result:result[str(d[0])str(d[1])].append([d[0],d[1],…

web component - 使用HTML Templates和Shadow DOM构建现代UI组件

Web Component是一种用于构建可重用的UI组件的技术。它使用标准化的浏览器API&#xff0c;包括Custom Elements、Shadow DOM和HTML Templates来实现组件化开发方式。这些API都是现代浏览器原生支持的&#xff0c;因此不需要引入第三方库或框架即可使用。 在这篇博客中&#xf…

第6课 用window API捕获麦克风数据并加入队列备用

今天是2024年1月1日&#xff0c;新年的第一缕阳光已经普照大地&#xff0c;祝愿看到这篇文章的所有程序员或程序爱好者都能在新的一年里持之以恒&#xff0c;事业有成。 今天也是我加入CSDN的第4100天&#xff0c;但回过头看一看&#xff0c;这么长的时间也没有在CSDN写下几篇…

SpringCloud-高级篇(九)

&#xff08;1&#xff09;Seata高可用 我们学习了Seata的各种用法了&#xff0c;Seata的服务是单节点部署的&#xff0c;这个服务如果挂了&#xff0c;整个事务都没有办法完了&#xff0c;下面我们学习Seata的高可用的知识。 实现高可用&#xff0c;还是比较简单&#xff0c;…