微梦境
一个嵌入式、仅头文件的稳定扩散推理C++库
pixlab.io/tiny-dream
最新动态 🔥
介绍PixLab的Tiny Dream
Tiny Dream是一个仅包含头文件、无依赖、部分未经审查的、用C++编写的Stable Diffusion实现,主要专注于CPU效率和较小的内存占用。Tiny Dream在普通消费级硬件上运行速度相当快,只需要1.7 ~ 5.5 GB的RAM即可执行,不强制要求Nvidia GPU,并且设计用于嵌入更大的代码库(宿主程序)中,提供易于使用的C++ API。其可能性几乎是无限的,或者至少延伸到Stable Diffusion潜在流形的边界。
特性 🔥
完整的特性列表,请参阅此处的官方文档。- 无OpenCV依赖:仅需优秀的stb 单头文件、公共领域C库中的stb_image_write.h用于将图像保存到磁盘。
- 运行Stable Diffusion推理时内存占用最小。
- 易于集成到现有代码库:只需将tinydream.hpp和stb_image_write.h以及预训练模型和资源添加到您的源代码树中。
- 在Intel/AMD CPU上速度相当快(基准测试):使用TBB线程和SSE/AVX矢量化。
- 支持Real-ESRGAN,一个超分辨率网络放大器。
- 完全支持词语优先级:指示模型注意并给予更高优先级的词语(关键词)用括号()包围。
- 支持输出元数据:将元信息链接到输出图像,如版权声明、注释或任何其他您希望与图像关联的元数据。
- 支持Stable Diffusion额外参数:调整种子调整大小和引导比例。
开始使用Tiny-Dream 🔥
将Tiny Dream集成到您现有的代码库中非常简单。以下是无需大量繁琐的阅读和配置即可完成的操作:
下载Tiny-Dream
嵌入Tiny-Dream
- Tiny Dream源代码仅包含两个头文件,即tinydream.hpp和stb_image_write.h。
- 您只需要将这两个C/C++头文件放入您的源代码目录中,然后如下方伪C++代码所示实例化一个新的tinyDream对象:
#include "tinydream.hpp"
/*
* 主入口点。唯一必需的参数是正向提示词。
* 不过,强烈建议也传入负向提示词(用逗号分隔的词语)。
*
* 我们建议您尝试不同的种子值和步数,
* 以达到理想的结果。
*
* ./tinydream "正向提示词" ["负向提示词"] [种子值] [步数]
*/
int main(int argc, char *argv[])
{
tinyDream td; // 栈上分配的tinyDream对象
// 显示库当前的推理引擎、版本号和版权声明
std::cout << tinyDream::about() << std::endl;
// 至少需要通过命令行提供一个正面提示
if (argc < 2) {
std::cout << "缺少正面(可能还有负面)提示:请描述你想要生成的内容..." << std::endl;
std::cout << "提示示例:" << std::endl;
// 内置正面/负面提示的示例
auto prompts = tinyDream::promptExample();
std::cout << "\t正面提示:" << prompts.first << std::endl;
std::cout << "\t负面提示:" << prompts.second << std::endl;
return -1;
}
// 注册负责处理推理过程中生成的日志消息的回调函数
td.setLogCallback(logCallback, nullptr);
// 可选:如果预训练模型不在可执行文件所在目录,请设置资源路径
// Tiny-Dream资源可以从以下地址下载:https://pixlab.io/tiny-dream#downloads
td.setAssetsPath("/path/to/tinydream/assets"); // 如果资源位于可执行文件所在目录,请删除或注释此行
// 可选:为每个新生成的图像名称设置前缀
td.setImageOutputPrefix("tinydream-");
// 可选:设置生成图像的存储目录
td.setImageOutputPath("/home/photos/");
int seedMax = 90;
if (argc > 3) {
/*
* Stable Diffusion中的种子是用于初始化生成过程的数字。
* 控制种子可以帮助你生成可重复的图像,实验其他参数,或提示变化。
*/
seedMax = std::atoi(argv[3]);
}
int step = 30;
if (argc > 4) {
/*
* 调整Stable Diffusion的推理步骤:使用的步骤越多,
* 质量越好,但不应将步骤设置得尽可能高。
* 大约30个采样步骤(默认值)通常足以生成高质量图像。
*/
step = std::atoi(argv[4]);
}
/*
* 用户提供的提示 - 生成符合输入条件的图像。
*
* 正面提示(必需):描述你想要生成的内容(逗号分隔的词语)。
* 负面提示(可选):描述你不想看到的内容(逗号分隔的词语)。
*/
std::string positivePrompt{ argv[1] };
std::string negativePrompt{ "" };
if (argc > 2) {
negativePrompt = std::string{ argv[2] };
}
/*
* 最后,运行Stable Diffusion进行推理
*
* 之前注册的日志消费者回调函数应该很快就会收到
* 推理过程中生成的所有日志消息(包括错误,如果有的话)。
*
* 关于tinyDream::dream()方法所需参数的说明,
* 请参考官方文档:https://pixlab.io/tiny-dream#tiny-dream-method
*/
for (int seed = 1; seed < seedMax; seed++) {
std::string outputImagePath;
td.dream(
positivePrompt,
negativePrompt,
outputImagePath,
true, /* 如果你想要512x512像素的输出而不是2048x2048的输出,请设置为false */
seed,
step
);
}
// 你不需要每次都通过std::cout手动显示生成的图像路径
// 因为提供的日志回调应该已经完成了这项工作。
std::cout << "输出图像位置: " << outputImagePath << std::endl; // 如果太繁琐可以取消注释
}
return 0;
}
学习基础知识(C++ API)
- 上面的代码应该是不言自明的,对于普通的C++程序员来说很容易理解。嵌入Tiny Dream的典型应用程序的完整C++集成代码位于:pixlab.io/tiny-dream#code-gist。
- 在此版本中,库公开了一个名为
tinyDream
的单一类,具有以下导出方法: - 上述方法的详细分步集成指南和调用逻辑位于:pixlab.io/tiny-dream#step-by-step-cpp。
构建Tiny-Dream
- 从源代码构建Tiny-Dream需要现代的C++17编译器,如GCC 7或更高版本、Clang或Microsoft Visual Studio(MSVC)。
- 你还需要链接到默认的后端张量库以生成可执行文件。
- 在此版本中,NCNN 是默认的张量库。在我们的路线图中,我们计划放弃ncnn,转而使用更轻量级的张量库,如SOD或GGML,重点关注CPU效率。
- 或者,你可以依赖构建管理器(如CMAKE)来为你构建可执行文件。Tiny-Dream仓库已经包含了从源代码构建可执行文件所需的必要CMAKE模板。
- 下面展示了一个不依赖外部构建管理器生成高度优化可执行文件的示例:
获取预训练模型和资源
- 一旦编译完可执行文件,你需要让Tiny Dream的预训练模型和资源路径可被你的可执行文件访问。
- Tiny Dream资源包含tinyDream::dream()方法进行稳定扩散推理所需的所有预训练模型(本版本超过2GB)。
- 你可以从PixLab网站的下载部分下载预训练模型。
- 下载后,将资源ZIP压缩包解压到你选择的目录(通常是可执行文件所在的目录),并通过tinyDream::setAssetsPath()或Tiny Dream的构造函数设置完整路径。
继续阅读C++ API参考指南
Tiny Dream C++接口详细说明了Tiny Dream类导出的各种方法的规格。一旦读者理解了Tiny Dream的基本操作原理,该文档应该可以作为参考指南。
待办事项和路线图 🔥
随着我们继续开发和改进Tiny Dream,我们计划了一系列令人兴奋的未来附加功能和增强功能。请参阅pixlab.io/tiny-dream的路线图页面或PixLab博客以获取完整的待办事项列表和正在进行的进展...
- 将张量库迁移到非臃肿的库,如SOD或GGML,专注于CPU性能。
- 为Tiny Dream提供一个使用Dear imGUI实现的跨平台GUI。
- 一旦未来的张量库(SOD或GGML)移植到WASM,提供该库的Web-Assembly版本。
- 输出SVG和易于修改的格式(可能是PSD),而不是静态PNG。
- 提供一个Android概念验证展示APK。
官方文档和资源
相关项目 🔥
你可能会发现以下由PixLab | Symisc Systems开发和维护的生产就绪项目很有用:
- SOD - 一个嵌入式、无依赖的计算机视觉C/C++库。
- FACEIO - 跨浏览器、无密码的面部认证框架。
- PixLab Annotate - 在线图像标注、标签和分割工具。
- ASCII Art - 实时ASCII艺术渲染C语言库。
- UnQLite - 一个嵌入式、支持事务的键值数据库引擎。