百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

stable-diffusion.java, Java调用Stable Diffusion实现AI 画图

qihemm 2025-06-13 09:31 7 浏览 0 评论

今天了解了一个新的项目,stable-diffusion.java, 这是一个Java 项目,通过底层调用stable-diffusion.cpp, 从而让Java 项目也能AI 画图, 好神奇!


stable-diffusion.java的官网(
https://github.com/javaaiorg/stable-diffusion.java)介绍, stable-diffusion.java 项目是基于stable-diffusion.cpp 的Java项目, 在Java平台上调用Stable Diffusion的 AI 模型,实现从文字到图片转换,也支持从图片到图片的transform, 它支持的Stable Diffusion模型包括v1.4, v1.5, v2.1, 目前支持Mac, Windows和Linux 平台。

stable-diffusion.java的使用也非常简单。

一、添加依赖

首先, 在项目中添加依赖:

<dependency>

<groupId>org.javaai.stablediffusion</groupId>

<artifactId>StableDiffusionApi</artifactId>

<version>1.0.4</version>

</dependency>


二、下载Stable Diffusion 模型

然后, 下载Stable Diffusion 模型, 这对于经常使用Stable Diffusion 的人来说是非常简单的:

curl -L -O https://huggingface.co/CompVis/stable-diffusion-v-1-4-original/resolve/main/sd-v1-4.ckpt
# curl -L -O https://huggingface.co/runwayml/stable-diffusion-v1-5/resolve/main/v1-5-pruned-emaonly.safetensors
# curl -L -O https://huggingface.co/stabilityai/stable-diffusion-2-1/resolve/main/v2-1_768-nonema-pruned.safetensors


三、Java 项目中调用Stable Diffusion:加载动态链接库

最后, 就可以在Java 项目中调用Stable Diffusion 了。

调用的时候, 第一步就是要加载动态链接库(dynamic link library):

StableDiffusionLoader.loadShared();


没错的,StableDiffusionApi native 是通过C++来实现的, 还记得最开始介绍的stable-diffusion.cpp吗?


这个是Stable Diffusion 的C++ 版本, 基于ggml,完全通过C++来使用Stable Diffusion。 而stable-diffusion.java 就是stable-diffusion.cpp的Java Binding, 在stable-diffusion.cpp的基础上通过动态链接库,调用stable-diffusion.cpp的方法。

等等, 对于一些AI 小白来说, 什么是GGML?

GGML 是一个用于机器学习的 C 库,允许使用大语言模型在CPU上进行推理。“GG”指的是其创始人 (Georgi Gerganov) 的缩写。

我们一般都或多或少的了解到, 学习AI,尤其是最近的生成式人工智能技术, 非常依赖显卡, 那么这个GGML 又可以做到在CPU 上运行, 甚至不需要显卡, 那这是怎么做到的呢?

答案就在于, 为了做到这一点,GGML使用了量化(quantization)技术,这种量化技术允许 LLM 在消费类硬件上运行,并进行有效的 CPU 推理。

下面这张图片, 非常形象的介绍了什么是量化:


在大语言模型中, 一个典型的LLM,一般包含一个数值矩阵,通常称为权重(weight)。 量化的过程,就是最小化内存消耗,将这些权重转换为更有效的数据类型。

可见, 量化,就是通过数据类型的精度降级,从而减少计算量:


下面这张图解释了LLM中常见的int8、int4等权重长度的单位:

通过采用这种技术,即使是资源最密集的LLM也可以适应在功能较弱的硬件上执行,而不会影响生成响应的速度或准确性。


量化技术根据量化的阶段,有不同的方法,对于在CPU 上进行推理工作而言, GGML 提供了量化的方法。

GGML 支持多种不同的量化策略(例如 4 位、5 位和 8 位量化),每种策略都在效率和性能之间提供不同的权衡。


除了定义低级机器学习原语(如张量类型)之外,GGML 还定义了用于分发大型语言模型 (LLM) 的二进制格式。

四、Java 项目中调用Stable Diffusion

动态库已经封装在相应的jar 里面了, 所以作为Java 程序猿, 只需要执行这个StableDiffusionLoader, 就可以操作Stable Diffusion 了。

如果见到下面的错误, 就要排查动态链接库的加载:

java.lang.UnsatisfiedLinkError: org.javaai.stablediffusion.api.StableDiffusion.newInstance (IZLjava/lang/String; Ljava/lang/String; ZLjava/lang/Boolean; Ljava/lang/String; I)J


如果StableDiffusionAPI 加载成功, 那么就可以创建StableDiffusion 对象:

StableDiffusion sd = new StableDiffusion();


然后加载模型:

sd.loadFromFile(modelPath, null, null, null);


最后, 就可以从文本创建图像了:

StableResult<Txt2ImgParams,BufferedImage> result = sd.txt2img("a lovely cat");


返回值中包含一个Txt2ImgParams 对象和BufferedImage, BufferedImage 就是Stable Diffusion 产生的图像, 而Txt2ImgParams 则包含了调用AI 模型的所有参数, 上面的sd.txt2img("a lovely cat")实际上是一个简化的调用, 下面是参数更多的方法:

StableResult<Txt2ImgParams, BufferedImage> imgs = sd.txt2img("a lovely cat", 
	null, null, null, null, null, 20, 
	(long)(Math.random() * Long.MAX_VALUE), null);

最后一步,就是把BufferedImage 写入本地文件:

for (int i = 0; i < imgs.getResultImages().size(); i ++) {
	BufferedImage img = imgs.getResultImages().get(i);
	ImageIO.write(img, "jpg", new File(outputDir, "sd-java-txt2img-" + i + ".jpg"));
}

就可以得到这种照片啦:


来看一下整体的调用代码:


import org.javaai.stablediffusion.api.SDLogCallback;
import org.javaai.stablediffusion.api.StableDiffusion;
import org.javaai.stablediffusion.api.StableDiffusionLoader;
import org.javaai.stablediffusion.api.Util;

public class Main {
	
	
	public static void main(String[] args) throws Exception {
		
		StableDiffusionLoader.loadShared();
		
		StableDiffusion sd = new StableDiffusion();
		Util.setSDLogCallback(new SDLogCallback() {
			
			@Override
			public void onSDLogCallback(int SDLogLevel, String file, int line, String log) {
				System.out.println(log);
			}
		});
		
		boolean loadFromFile = sd.loadFromFile("/Users/u/Desktop/models/sd-v1-4.ckpt", null, null, null);
		
		System.out.println("load:" + loadFromFile);
		sd.txt2img("test");
		
		
		sd.close();
		
		System.out.println("success");
		
	}

}


stable-diffusion.java 还支持从图生成图, 这里不作进一步介绍了, 有兴趣的可以自行去搭建和体验


#Stable Diffusion##Java# #让AI触手可及##人工智能##Java学习#

相关推荐

VLOOKUP的18种高阶用法大公开!99%的人都不知道的神操作!

作为被头条用户催更的Excel课代表,今天带来让HR追着要模板、让老板主动加薪的VLOOKUP终极指南!从基础到高阶一网打尽,文末送36个行业专用模板!一、为什么你的VLOOKUP总报错?血泪大数据...

Vlooup公式,2种模糊查找匹配,1分钟学会

工作中,VLOOKUP公式使用频率是很高的,用来各种查找匹配问题今天我们分享两种模糊查找匹配问题,一种是文本的模糊查找匹配,一种是数字的模糊查找匹配问题1、文本模糊查找匹配使用模拟数据举个例子,原始数...

与vlookup功能相似的函数,照样搞定表格数据查询,简单还实用

在日常表格数据处理工作,说到数据查询,很多小伙伴首先想到的是Vlookup函数,老师的教程中也多次讲到Vlookup函数的用法和实例。其实在Excel中还有其他的数据查询函数公式或技巧,今天我们先来学...

别再折腾VLOOKUP了!DGET逆向查找10秒通关,小白必看

今天要掀翻一个“过气网红”——VLOOKUP!你是不是也经历过这些崩溃瞬间:逆向查找要交换列顺序,复制粘贴到手软!多条件查找要嵌套MATCH,公式长到怀疑人生!别忍了!今天教你用DGET函数一键封...

职场新人必学!VLOOKUP函数10分钟速成指南

正文:"今天来讲解办公人入职期初函数VLOOKUP,这是所有职场人最重要也是最基础的技能。掌握它,90%的数据查找再不用求人!特别献给刚入职场的你——别让Excel成为加班理由。"——...

巧用Vlookup函数揪出“第三者”(vlookup第三个参数是什么)

在一张Excel表格的重复记录中,让你快速列出每种不同物品第2次或第n次出现的记录,你会怎么做?Vlookup函数就有这个本事。举例来说,产品或者物流表格中往往会记录有同一货物的多笔数据(如下图的今日...

分享12个VLOOKUP超经典用法(vlookup通俗易懂)

刚毕业那会,面试的时候经常会被问到会不会用Excel?我就理直气壮地回答:“会啊。”毕竟,简历上可是写着熟练。接着面试官扔出一句“那你会VLOOKUP吗?”我还是会一口咬定:“我会。“其实,我都没用过...

查找匹配别只知道Vlookup,Sumifs也可以!

工作中遇到查找匹配问题的时候,大家第一反应是不是都想到的Vlookup公式呢,有没有小伙伴们给Sumifs一点点机会的呢,有时候Sumifs比Vlookup更好用1、Vlookup公式举个例子,左边是...

Excel函数讲解:VLOOKUP函数,轻松玩转数据查找

常用函数系列教学:VLOOKUP函数讲解(46)。不懂VLOOKUP函数怎么高效查找数据?闲话少叙直接开讲。基本含义:VLOOKUP函数用于在表格按垂直方向(到)上查找返回行数据。如何使用及注意事项?...

CHOOSEROWS+CHOOSECOLS原来是一个超级查找函数组合!

场景一:要在学生名册中,抽查一名学生成绩。公式:=CHOOSEROWS(A1:D5,2)解析:第一参数A1:D5为数据区域,第二参数2表示提取第2行数据。把数据区域改为A2:D5,结合RANDBETW...

数据查询不止有vlookup函数,自定义zlookup函数查询操作更高效

Excel数据查询,相信大家首先会想到vlookup函数。毋庸置疑vlookup函数在Excel数据查询中作用是非常的强大。但是它也有一些不能实现的数据查询。如上图所示,我们需要根据人员的出现次数,提...

「EXCEL进阶」VLOOKUP函数怎么查询一个值返回多个结果

前言:VLOOKUP函数一般一次只能返回一个结果,本例介绍通过辅助列的方法使VLOOKUP函数查询一个值,返回这个值对应的多个结果。使用场景举例:根据表格中同一数值,返回对应值的多个结果。比如这张数据...

WPS查找能手VLOOKUP函数使用方法讲解

各位同学好!今天我们来深度剖析WPS最实用的查找工具——VLOOKUP函数。这个函数能帮你在表格中快速定位并提取所需数据,可以帮你快速核对两批数据差异,还可以合并多个表格的关联信息,甚至可以帮你制作动...

Excel常用10个函数:跨表查找Vlookup,适用于大数据中查找精确值

Hello大家好,我是Office米,今天,我们将和大家一起分享交流,常用的10个函数之一:查找引用函数VLOOKUP。在说VLOOKUP函数之前,我们要先了解,平时Excel日常工作中会遇到哪些问题...

掌握了这个套路,无论用 Excel vlookup 函数查找第几次结果都很轻松

用vlookup查找默认情况下是一对一出结果,如果要一对多查找,就需要用到各种技巧,具体方法我写过非常多了,可以搜索一下历史记录。只要掌握了今天这个套路,无论你想查找第几次重复值,都易如反掌。案例...

取消回复欢迎 发表评论: