vegeone
0%

基本介绍

这是能用AI技术生成图片的开源软件,只要给定一组描述文本,AI就会开始绘图(准确的说是「算图」或「生图」);亦能模仿现有的图片,生成另一张图片。甚至给它一部分涂黑的图片,AI也能按照你的意愿将图片填上适当的内容。除此之外还支持自行训练模型加强生图效果。

环境搭建

我最先使用的是下面介绍①的版本,但是缺少很多插件,用着不是很方便,于是使用了介绍②的版本。

版本①

关键步骤

此处以windows为例,其他操作系统可查看底部链接。
python、Anaconda等环境的搭建也可参考文章底部链接。

  1. 在终端输入以下代码
1
git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git
  1. 设置启动命令行参数

stable-diffusion-webui文件夹里面的webui-user.bat按右键,以记事本打开。

接着您要编辑set COMMANDLINE_ARGS=这一行启动参数。

若显卡VRAM在8GB以上,将set COMMANDLINE_ARGS=替换成set COMMANDLINE_ARGS=--enable-insecure-extension-access参数。

显卡VRAM小于等于4GB,将set COMMANDLINE_ARGS=替换成set COMMANDLINE_ARGS=--medvram --opt-split-attention --enable-insecure-extension-access参数。加上--medvram的用意是为了限制VRAM占用。

电脑RAM(不是VRAM)小于等于8GB的话改替换为set COMMANDLINE_ARGS=--lowvram --opt-split-attention --enable-insecure-extension-access参数。注意使用--lowvram参数会让高端显卡算图变很慢。

(下面的不加也可以)

加上--xformers可进一步减少VRAM占用,只支持Nvidia显卡。加入--no-half-vae减少使用VAE算出黑图的几率。

加上--listen参数再开放防火墙7860通信端口,即可用局域网路其他电脑的浏览器访问WebUI。

加上--share参数则会产生一组Gradio网址,让你可以从外部网络或手机使用WebUI。网址72小时后过期。

其余可用参数请见命令行参数

  1. 之后就可以双击webui-user.bat文件运行了

    报错解决

  2. 出现报错缺少相关配置,且系统因某些原因无法自己安装该配置

    1
    AssertionError: Couldn't find Stable Diffusion in any of: ['E:\\stable-diffusion-webui-arc-directml\\repositories/stable-diffusion-stability-ai', '.', 'E:\\']

    通过以下代码,在根目录新建openai文件夹,并在该文件夹中克隆相关配置

    1
    git remove https://www.modelscope.cn/AI-ModelScope/clip-vit-large-patch14.git
  3. torch版本无法适配

    根据requirements_versions.txt文件要求以及终端提示,通过安装对应版本torch实现目标

    1
    pip install torch==2.1.2 torchvision==0.16.2 --extra-index-url https://download.pytorch.org/whl/cu121

    版本②

    关键步骤

这次使用了up主秋葉aaaki的sd版本,选择合适的版本下载后即可点击A绘世启动器.exe启动。

具体流程该up主有专门的视频)进行介绍

使用教程

参数

Prompt

提示词,通过,符号分隔

Nagative Prompt

告诉ai要避免哪些内容。

此处一般是选择embeding的一些内容,用于避免一些基本错误(如多个手指等,虽然加上这些出来的图也有可能出现多个手指)。对于版本②,如果没有修改embedding文件夹中的内容的话,默认放置的四个基本错误都可以添加在Nagative Prompt中。

模型

模型一般通过大模型(checkpoint),以及Lora,embedding,VAE,hypernetworks,ControlNet等共同生成。之前在学习过程中又看到一个很有意思的说法:大模型->游戏本体,embedding->小mod,Lora->dlc。下面也将详细介绍一些常见的模型。

模型的获取

模型我一般都是在civitai)中获取。

如图所示,图片的左上角有两个参数,第一个表示的是什么类型的模型,第二个表示是基于什么技术的模型。如果使用的是stable-diffusion,那么如果第二个参数为小马的图标(pony),那么将无法正常使用模型。

选择你心仪的模型,点击download可以获取safetensors或pt文件,将每个模型放在对应的文件夹下

checkpoint

模型的存储地址为/models/stable-diffusion/

checkpoint是整个ai图像制作的大模型,是决定图片类型的基调(是现实风格还是漫画风格)。

embedding

模型的存储地址为/embeddings

可以把embeddings理解为一些提示词的词包/集合,这样可以避免输入过多的提示词。(可以看到embedding也就几十KB)

VAE

模型的存储地址为/models/VAE

可以理解为添加某种滤镜

Lora

模型的存储地址为/models/Lora

Lora是某个具体的描述,比如你要生成具体某个人的相关图片,涉及到这个人的五官、装饰等细节,那就可以使用Lora模型来在提示词中告诉ai,我需要一个***的人。

hypernetworks

模型的存储地址为/models/hypernetworks

也是用于改变画风,但相比于大模型的画风,超网格实现的是比如梵高/莫奈的画风。

参考文献

https://docs.stablediffusion.cn/article/1/592976494007943168.html

【AI绘画·24年8月最新】Stable Diffusion整合包v4.9发布!解压即用 防爆显存 三分钟入门AI绘画 ☆更新 ☆训练 ☆汉化 秋叶整合包_哔哩哔哩_bilibili

第四课:文生图-参数调节区详解_哔哩哔哩_bilibili

知识背景

如何将自己的文件分享给其他人?

直链

实现

把该文件放在自己的服务器当中,其他人去对应网址下载软件。

举例

音乐软件缓存歌曲,小说网站下载小说,应用官网下载软件

缺点

  1. 所有人都去一个服务器下载,抢占网络带宽,导致每个人下载速度很慢
  2. 十分受分享方、服务器的影响,如果分享方或服务器受到影响就无法正常分享文件

BT

优化

不是全都从服务器下载,而是从已下载的人手中获取相对应的文件。

再优化方案,可以每个人都只下载某一部分文件,然后互相交换获取各自所需要的部分。(即p2p)

实现

制作一个种子文件,记录文件信息、分块大小,以及tracker服务器信息(用于获取谁有下载过该文件)。

缺点

  1. 还是无法摆脱服务器
  2. BT的资源分享上传全凭自愿,有些下载了某个文件的人不愿意将他的下载部分贡献出来

磁力

优化与实现

摆脱了服务器的限制。

让每个人都成为tracker服务器。在寻找“谁有下载过该文件”的信息时,会先进入到一个DHT网络,然后在这个网络里寻找tracker。(类似树上DFS)

举例

迅雷

PT

实现

将使用者限制在一个小圈子中,强制每个人只有上传了资源才能进行下载。上传数据量和下载数据量实现对等。

并查集的理解

作为一种数据结构,其核心的是修改与查询,并查集实现的是1.将两组的内容合并以及2.查询两个元素是否在同一组内

并查集的结构往往是以树的形式呈现,所谓的同一组就是是否在同一棵树下,将两组的内容合并就是将一颗的根节点嫁接到另一根树的根节点下面,查询两个元素是否在同一组内就是看两个结点是否在同一棵树下。

阅读全文 »

lambda表达式的理解

lambda表达式的具体定义可以去网上找,我对它的理解就是将一个函数以更简洁的方式,以表达式的形式内嵌在某个函数中。

lambda表达式的应用场景

lambda表达式最常用的是在sort函数中,把cmp函数以lambda表达式直接写在内部,代码如下:

1
2
3
sort(a.begin(),a.end(),[&](int x,int y){//此排序采用降序排序
return x>y;
});

等价于

1
2
3
4
bool cmp(int x,int y){
return x>y;
}
sort(a.begin(),a.end(),cmp);
阅读全文 »

题意

给定一串字符串,求其中有多少长度>=3子串,且该子串中某个字符只出现一次。

思路

最终答案的求取可以通过遍历以i位置为所要求的只出现一次的字符所对应的子串数量来求取。

然后显然我们不可能直接对于每个字符c,都暴力的去找左边有多少个相邻的连续的连续的字符与c不同,以及右边有多少个相邻的连续的连续的字符与c不同。于是,我们需要通过预处理,来记录每个字符左右两边分别有多少个相邻的、连续的、与此字符不同的字符,最终的答案也可以理解为左边挑,右边取,然后相乘即可。假设左边的个数为l,右边的个数为r。那么对于该字符,它的贡献为:

由于还有一个限制是长度>=3,所以对某一边没有符合要求的字符时,需要另一边减去只取一个字符的情况,即:

阅读全文 »

BFS

BFS介绍

BFS,即宽度优先搜索,经常用于图上遍历等。相比于dfs,bfs是横向的搜索,是一层一层找的。

BFS通过队列进行依次处理,对于每个结点的子节点,将它通过排队的形式排在这一层的后面而非直接遍历,对于一颗BFS树,它的BFS序便是一层一层的向下拓展。

同时BFS由于是层层遍历,先访问到的一定是距离初始点最短的。

bfs的常规遍历顺序

阅读全文 »

DFS

DFS介绍

DFS,即深度优先搜索,经常用于暴力以及图上遍历等。相比于bfs,dfs是纵向的搜索,是一次性找到底的。从根找到底,然后退回来换条路继续走到底,直到走完。

DFS可以理解为是递归+回溯。对于一棵DFS树,其搜索的方式是从根结点开始,沿着一条边一直走到底,层层递归,每次进入一个子节点就可以理解为一个新的以此子节点为根的DFS树,称之为递归。当访问到叶子结点时,又需要将叶子结点的信息返回并总结到该叶子节点的父亲节点,称之为回溯。

DFS大部分分为树上DFS与图上DFS,但其实两者是相通的,图上DFS可以将上下左右四个方向的遍历结果转化为该位置的四个儿子结点,此时还需要一个vis数组用来记录该儿子结点是否在别的分支出现过,尽管从一个点到另一个点会有多条路径,但如果不是要求最短路径的情况下,往往只需要记录一次即可。

dfs的常规遍历顺序

阅读全文 »

题意

给定一张二维图,图上有两个连通块,求使得两个连通块相连的最短路径。

思路

由于无法区分两个连通块,所以通过dfs对两个连通块中的元素分别赋值0/1,然后对于两个连通块中的所有点分别求曼哈顿距离-1即可。(曼哈顿距离:水平距离+竖直距离)

阅读全文 »