diffuser库使用本地模型生成图像
实验目的
使用diffuser库生成图像的文章是很多的,使用方法也并不复杂,安装库后调用现成的模型和接口即可,但是因为网络原因,模型下载总会遇到问题,对于使用服务器的研究者来说,挂梯子并不可行,而且现有的文章对这部分也语焉不详。故本文旨在记录一个更详细、完整、对新手友好的生图过程。
基本认识
扩散生成技术
扩散原本是热力学的概念,指分子无规则热运动而形成的物质传递现象,DDPM论文开天辟地地将扩散用于生成技术提高到了实际应用层面,该算法分为前向扩散和逆向生成两个过程:
其前向扩散过程是向图像不断添加高斯噪声,直到原图完全变成噪声图像,将该过程序列与文本提示词一起输入网络进行训练。
逆向生成过程则是由训练好的网络根据噪声和提示词逐步猜测恢复出原图像的过程。
训练与生成算法的数学表示和生成过程如下图:
diffuser库
首先我们要了解一个开源生成模型——Stable Diffusion,该模型可以说是DDPM技术推动的产物,正如蒸汽机和蒸汽火车、发电机和电灯。该模型完全遵循 DDPM 的前向扩散 + 逆向生成框架,但通过潜在空间优化了计算效率。并且在 DDPM 的基础上引入 LDM、文本引导等技术,使其成为更实用、更强大的生成工具。
而diffuser库则是一个通用的扩散模型工具包,支持多种预训练扩散模型(如 Stable Diffusion、DALL-E、Imagen 等),并提供统一的 API 接口。
总的来说,diffuser
库是封装了扩散生成模型,给开发者提供统一接口的生成模型库。
模型下载
按照官方示例直接跑会报一大串错误:
原因是服务器连接不上,而且模型很大,最好我们手动下载模型,相关文章对这部分只是一句带过:模型很大不太好下
或者用git 手动下载一下
,本文主要对该过程进行补充。
更详细的方法及比较可见快速下载Hugging Face模型,本文参考实现了简单可用的两种方法。
git下载
git
是分布式版本控制系统,可以理解为一个仓库存储了软件不同版本,方便恢复和拉取,在克隆过程中会将仓库的整个历史记录传输到客户端,具体操作可见git菜鸟教程。
Git LFS(Large File Storage)是一个用于Git版本控制系统的扩展,它专门用来管理大型文件,如图像、音频和视频文件。它通过延迟地(lazily)下载大文件的相关版本来减少大文件在仓库中的影响,具体来说,大文件是在checkout
的过程中下载的,而不是 clone
或 fetch
过程中下载的(这意味着你在后台定时 fetch
远端仓库内容到本地时,并不会下载大文件内容,而是在你 checkout
到工作区的时候才会真正去下载大文件的内容)。
对目前来说简单将其理解为git
管理大文件的扩展即可。
安装git
和lfs
的命令及解释如下:
sudo apt-get install git # 安装git
git --version # 查看git版本
mkdir git # 创建文件夹,名称任意
cd git # 进入文件夹
git init # 初始化文件夹为git仓库
git lfs install # 查看lfs是否安装成功有如下输出说明安装成功
Updated git hooks.
Git LFS initialized.
首先进入Hugging Face官网,推荐使用国内镜像网站,点击model选项卡可见各种模型:
搜索后可见该模型的详细界面,点击红框的三个点,和Clone
即可获得git
命令,然后进入到我们先前初始化的git
仓库即可拉取下载:
但是由于git
的机制,拉取仓库时会拉取所有版本的内容,对网络和磁盘要求很高,详细教程也更推荐下面的方式。
镜像网站工具下载
镜像网站基于aria2
开发了huggingface的专用下载工具,支持多现成下载,不断连,使用方法如下:
wget https://hf-mirror.com/hfd/hfd.sh # 下载hfd
chmod a+x hfd.sh # 授予权限
export HF_ENDPOINT=https://hf-mirror.com # 设置环境变量
./hfd.sh 模型名 # 下载模型
启动下载后如下图所示:
下载完成后可以看到整个模型文件,还是比较大的,有二十多个G:
生成库的使用
前面下载好的模型放到项目目录下,生成的示例代码如下:
import torch
from diffusers import StableDiffusionPipeline
import time# 定义管道和预训练模型,未下载的会自动下载, GPU RAM 少于 10GB,
# 加载 StableDiffusionPipeline 时使用 float16 精度,而不是的默认 float32 精度。
model_id = "CompVis/stable-diffusion-v1-4"
# 本地模型路径
model_path="./stable-diffusion-v1-4"start = time.time()
print("正在加载模型...")
pipe = StableDiffusionPipeline.from_pretrained(model_path,revision="fp16", torch_dtype=torch.float16)
# 提示词
prompt = "a photograph of an astronaut riding a horse"
# 使用GPU
pipe.to("cuda")print("正在生成图像...")
image = pipe(prompt).images[0]end=time.time()
print("消耗时间为:",end-start)
# 保存图像
image.save(f"astronaut_rides_horse.png")
其他详细原理和操作可见官方文档,包括使用自训练模型,更改推理过程等,都可以通过继承不同的模块实现。
对应输出和生成的图像如下:
面部细节有些失真,马蹄也有点不统一,但是整体效果还可以。
总结
本文记录了diffuser
库使用CompVis/stable-diffusion-v1-4
模型生成图像的详细过程:
包括库和扩散生成的基本认识;
CompVis/stable-diffusion-v1-4
模型下载;
diffuser
库的使用和生成图像的示例代码。
这是手动生成图像的第一步,但也是关键一步,后续可以根据继承该模型的不同模块,调整参数和生成手段,达到自己想要的效果。
相关文章:

diffuser库使用本地模型生成图像
实验目的 使用diffuser库生成图像的文章是很多的,使用方法也并不复杂,安装库后调用现成的模型和接口即可,但是因为网络原因,模型下载总会遇到问题,对于使用服务器的研究者来说,挂梯子并不可行,…...

递归—基础算法
#基线条件和递归条件 #每个递归函数都有两部分:基线条件和递归条件。递归条件指的是函数调用自己,而基线条件则指的是函数不再调用自己,从而避免形成无限循环。 #栈:栈是一种数据结构,它是一种线性数据结构,…...

全面复习回顾——C++语法篇2
23、字符串相加 string s3;s3s1s2;cout<<s3; 24、结构体基本操作 struct student {// write your code here......string name;int age;double height0.0; };int main() {// write your code here......student s;cin>>s.name;cin>>s.age;cin>>s.hei…...

探秘基带算法:从原理到5G时代的通信变革【十】基带算法应用与对比
文章目录 三、算法在现代通信系统中的应用3.1 5G 通信中的应用3.1.1 信道编码与调制解调3.1.2 大规模 MIMO 技术3.1.3 案例分析:5G 基站与终端实现 3.2 卫星通信中的应用3.2.1 抗干扰与纠错编码3.2.2 信号处理与调制解调3.2.3 案例分析:卫星通信系统实例…...

Linux | Vim 鼠标不能右键粘贴、跨系统复制粘贴
注:本文为 “ Vim 中鼠标右键粘贴、跨系统复制粘贴问题解决方案” 相关文章合辑。 未整理去重。 Linux 入门:vim 鼠标不能右键粘贴、跨系统复制粘贴 foryouslgme 发布时间 2016 - 09 - 28 10:24:16 Vim 基础 命令模式(command - mode&…...

无人机遥控器扩频技术解析!
一、扩频技术基本原理 扩频技术(Spread Spectrum, SS)通过将信号的频谱扩展至远大于原始带宽进行传输,提升抗干扰性、隐蔽性和多用户能力。其核心原理包括: 直接序列扩频(DSSS) 利用高速伪随机码&#x…...

Spring Boot API 项目中 HAProxy 与 Nginx 的选择与实践
在开发 Spring Boot 构建的 RESTful API 项目时,负载均衡和反向代理是提升性能与可用性的关键环节。HAProxy 和 Nginx 作为两种流行的工具,经常被用于流量分发,但它们各有侧重。究竟哪一个更适合你的 Spring Boot API 项目?本文将…...

OpenBMC:BmcWeb构造connect对象
OpenBMC:BmcWeb server.run-CSDN博客 server在接收了tcp连接请求后,会构造一个ConnectionType对象,然后通过post调度,运行该对象的start函数 1.ConnectionType类型 其实也就是using ConnectionType = Connection<Adaptor, Handler>;类型 由于ConnectionType实例化于…...

ORB-SLAM2源码学习(六):相机跟踪(局部地图跟踪和关键帧创建)
目录 1.局部地图跟踪 1.1 更新局部关键帧UpdateLocalKeyFrames 1.2 更新局部地图点(来自局部关键帧)UpdateLocalPoints() 1.3 投影匹配 2. 对比四种跟踪方式以及使用的投影匹配 3.关键帧创建 3.1 判断是否需要创建新关键帧: NeedNewKeyFrame() 3…...

WordPress使用(3)
前面文章讲述了如何利用docker进行wordpress系统的安装及相关设置,本文将介绍如何进行站点数据和数据库数据的备份。 1. 备份数据库 # 进入mysql容器内部 docker exec -it mysqlwp bash# 使用mysqldump 命令导出数据库 mysqldump -u root -p wordpress > wordp…...

Docker基础篇——什么是Docker与Docker的仓库、镜像、容器三大概念
大家好我是木木,在当今快速发展的云计算与云原生时代,容器化技术蓬勃兴起,Docker 作为实现容器化的主流工具之一,为开发者和运维人员带来了极大的便捷 。下面我们一起了解下什么是Docker与与Docker的仓库、镜像、容器三大概念。 …...

Gitlab配置personal access token
1.点击左上角个人账号 -> Preferences 2. 点击左边栏 Access Tokens 3. 点击Add new token ,输入token名称,勾选权限(注意截至日期 “Expiration date” 可不填) 4. 创建成功后,显示token信息,复制到本地…...

使用STM32CubeMX实现LED灯每秒闪烁一次(STM32G070CBT6单片机)
1.打开STM32CubeMX,点击File->New Project,新建一个新工程。 2.搜索芯片型号,选择正确的芯片封装规格,准备对芯片的引脚进行配置。 进行上面的操作后,跳转到如下的页面。 3.选择要配置的引脚进行配置。此处我的LED是…...

django中路由配置规则的详细说明
在 Django 中,路由配置是将 URL 映射到视图函数或类视图的关键步骤,它决定了用户请求的 URL 会触发哪个视图进行处理。以下将详细介绍 Django 中路由配置的规则、高级使用方法以及多个应用配置的规则。 基本路由配置规则 1. 项目级路由配置 在 Django 项目中,根路由配置文…...

游戏引擎学习第138天
仓库:https://gitee.com/mrxiao_com/2d_game_3 资产:game_hero_test_assets_003.zip 发布 我们的目标是展示游戏运行时的完整过程,从像素渲染到不使用GPU的方式,我们自己编写了渲染器并完成了所有的工作。今天我们开始了一些新的内容&#…...

测试理论快速入门
软件测试的目的是什么 查出缺陷 查找程序的错误:测试功能是否可用,添加的功能是否成功添加实现 发现性能问题:查看响应速度是否在可接受范围内 找出兼容性问题:这个功能是否在多端都能成功使用,例如pc端和mo端 确保交…...

【PostgreSQL】如何免密使用PostgreSQL数据库内置工具
如何免密使用PostgreSQL数据库内置工具 方法 1:使用 .pgpass 文件自动输入密码步骤: 方法 2:使用环境变量 PGPASSWORD步骤: 我们在PostgreSQL数据库自带的各种工具时,每次使用都要输入数据库密码。比如在使用pg_dump 备…...

模块15.常用API
文章目录 模块15.常用API第一章.Math类1.Math类介绍2.Math类方法 第二章.BigInteger1.BigInteger介绍2.BigInteger使用 第三章.BigDecimal类1.BigDecimal介绍2.BigDecimal使用3.BigDecimal除法过时方法解决 第四章.Date日期类1.Date类的介绍2.Date类的使用3.Date类的常用方法 第…...

5c/c++内存管理
1. C/C内存分布 int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar 1;int localVar 1;int num1[10] { 1, 2, 3, 4 };char char2[] "abcd";const char* pChar3 "abcd";int* ptr1 (int*)malloc(sizeof(int) * 4);i…...

python实现的可爱卸载动画
在逛掘金时,掘金用户在B站看到的灵感进行的一个卸载窗口的动画效果的实用案例。人类是一种不断在学习的动物,并且是一种模仿能力学习能里比较强的动物。我这里是第三波的学习实践者咯! 相对VUE构建动画效果窗口,我更加喜欢用pytho…...

微服务的春天:基于Spring Boot的架构设计与实践
微服务的春天:基于Spring Boot的架构设计与实践 在如今的技术领域,微服务架构俨然成为了解决复杂系统开发与运维挑战的关键利器。作为一名资深运维和自媒体创作者,笔名Echo_Wish,我将深入探讨基于Spring Boot的微服务架构设计,结合实例代码说明观点,希望能为大家带来启发…...

*VulnHub-FristiLeaks:1.3暴力解法、细节解法,主打软硬都吃,隧道搭建、寻找exp、提权、只要你想没有做不到的姿势
*VulnHub-FristiLeaks:1.3暴力解法、细节解法,主打软硬都吃,隧道搭建、寻找exp、提权、只要你想没有做不到的姿势 一、信息收集 1、扫靶机ip 经典第一步,扫一下靶机ip arp-scan -l 扫描同网段 nmap -sP 192.168.122.0/242、指纹扫描、端口…...

OpenCV 颜色空间:原理与操作指南
颜色空间原理 RGB 颜色空间 RGB(Red, Green, Blue)是最常见的颜色空间,它通过红、绿、蓝三种颜色通道的不同强度组合来表示颜色。在 OpenCV 中,RGB 图像的每个像素由三个 8 位无符号整数(0 - 255)分别表示…...

国产编辑器EverEdit - 超多样式设置
1 设置-编辑-样式 1.1 设置说明 1.1.1 折叠样式 默认为箭头,折叠样式选项如下: 箭头: 矩形和线条 五边形 圆形图标 1.1.2 光标样式 光标用于指示当前用户输入位置,光标样式选项如下: 默认 纤细 字宽 …...

rabbitmq版本升级并部署高可用
RabbitMQ版本升级 先检查是否已经安装rabbitmq rpm -qa|grep rabbitmq|wc -l //如果结果是0,表示没有安装 rpm -e --nodeps $(rpm -qa|grep rabbitmq) //如安装了,则进行卸载 先检查是否已经安装erlang rpm -qa|grep erlang|wc -l //如果结果…...

Visual Studio 2022新建c语言项目的详细步骤
步骤1:点击创建新项目 步骤2:到了项目模板 --> 选择“控制台应用” (在window终端运行代码。默认打印"Hello World") --> 点击 “下一步” 步骤3:到了配置新项目模块 --> 输入“项目名称” --> 更改“位置”路径&…...

Spring Boot使用JDBC /JPA访问达梦数据库
Spring Boot 是一个广泛使用的 Java 框架,用于快速构建基于 Spring 的应用程序。对于达梦数据库(DMDB)的支持,Spring Boot 本身并没有直接内置对达梦数据库的集成,但你可以通过一些配置和依赖来支持达梦数据库。 以下…...

Spring Boot 消息队列(以RabbitMQ为例)
文章目录 RabbitMQ 简介与安装1. RabbitMQ 简介2. RabbitMQ 安装 Spring Boot 集成 RabbitMQ1. 创建 Spring Boot 项目2. 配置 RabbitMQ3. 定义消息队列和交换机4. 发送消息5. 接收消息6. 测试消息发送和接收 RabbitMQ 简介与安装 1. RabbitMQ 简介 RabbitMQ 是一个开源的消息…...

单元测试与仿真程序之间的选择
为什么写这篇文章 现在的工作需求,让我有必要总结和整理一下。 凡事都有适用的场景。首先这里我需要提示一下,这里的信息,可能并不普适。 但是可以肯定一点的是,有些人,不论做事还是写书,上下文还没有交待…...

确认机制面临的挑战
在传输控制协议中,确认机制(ACK 机制)是确保数据可靠交付、实现拥塞控制和丢包恢复的重要组成部分。然而,随着网络环境和业务需求的不断演进,确认机制在实际应用中面临着诸多挑战。今天我们探讨确认机制主要面临的几项…...