当前位置: 首页 > news >正文

万字长文:Stable Diffusion 保姆级教程

万字长文:Stable Diffusion 保姆级教程

2022年绝对是人工智能爆发的元年,前有 stability.ai 开源 Stable Diffusion 模型,后有 Open AI 发布 ChatGPT,二者都是里程碑式的节点事件,其重要性不亚于当年苹果发布iPhone,Google推出Android。它们让AI不再是一个遥不可及的技术名词,而是触手可及、实实在在的智能应用工具。

不同于ChatGPT可以直接体验,Stable Diffusion需要自己部署后才能使用,所以国内了解的人还不多。但Stable Diffusion绝对是AI图像生成领域的ChatGPT级的杀手产品——它使用超级简单、完全开源免费,生成的图片以假乱真、震惊四座。今天,我将用万字保姆级教程教你如何一步一步在本地运行起Stable Diffusion,并手把手教你如何生成以假乱真的AI生成图片。

文章目录

    • 什么是Stable Diffusion
      • 核心概念
        • 自动编码器
        • U-Net
        • 文本编码器
      • 推理过程
    • 快速体验Stable Diffusion
      • 1. Dream Studio
      • 2. Replicate
      • 3. Playground AI
      • 4. Google Colab
      • 5. BaseTen
    • 本地部署Stable Diffusion
      • 系统配置需求
      • 环境准备
        • 安装Git
        • 安装Python
        • 配置国内源
      • 安装Stable Diffusion Web Ui
      • 模型安装
    • 使用Stable Diffusion Web Ui
      • 界面介绍
        • txt2img
        • img2img
      • 界面汉化
      • prompt语法
      • 示例
        • 模型
        • Prompt
        • Negative prompt
        • 参数设置
        • 生成
    • Stable Diffusion资源列表
      • 1. Hugging Face
      • 2. Civitai
      • 3. Discord
      • 4. Rentry for SD

什么是Stable Diffusion

Stable Diffusion是一种潜在扩散模型(Latent Diffusion Model),能够从文本描述中生成详细的图像。它还可以用于图像修复、图像绘制、文本到图像和图像到图像等任务。简单地说,我们只要给出想要的图片的文字描述在提Stable Diffusion就能生成符合你要求的逼真的图像!

Stable Diffusion将“图像生成”过程转换为逐渐去除噪声的“扩散”过程,整个过程从随机高斯噪声开始,经过训练逐步去除噪声,直到不再有噪声,最终输出更贴近文本描述的图像。这个过程的缺点是去噪过程的时间和内存消耗都非常大,尤其是在生成高分辨率图像时。Stable Diffusion引入潜在扩散来解决这个问题。潜在扩散通过在较低维度的潜在空间上应用扩散过程而不是使用实际像素空间来减少内存和计算成本。

与DALL·E和Midjourney相比,Stable Diffusion最大的优势是开源,这就意味着Stable Diffusion的潜力巨大、发展飞快。Stable Diffusion已经跟很多工具和平台进行了集成,且可用预训练模型数量众多(参见Stable Diffusion资源列表)。正是由于社区的活跃,使得Stable Diffusion在各种风格的图像生成上都有着出色的表现,随便给大家看几张我生成的图片:

ChilloutMix生成的写实韩风小姐姐
SynthwavePunk生成的国风小姐姐
InkPunk Diffusion生成的泼墨油彩风格的布偶猫

核心概念

为了方便大家更好地理解后面的内容,下面对Stable Diffusion中的几个核心概念做简单的说明。Stable Diffusion的详细原理请参考《Stable Diffusion原理详解》。

自动编码器

自动编码器 (VAE) 由两个主要部分组成:编码器和解码器。编码器会将图像转换为低维潜在表示(像素空间–>潜在空间),该表示将作为输入传递给U_Net。解码器做的事情刚好相反,将潜在表示转换回图像(潜在空间–>像素空间)。

在这里插入图片描述

自动编码/解码器

U-Net

U-Net 也由编码器和解码器组成,两者都由 ResNet 块组成。编码器将图像表示压缩为较低分辨率的图像,解码器将较低分辨率解码回较高分辨率的图像。

img

U-Net架构

为了防止 U-Net 在下采样时丢失重要信息,通常在编码器的下采样 ResNet 和解码器的上采样 ResNet 之间添加快捷连接。

此外,Stable Diffusion 中的 U-Net 能够通过交叉注意力层调节其在文本嵌入上的输出。 交叉注意力层被添加到 U-Net 的编码器和解码器部分,通常在 ResNet 块之间。

文本编码器

文本编码器会将输入提示转换为 U-Net 可以理解的嵌入空间。一般是一个简单的基于Transformer的编码器,它将标记序列映射到潜在文本嵌入序列。

img

文本编码器

好的提示(prompt)对输出质量直观重要,这就是为什么现在大家这么强调提示设计(prompt design)。提示设计就是要找到某些关键词或表达方式,让提示可以触发模型产生具有预期属性或效果的输出。

推理过程

Stable Diffusion的大致工作流程如下:

首先,Stable Diffusion模型将潜在种子和文本提示作为输入。 然后使用潜在种子生成大小为 64×64 的随机潜在图像表示,而文本提示通过 CLIP 文本编码器转换为 77×768 的文本嵌入。

接下来,U-Net 以文本嵌入为条件迭代地对随机潜在图像表示进行去噪。 U-Net 的输出是噪声残差,用于通过调度算法计算去噪的潜在图像表示。 调度算法根据先前的噪声表示和预测的噪声残差计算预测的去噪图像表示。这里可选用的调度算法很多,每个算法各有优劣,对Stable Diffusion来说建议用以下几个:

  • PNDM scheduler(默认)
  • DDIM scheduler
  • K-LMS scheduler

去噪过程重复大约 50 次以逐步检索更好的潜在图像表示。 完成后,潜在图像表示由变分自动编码器的解码器部分解码。

整体流程可以用下面的流程图表示:

img

Stable Diffusion工作流程

快速体验Stable Diffusion

如果你不想自己搭建Stable Diffusion环境,或者你想在自己动手部署Statble Diffusion之前,先体验一下Stable Diffusion的威力,可以尝试如下5个免费的工具:

1. Dream Studio

DreamStudio 是Stable Diffusion的创造者Stability AI的官方网络应用程序。

Dream Studio dashboard with Stable Diffusion 2.0 option

Dream Studio dashboard

最大的优势是官方出品,支持stability.ai旗下的所有模型,包括最新发布的Stable Diffusion v2.1。

在这里插入图片描述

Dream Studio模型选择

用Dream Studio生成图片需要消耗积分,注册是会免费赠送积分,用来体验基本够用。如果想生成更多图片可以花10美元购买积分,大约可以生成1000张图片。

2. Replicate

Replicate是一个机器学习模型共享平台,你可以通过API来分享或使用上面的模型。

大神cjwbw在Replicate上共享了Stable Diffusion v2.0模型,你可以免费测试。

Stable Diffusion 2.0 demo on Replicate. An astronuat riding a horse in space sample image

Replicate界面

3. Playground AI

Playground AI是一个专注AI图像生成的网站,功能丰富、模型众多。最近也上线了最新的Stable Diffusion v2.1,可以免费使用,但限制每个用户每天最多生成1000张图片。

Playground AI dashboard with Stable Diffusion 2.0

Playground AI界面

4. Google Colab

如果你是数据工程师或算法工程师,可能你更希望在Jupyter Notebook中使用Stable Diffusion。Anzor Qunash在Google Colab上共享了Stable Diffusion 2.0 Colab(已更新到2.1),你可以直接复制过来使用。

Google Colab notebook with Stable Diffusion 2.0

Stable Diffusion 2.0 Colab界面

该Notebook用gradio搭建了界面,只需点击运行按钮,就会显示Gradio UI界面。然后,您就可以在上面生成任意数量的图像,并且可以调节参数,控制生成效果。

5. BaseTen

Baseten是一个MLOps平台,用于创业公司在生产阶段快速开发、部署和测试模型。BaseTen最近发布了对Stable Diffusion的API支持,并提供了一个演示页面。

img

BaseTen界面

这个工具非常简单,只有一个文本框和一个生成按钮,没有其他参数可以调节,也没有生成数量的限制。

本地部署Stable Diffusion

本地部署Stable Diffusion最简单的方法是使用Stable Diffusion Web Ui。

Stable Diffusion Web Ui是一套无代码、可视化的Stable Diffusion集成运行环境。它将Stable Diffusion的安装部署集成打包,提供一键安装脚本,并提供Web界面操作界面,极大简化了Stable Diffusion的操作和使用,让没有不懂代码的小白也能轻松上手使用Stable Diffusion模型。

在这里插入图片描述

Stable Diffusion Web Ui界面

系统配置需求

Stable Diffusion还是比较吃资源的,因此对基础硬件有一定要求。

  • NVIDIA GPU 至少 4GB 显存
  • 至少 10GB 可用硬盘空间

上面的配置是Stable Diffusion运行起来的基础要求,如果想要生成速度快,显卡配置自然是越高越好,显存最好也上到8G。推荐配置最好不低于:

  • NVIDIA RTX GPU 至少 8GB 显存
  • 至少 25GB 可用硬盘空间

如果本地机器配置达不到,可以考虑用云虚拟主机。目前最经济的是AWS的g4dn.xlarge,¥3.711元/小时。

环境准备

Stable Diffusion Web Ui用Python开发,完全开源,因此在运行Stable Diffusion Web Ui前,我们需要安装Git来拉取Stable Diffusion Web Ui源代码,并安装Python。

安装Git

Git是一个开源的分布式版本控制系统。这里安装Git是为了获取Stable Diffusion Web Ui的代码。当然,如果不安装Git,我们也可以通过代码打包下载链接直接下载Stable Diffusion Web Ui的代码,但是这样获取的代码无法后续更新,每次Stable Diffusion Web Ui升级都要重新下载代码覆盖老版本代码。用Git就很方便,可以通过clone命令从代码库获取代码,通过git pull更新到最新版代码。

Git安装很简单,只需到Git下载页面下载对应平台安装包安装即可(Linux发行版一般自带Git可以不用安装)。

Windows用户请注意,安装时在安装配置界面勾选上“Add a Git Bash Profile to Windows Terminal”选项。

在这里插入图片描述

安装Python

Python的安装方法有很多,这里推荐大家通过Miniconda来安装。用Miniconda有几个好处:

  1. 方便创建和管理多个Python虚拟环境。我建议每个Python项目都创建一套自己独立的Python虚拟环境,防止python环境或库版本不对导致代码运行出错。
  2. Miniconda体积很小,只有conda+python+pip+zlib和一些其他常用的包,小巧灵活。

大家只要到Miniconda下载页面下载对应平台的安装包即可,最新的Miniconda包含Python 3.10.9

下载完安装包直接双击安装即可(Linux版本在Shell中运行下载下来的shell脚本)。Windows用户请注意,当看到下面界面时,请务必勾选第一个选项,将Miniconda添加到环境变量PATH中。

在这里插入图片描述

配置国内源

由于 Python 第三方库的来源是国外源,使用国内网络安装库时会出现下载缓慢、卡顿等现象,不仅耽误时间,而且很容易安装失败。因此我们需要将 conda 的安装源替换成国内镜像,这样可以大幅提升下载速度,提高安装成功率。这里推荐清华源,执行下方命令即可添加:

conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/

添加成功后可以通过conda config --show-sources查看当前源

channels:- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/- defaults
show_channel_urls: True

除了清华源,还可以添加中科大源或阿里云源

中科大的源
conda config –add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/free/ 
阿里云的源
conda config --add channels http://mirrors.aliyun.com/pypi/simple/

最后,运行conda clean -i清除索引缓存,保证用的是镜像站提供的索引。

安装Stable Diffusion Web Ui

环境配置好后,我们就可以开始安装Stable Diffusion Web Ui了。

首先从GitHub上下载Stable Diffusion Web Ui的源代码:

git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git

下载完成后,cd stable-diffusion-webui进入Stable Diffusion Web Ui的项目目录,在项目目录里会看到webui.batwebui.sh这两个文件,这两个文件就是Stable Diffusion Web Ui的安装脚本。

  • 如果你是Windows系统,直接双击运行webui.bat文件
  • 如果你是Linux系统,在控制台运行./webui.sh
  • 如果你是Mac系统,使用方法跟Linux相同

安装脚本会自动创建Python虚拟环境,并开始下载安装缺失的依赖库。这个过程可能会有点久,请耐心等待。如果中途安装失败,多半是网络连接超时,此时可以重新执行安装脚本,脚本会接着上次的下载安装位置继续安装。直到看到

Running on local URL:  http://127.0.0.1:7860

说明Stable Diffusion Web Ui安装成功。

用浏览器打开http://127.0.0.1:7860就会看到Stable Diffusion Web Ui的界面。

在这里插入图片描述

Stable Diffusion Web Ui界面

模型安装

Stable Diffusion Web Ui安装过程中会默认下载Stable Diffusion v1.5模型,名称为v1-5-pruned-emaonly。如果想用最新的Stable Diffusion v2.1,可以从Hugging Face上下载官方版本stabilityai/stable-diffusion-2-1。下载后将模型复制到models目录下的Stable-diffusion目录即可。完成后点击页面左上角的刷新按钮,即可在模型下拉列表中看到新加入的模型。

在这里插入图片描述

Stable Diffusion Web Ui选择模型

除了标准模型外,Stable Diffusion还有其他几种类型的模型,models目录下每一个子目录就是一种类型的模型,其中用的最多的是LoRA模型。

LoRA(Low-Rank Adaptation)模型是小型稳定扩散模型,可对标准模型进行微调。它通常比标准模型小10-100倍,这使得LoRA模型在文件大小和训练效果之间取得了很好平衡。LoRA无法单独使用,需要跟标准模型配合使用,这种组合使用方式也为Stable Diffusion带来了强大的灵活性。

LoRA模型下载后需要放到Lora目录中,使用时在提示中加入LoRA语法,语法格式如下:

<lora:filename:multiplier>

filename是LoRA模型的文件名(不带文件后缀)

multiplier 是LoRA 模型的权重,默认值为1,将其设置为 0 将禁用该模型。

关于Stable Diffusion提示的使用规则请参考这里。

使用Stable Diffusion Web Ui

界面介绍

Stable Diffusion Web Ui整体上分为2个部分,最上面是模型选择,可以从下拉列表中选择已下载的预训练模型

在这里插入图片描述

模型选择区

模型选择下面是一个Tab栏,这里是Stable Diffusion Web Ui提供的所有功能。

在这里插入图片描述

Stable Diffusion Web Ui功能模块

  • txt2img — 根据文本提示生成图像;
  • img2img — 根据提供的图像作为范本、结合文本提示生成图像;
  • Extras — 优化(清晰、扩展)图像;
  • PNG Info — 显示图像基本信息
  • Checkpoint Merger — 模型合并
  • Train — 根据提供的图片训练具有某种图像风格的模型
  • Settings — 系统设置

平时使用最多的是txt2imgimg2img,下面针对这2大块功能详细讲解。

txt2img

txt2img有三个区域:

  • 提示区
  • 参数调节区
  • 输出浏览区

在这里插入图片描述

txt2img功能区

提示区主要是2个文本框,可以输入提示文本。其中:

prompt: 主要是对于图像进行描述。prompt对Stable Diffusion图像生成质量至关重要,因此如果想生成高质量图片,一定要在提示设计上下功夫。一个好的提示需要详细和具体,后面会专门讲解如何设计一个好的提示。

Negative prompt:主要是告诉模型我不想要什么样的风格或元素;

参数调节区提供了大量参数用于控制和优化生成过程:

Sampling method:扩散去噪算法的采样模式,不同采样模式会带来不一样的效果,具体需要在实际使用中测试;

Sampling steps:模型生成图片的迭代步数,每多一次迭代都会给 AI 更多的机会去对比 prompt 和 当前结果,从而进一步调整图片。更高的步数需要花费更多的计算时间,但却不一定意味着会有更好的结果。当然迭代步数不足肯定会降低输出的图像质量;

Width、Height:输出图像宽高,图片尺寸越大越消耗资源,显存小的要特别注意。一般不建议设置的太大,因为生成后可以通过 Extras 进行放大;

Batch count、 Batch size:控制生成几张图,前者计算时间长,后者需要显存大;

CFG Scale:分类器自由引导尺度,用于控制图像与提示的一致程度,值越低产生的内容越有创意;

Seed:随机种子,只要种子一样,参数和模型不变,生成的图像主体就不会剧烈变化,适用于对生成图像进行微调;

Restore faces:优化面部,当对生成的面部不满意时可以勾选该选项;

Tiling:生成一张可以平铺的图像;

Highres. fix:使用两个步骤的过程进行生成,以较小的分辨率创建图像,然后在不改变构图的情况下改进其中的细节,选中该选项会有一系列新的参数,其中重要的是:

Upscaler:缩放算法;

Upscale by:放大倍数;

Denoising strength:决定算法对图像内容的保留程度。0什么都不会改变,1会得到一个完全不同的图像;

img2img

img2img跟txt2img界面类似,不同的是没有了txt2img中的参数调节区,取而代之的是图像范本区。

在这里插入图片描述

img2img功能区

我们可以上传范本图片让Stable Diffusion模仿,其他地方跟txt2img相同

界面汉化

通过这里下载简体中文语言文件,下载完成后将其复制到项目文件夹的“localizations”目录中。之后在Settings -> User interface -> Localization (requires restart),在下拉菜单中选择zh_CN。如果下拉列表中看不到zh_CN,请先点击右侧的刷新按钮,然后就能在下拉列表中看到了。设置完成后记得点击页面上方的“Apply settings”按钮保存设置。

在这里插入图片描述

语言设置

语言设置需要重启才能生效。Ctrl + C先终止Stable Diffusion Web Ui服务,然后再运行webui.batwebui.sh,重启后刷新浏览器页面就能看到语言变成了简体中文了。

在这里插入图片描述

汉化界面效果

⚠注意:该汉化可能不完美,个别地方会漏汉化或汉化表达不准确,欢迎大家反馈错误和优化建议。有能力的朋友建议用英文界面。

prompt语法

为了产生具有特定风格的图像,必须以特定格式提供文本提示。 这通常需要添加提示修饰符或添加更多关键字或关键短语来实现。下面为大家介绍一下Stable Diffusion的prompt语法规则。

Stable Diffusion提示文本中的关键字或关键短语通过半角逗号分割,一般越靠前权重越高。我们可以通过提示修饰符来认为修改权重。

  • (tag):增加权重5%
  • [tag]:降低权重5%
  • (tag: weight):设置具体权重值

括号可以嵌套使用,例如:(tag)的权重为1×1.05=1.051 \times 1.05 = 1.051×1.05=1.05,((tag))的权重为1×1.05×1.05=1.10251 \times 1.05 \times 1.05 = 1.10251×1.05×1.05=1.1025。同理[tag]的权重为11.05=0.952\frac{1}{1.05} = 0.9521.051=0.952,[[tag]]的权重为11.052=0.907\frac{1}{1.05^2} = 0.9071.0521=0.907

  • [tag1 | tag2]:将tag1和tag2混合;

  • {tag1 | tag2 | tag3}:从标签集合中随机选择一个标签;

  • [tag1 : tag2 : 0.5 ]:表示先用tag1生成,当生成进程到50%时,改用tab2生成;如果输入整数的话表示步长,比如10,意思是生成10步后改用tag2;

  • <lora:filename:multiplier>:LoRA模型引用语法

示例

模型

这里我将使用chilloutmix + KoreanDollLikeness生成写实风韩系偶像小姐姐。

首先需要下载chilloutmix模型(我用的是chilloutmix_NiPrunedFp32Fix.safetensors),将其拷贝到Stable-diffusion目录,还需要下载KoreanDollLikeness这个LoRA模型,将其拷贝到Lora目录。

然后在Stable Diffusion Web Ui主界面的模型选择中下拉选择chilloutmix_NiPrunedFp32Fix.safetensors。如果找不到该模型,可以点击右侧刷新按钮刷新一下。

Prompt

选择好模型后,我们开始设计prompt。首先我们引入LoRA

<lora:koreanDollLikeness_v10:0.66>

然后定义生成图片的风格,我们希望超写实风,可以用如下关键词:

best quality, ultra high res, (photorealistic:1.4)

其中photorealistic我们赋予较高的权重1.4。

接着来定义图片的主体内容,这里我将希望图片中出现的元素都做个权重增强:

1girl, thighhighs, ((school uniform)),((pleated skirt)), ((black stockings)), (full body), (Kpop idol), (platinum blonde hair:1), ((puffy eyes))

最后,修饰一些表情、姿势的细节:

smiling, solo focus, looking at viewer, facing front

这样我们完整的promt是:

<lora:koreanDollLikeness_v10:0.66>, best quality, ultra high res, (photorealistic:1.4), 1girl, thighhighs, ((school uniform)),((pleated skirt)), ((black stockings)), (full body), (Kpop idol), (platinum blonde hair:1), ((puffy eyes)), smiling, solo focus, looking at viewer, facing front

Negative prompt

我们还需要提供Negative prompt去除我们不想要的风格和元素:

paintings, sketches, (worst quality:2), (low quality:2), (normal quality:2), lowres, normal quality, ((monochrome)), ((grayscale)), skin spots, acnes, skin blemishes, age spot, glan

这里主要剔除了绘画风、简笔画、低质量、灰度图,同时去除雀斑、痤疮等皮肤瑕疵。

参数设置

为了让图片生成得更加真实自然,我们需要对参数做一些调整,需要调整的参数如下:

  • Sampler: DPM++ SDE Karras
  • Sample Steps: 28
  • CFG scale: 8
  • Size: 512x768

这里鼓励大家多尝试其他取值,上面只是我认为效果最好的一组参数。

生成

完成上面所有设置后,就可以点击Generate按钮生成图片了。生成速度由你的设备性能决定,在我的电脑上大约30s生成一张图片。

在这里插入图片描述

Stable Diffusion Web Ui生成结果

Stable Diffusion资源列表

好的生成质量离不开好的模型,这里为大家列出了Stable Diffusion预训练模型资源的获取来源。

1. Hugging Face

Hugging Face是一个专注于构建、训练和部署先进开源机器学习模型的网站。

HuggingFace是Stable Diffusion模型创作的首选平台,目前平台上有270多个与Stable Diffusion相关的模型,用"Stable Diffusion"作为关键字就能搜到。

hugging face Stable Diffusion models search results

推荐Dreamlike Photoreal 2.0这个模型,这是一个由Dreamlike.art制作的基于Stable Diffusion v1.5的真实感模型,生成效果非常接近真实照片。

Dreamlike Photoreal collage of sample results

另一个热门模型是Waifu Diffusion,推荐尝试。

2. Civitai

Civitai是一个专为Stable Diffusion AI艺术模型设计的网站。该平台目前有来自250+创作者上传的1700个模型。这是迄今为止我所知的最大的AI模型库。你可以在上面分享自己的模型或生成作品。

在这里插入图片描述

3. Discord

在Stable Diffusion的Discord页面中有一个名为“Models-Embeddings”的专属频道,里面提供了很多可以免费下载的各种模型。

Models-embeddings Discord channel Discord page for Stable Diffusion

4. Rentry for SD

Rentry网站上有一个保存Stable Diffusion模型的页面sdmodels,上面由70多个模型可以免费下载。

stable diffusion list of models on Rentry

使用这些模型资源的时候要注意:下载自定义AI模型会带来危险。例如,某些可能包含NSFW(不安全)内容。

另一个风险是,这些自定义AI模型可能包含恶意代码或恶意脚本,特别是CKPT文件。如果想要更安全地使用AI模型,请尽量选择safetensor文件类型。

相关文章:

万字长文:Stable Diffusion 保姆级教程

万字长文&#xff1a;Stable Diffusion 保姆级教程 2022年绝对是人工智能爆发的元年&#xff0c;前有 stability.ai 开源 Stable Diffusion 模型&#xff0c;后有 Open AI 发布 ChatGPT&#xff0c;二者都是里程碑式的节点事件&#xff0c;其重要性不亚于当年苹果发布iPhone&a…...

WAMP搭建靶场

WAMP W&#xff1a;windows A&#xff1a;apache M&#xff1a;mysql&#xff0c;mariadb P&#xff1a;php 1. 下载phpstudy Windows版phpstudy下载 - 小皮面板(phpstudy) 2. 安装phpstudy 默认安装即可 3. 下载DVWA靶场 https://github.com/digininja/DVWA/archive/…...

Uipath Excel 自动化系列13-ForEachExcelSheet(遍历Sheet)

活动描述 ForEachExcelSheet(遍历Sheet)&#xff1a;遍历Excel中的工作表&#xff0c;可以对 Excel 工作簿中的每个工作表重复一个或多个活动,该活动需与Use Excel File 活动选择的 Excel 文件一起使用。 使用场景&#xff1a;当处理包含多张工作表的 Excel 文件&#xff0c;…...

JDBC快速入门

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; 目录 一、JDBC入门 1.概述 (1)JDBC本质 (2)JDBC好处 2.快速入门 (1)步骤 (2)实践 (3)两个小问题 一、JDBC入门 1.概述 JDBC就是使用Java语言操作关系型数据库的一套API&#xff0c;全称&#xff1a;( Java…...

蓝桥杯三月刷题 第六天

文章目录&#x1f4a5;前言&#x1f609;解题报告&#x1f4a5;星期计算&#x1f914;一、思路:&#x1f60e;二、代码&#xff1a;&#x1f4a5;考勤刷卡&#x1f914;一、思路:&#x1f60e;二、代码&#xff1a;&#x1f4a5;卡片&#x1f914;一、思路:&#x1f60e;二、代…...

分享几个常用的运维 shell 脚本

今天咸鱼给大家分享几个不错的 Linux 运维脚本&#xff0c;这些脚本中大量使用了 Linux 的文本三剑客&#xff1a; awkgrepsed 建议大家这三个工具都要了解并最好能够较为熟练的使用 根据 PID 显示进程所有信息 根据用户输入的PID&#xff0c;过滤出该PID所有的信息 #! /b…...

分隔链表(精美图示详解哦)

全文目录引言分隔链表题目描述与思路实现总结引言 前面&#xff0c;我们熟悉了管理链表中的数据的方法&#xff0c;也了解了几道与链表相关的题目&#xff1a; 戳我看单链表详解哦 在本篇文章中&#xff0c;我们将再了解一道题目&#xff1a;分隔链表&#xff1a; 分隔链表OJ…...

腾讯乐固加固+app签名+多渠道打包

一、腾讯乐固-基础版免费加固-上传未加固的app-下载加固包&#xff08;加固成功会清除原apk的签名信息和多渠道信息&#xff09;https://console.cloud.tencent.com/ms/reinforce/list/basic二、使用AndroidStudio自带工具apksigner对apk重新签名找到apksigner.bat文件 路径D:\…...

Spring Boot整合Redis缓存(Lettuce)

spring-boot-demo-cache-redis 此 demo 主要演示了 Spring Boot 如何整合 redis&#xff0c;操作redis中的数据&#xff0c;并使用redis缓存数据。连接池使用 Lettuce。 Lettuce官网 pom.xml <!-- data-redis --> <dependency><groupId>org.springframework…...

Feign

而Feign则会完全代理HTTP请求&#xff0c;我们只需要像调用方法一样调用它就可以完成服务请求及相关处理。Feign整合了Ribbon和Hystrix&#xff0c;可以让我们不再需要显式地使用这两个组件。 Feign具有如下特性&#xff1a; 支持可插拔的HTTP编码器和解码器; 支持Hystrix和…...

【代码训练营】day54 | 392.判断子序列 115.不同的子序列

所用代码 java 判断子序列 LeetCode 392 题目链接&#xff1a;判断子序列 LeetCode 392 - 简单 思路 这题和之前求最长公共子序列一样。 dp[i] [j]&#xff1a;以i-1为结尾的字符串s 和 以j-1为结尾的字符串t 组成的相同子序列的长度 递推公式&#xff1a; 相等dp[i][j] d…...

【unity3D】创建TextMeshPro(TMP)中文字体(解决输入中文乱码问题)

&#x1f497; 未来的游戏开发程序媛&#xff0c;现在的努力学习菜鸡 &#x1f4a6;本专栏是我关于游戏开发的学习笔记 &#x1f236;本篇是unity的TMP中文输入显示乱码的解决方式 创建 TextMeshPro 中文字体遇到的问题描述解决方式Font Asset Creator 面板扩展中文字体文本遇到…...

JAVA开发(JAVA中的异常)

在java开发与代码运行过程中&#xff0c;我们经常会遇到需要处理异常的时候。有时候是在用编辑器写代码&#xff0c;点击保存的时候&#xff0c;编辑器就提示我们某块代码有异常&#xff0c;强制需要处理。有时候是我们启动&#xff0c;运行JAVA代码的时候的&#xff0c;日志里…...

lesson8-Linux多线程

Linux线程概念 线程在进程内部执行,是OS调度的基本单位OS是可以做到让进程进行资源的细粒度划分的物理内存是以4kb为单位的我们的.exe可执行程序本来就是按照地址空间的方式进行编译的页表映射 - 详细图 理解线程 线程在进程的地址空间内运行, 进程内部具有多个执行流的,而线程…...

python的django框架从入门到熟练【保姆式教学】第四篇

在前三篇博客中&#xff0c;我们介绍了Django的模型层、数据库迁移、视图层和URL路由。本篇博客将介绍Django的模板层&#xff0c;讲解如何使用模板来创建美观的Web页面。 模板层&#xff08;Template&#xff09; Django的模板层是Django应用程序的另一个核心组件。模板是一…...

Codeforces Round 852 (Div. 2)

A Yet Another Promotion 题意&#xff1a;要买n千克物品&#xff0c;第一天的价格为a&#xff0c;第二天的价格为b。第一天有促销活动&#xff0c;每买m千克物品&#xff0c;可以额外获得1千克物品。问最少花费多少可以获得至少n千克的物品。 思路&#xff1a;分类讨论&…...

【PTA Data Structures and Algorithms (English)】7-2 Reversing Linked List

Given a constant K and a singly linked list L, you are supposed to reverse the links of every K elements on L. For example, given L being 1→2→3→4→5→6, if K3, then you must output 3→2→1→6→5→4; if K4, you must output 4→3→2→1→5→6. Input Specif…...

Jetpack Compose 学习汇总

关于 Jetpack Compose 的学习本想只是简单的快速学习一下&#xff0c;结果万万没想到&#xff0c;竟然一下子折腾了好几个月。。。 下面将之前记录的 Jetpack Compose 相关的学习博文进行一个汇总链接整理&#xff0c;方便我以后自己查阅&#xff0c;也希望能帮到一些有正在学…...

【OpenCv】c++ 图像初级操作 | 图像灰度化

文章目录一、图像1、图像信息2、图像种类1&#xff09;二值图像&#xff1a;2&#xff09;灰度图:3&#xff09;彩色图&#xff1a;二、图像转化1、分离彩色图三个通道2、图像灰度化处理一、图像 1、图像信息 Q&#xff1a;图像在计算机中怎么储存&#xff1f; A&#xff1a;…...

VIT(vision transformer)onnx模型解析

背景&#xff1a;transformer在CV领域的应用论文下载链接&#xff1a;https://arxiv.org/abs/2010.11929Pytorch实现代码&#xff1a; pytorch_classification/vision_transformer(太阳花的小绿豆博主实现的代码)有一些大神在研究关于CNNtransformer或者纯用transformer实现。原…...

红黑树的介绍和实现

文章目录1. 红黑树1.1 红黑树的概念1.2 红黑树的性质1.3 红黑树节点的定义1.4 红黑树的插入1.5 红黑树的验证1.6 红黑树与AVL树的比较1. 红黑树 1.1 红黑树的概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以…...

C/C++每日一练(20230310)

目录 1. 用栈实现队列 ★★ 2. 单词搜索 II ★★★ 3. 直线上最多的点数 ★★★ 1. 用栈实现队列 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作&#xff08;push、pop、peek、empty&#xff09;&#xff1a; 实现 MyQueue 类&#xff1a; v…...

Go语言基础知识

常量//定义方式 const a int12;//指定变量类型 const b12;//不指定变量类型&#xff0c;由编译时go自动确认 const(//多行定义方式a12b23 ) //说到const&#xff0c;不得不得不提到的一个参数iota,初始值为0&#xff0c;在用const多行定义的方式中&#xff0c; 如果第一行定义了…...

案例06-没有复用思想的接口和sql--mybatis,spring

目录一、背景二、思路&方案问题1优化问题2优化三、总结四、升华一、背景 写这篇文章的目的是通过对没有复用思想接口的代码例子优化告诉大家&#xff0c;没有复用思想的代码不要写&#xff0c;用这种思维方式和习惯来指导我们写代码。 项目中有两处没有复用思想代码&#…...

如何将项目部署到服务器:从选择服务器到维护应用程序的全流程指南

将项目部署到服务器是一个重要的技能&#xff0c;对于开发人员来说&#xff0c;它是必不可少的。在本文中&#xff0c;我将介绍一些关于如何将项目部署到服务器的最佳实践。一、选择服务器在部署项目之前&#xff0c;你需要先选择一个适合你的服务器。如果你已经有一个可用的服…...

怎么做才能不丢消息?

现在主流的消息队列产品都提供了非常完善的消息可靠性保证机制&#xff0c;可以做到在消息传递的过程中&#xff0c;即使发生网络中断或者硬件故障&#xff0c;也能确保消息的可靠传递、不丢消息。 绝大部分丢消息的原因都是由于开发者不熟悉消息队列&#xff0c;没有正确使用…...

前端基础(十六)_数组对象

数组对象 1、创建数组 // 字面量创建const arr [1, 2, 3, 4, 5, 6]// 构造函数创建const arr2 new Array(1, 2, 3, 4, 5, 6)const arr3 Array(1, 2, 3, 4, 5, 6)2.push (从数组末尾添加元素) a.数组.push(要添加进数组的数组项) b.作用&#xff1a;将要添加的数组项 添加到…...

数据结构-带头双向循环链表

前言&#xff1a; 链表有很多种&#xff0c;上一章结&#xff0c;我复盘了单链表&#xff0c;这一章节&#xff0c;主要针对双链表的知识点进行&#xff0c;整理复盘&#xff0c;如果将链表分类的话&#xff0c;有很多种&#xff0c;我就学习的方向考察的重点&#xff0c;主要…...

3 问 6 步,极狐GitLab 帮助企业构建高效、安全、合规的 DevSecOps 文化

本文来源&#xff1a;about.gitlab.com 作者&#xff1a;Vanessa Wegner 译者&#xff1a;极狐(GitLab) 市场部内容团队 &#x1f512; 安全为何重要&#xff1f;此前&#xff0c;我们分享了&#xff1a; 1. 2023年DevOps发展趋势&#x1f449;重磅&#xff01;GitLab 提出五大…...

SPA(单页应用)知多少

单页面应用程序将所有的活动局限于一个Web页面中&#xff0c;在该Web页面初始化时加载相应的HTML、JavaScript 和 CSS。一旦页面加载完成&#xff0c;单页面应用不会因为用户的操作而进行页面的重新加载或跳转。取而代之的是利用 JavaScript 动态的变换HTML的内容&#xff0c;从…...

Selenium实战【远程控制】【JAVA爬虫】

简介 Selenium RemoteWebDriver是Selenium WebDriver的一个扩展,它可以将测试运行在远程机器上的浏览器中。 使用RemoteWebDriver,可以在本地机器上编写测试脚本,然后将测试请求发送到远程机器上的浏览器中执行。这使得测试可以在多个不同的机器上并行运行,从而加快测试的…...

图片动画化应用中的动作分解方法

作者 | FesianXu 前言 最近基于AI的换脸应用非常的火爆&#xff0c;同时也引起了新一轮的网络伦理大讨论。如果光从技术的角度看&#xff0c;对于视频中的人体动作信息&#xff0c;通常可以通过泰勒展开分解成零阶运动信息与一阶运动信息&#xff0c;如文献[1,2]中提到的&…...

我又和redis超时杠上了

背景 经过上次redis超时排查&#xff0c;并联系云服务商解决之后&#xff0c;redis超时的现象好了一阵子&#xff0c;但是最近又有超时现象报出&#xff0c;但与上次不同的是&#xff0c;这次超时的现象发生在业务高峰期&#xff0c;在简单看过服务器的各项指标以后&#xff0…...

一文带你吃透MySQL数据库!

文章目录1. 索引2. 事务3. 存储引擎4. 锁机制5. MySQL其他知识点文章字数大约1.27万字&#xff0c;阅读大概需要42分钟&#xff0c;建议收藏后慢慢阅读&#xff01;&#xff01;&#xff01;1. 索引 为什么使用索引 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据…...

[学习笔记] 2. 数据结构

数据结构视频地址&#xff1a;https://www.bilibili.com/video/BV1uA411N7c5 数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成。简单来说&#xff0c;数据结构就是设计数据以何种方式组织并存储在计算机中。 比如:列表、集合与字…...

[学习笔记] 3. 算法进阶

算法进阶视频地址&#xff1a;https://www.bilibili.com/video/BV1uA411N7c5 1. 贪心算法 贪心算法&#xff08;又称贪婪算法&#xff09;&#xff0c;是指在对问题求解时&#xff0c;总是做出在当前看来是最好的选择。也就是说&#xff0c;不从整体最优上加以考虑 —— 所做…...

做自媒体真的能赚到钱吗?真的能赚到几十万吗?

自媒体在当今社会已经成为一个热门话题&#xff0c;越来越多的人开始尝试做自媒体&#xff0c;希望能够通过自媒体赚到钱。但是&#xff0c;做自媒体真的能赚到钱吗&#xff1f;能赚到几十万吗&#xff1f;下面我们来一一解答。 首先&#xff0c;做自媒体确实可以赚到钱。随着互…...

QT使用QListWidget显示多张图片

Qt系列文章目录 文章目录Qt系列文章目录前言一、QListWidget 和 QListView 的差异二、显示效果1.操作工作区界面1.主界面头文件2. 主界面实现界面2.左边图片目录展示界面1.图片目录头文件2.图片目录实现文件2.属性窗口区1.属性窗口头文件2.属性窗口实现文件3 源码下载前言 QLi…...

python 打印进度条

import time recv_size0 total_size1024while recv_size < total_size:time.sleep(0.1)recv_size1024#打印进度条percentrecv_size / total_sizeres int(50 * percent) * #print(\r[%-50s] %d%% % (res,int(100 * percent)),end) # end 打印以‘’结尾&#xff0c;打印% 需…...

【微小说】大学日记

感谢B站up主“看见晴晴了吗”的视频提供的灵感&#xff0c;链接&#xff1a;https://www.bilibili.com/video/BV1tA411m7Kc 整篇故事完全虚构&#xff0c;如有雷同纯属巧合。 2019年8月25日 星期天 晴 今天是我进入大学的第一天。早晨&#xff0c;我画了美美的妆&#xff0c;穿…...

ArrayList扩容机制解析

1.ArrayList的成员变量 首先我们先了解一下ArrayList的成员变量。 // 默认初始化大小 private static final int DEFAULT_CAPACITY 10;// 空数组&#xff08;用于空实例&#xff09; // 比如List<String> ls new ArrayList<>(0); private static final Object[…...

jsp-----web应用与开发

jsp基本语法 jsp页面的基本结构 定义变量 <%! %> 表达式&#xff1a;变量、常量、表达式 <% %>代码块、程序段【jsp程序代码即jsp脚本】 <% %>注释 隐藏注释 不会显示在客户的浏览器上&#xff0c;即jsp页面运行后页面上看不到注释内容。同时也不会出…...

洛谷 P1201 [USACO1.1]贪婪的送礼者Greedy Gift Givers

题目链接&#xff1a;P1201 [USACO1.1]贪婪的送礼者Greedy Gift Givers - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目描述 对于一群 n 个要互送礼物的朋友&#xff0c;GY 要确定每个人送出的钱比收到的多多少。在这一个问题中&#xff0c;每个人都准备了一些钱来送礼物…...

php设计模式-组合模式的运用

介绍 PHP的组合模式是一种设计模式&#xff0c;用于将对象组合成树形结构以表示“部分-整体”的层次结构。该模式允许客户端统一处理单个对象和组合对象&#xff0c;使得客户端在处理对象时不需要知道对象是否为单个对象还是组合对象。 在组合模式中&#xff0c;有两种类型的…...

一文教会你如何简单使用Fegin进行远程服务调用

文章目录1、fegin的基本介绍2、fegin的基本使用步骤3、项目中的实际运用4、测试前言在分布式微服务中&#xff0c;少不了会进行不同服务之间的相互调用&#xff0c;比如A服务要调用B服务中的接口&#xff0c;如何简单方便的实现呢&#xff1f;fegin可以来帮助。 1、fegin的基本…...

OpenAI——CLIPs(代码使用示例)

OpenAI——CLIPs(打通NLP与CV) Open AI在2021年1月份发布Contrastive Language-Image Pre-training(CLIP),基于对比文本-图像对对比学习的多模态模型&#xff0c;通过图像和它对应的文本描述对比学习&#xff0c;模型能够学习到文本-图像对的匹配关系。它开源、多模态、zero-s…...

什么样的人更适合创业?那类人创业更容易成功?

创业是一项充满风险和机遇的事业&#xff0c;成功的创业者需要具备一定的素质和能力。那么&#xff0c;什么样的人更适合创业&#xff1f;哪类人创业更容易成功呢&#xff1f;本文将为您介绍几个适合创业的人群和成功创业者的共同特点。 具有创新精神的人 创业需要不断创新&am…...

JavaApi操作ElasticSearch(强烈推荐)

ElasticSearch 高级 1 javaApi操作es环境搭建 在elasticsearch官网中提供了各种语言的客户端&#xff1a;https://www.elastic.co/guide/en/elasticsearch/client/index.html 而Java的客户端就有两个&#xff1a; 不过Java API这个客户端&#xff08;Transport Client&#…...

NFT的前景,元宇宙的发展

互联网的普及和数字技术的广泛应用&#xff0c;成为消费升级的新动力&#xff0c;在不断创造出更好的数字化生活的同时&#xff0c;也改变了人们的消费习惯、消费内容、消费模式&#xff0c;甚至是消费理念&#xff0c;数字经济时代的文化消费呈现出新的特征。 2020年有关机构工…...

C#基础教程20 预处理器指令

文章目录 C#预处理指令教程简介预处理指令格式指令名 参数预处理指令类型条件编译指令if#if 条件表达式宏定义指令总结C#预处理指令教程 简介 预处理指令是在编译代码之前进行的一种处理,可以让程序员在编译前根据需要对代码进行一些修改、调整或者控制。C#语言中的预处理指令…...