stable diffusion+LangChain+LLM自动生成图片

最近都在研究和学习stable diffusion和langchain的相关知识,并且看到stable diffusion也是有类似于ChatGLM的api调用方式,那在想有没有可能将stable diffusion也集成到langchain中来呢?看到网上资料比较多的是可以借助chatgpt来辅助stable diffusion提示词的生成,本文就基于此思路来尝试利用LLM+LangChain+stable diffusion实现一句话自动生成图片的功能。

步骤

扩充提示词

使用OpenAI来生成提示词

参照“[AI协同打工,ChatGPT生成提示词+AI作图]”文中的方式生成stable diffusion的提示词

from langchain.prompts import PromptTemplate
from langchain.llms import OpenAI
from langchain.chains import LLMChain_template = """
以下提示用于指导Al绘画模型创建图像。它们包括人物外观、背景、颜色和光影效果,以及图像的主题和风格等各种细节。这些提示的格式通常包括带权重的数字括号,用于指定某些细节的重要性或强调。例如,"(masterpiece:1.4)"表示作品的质量非常重要。以下是一些示例:
1. (8k, RAW photo, best quality, masterpiece:1.2),(realistic, photo-realistic:1.37), ultra-detailed, 1girl, cute, solo, beautiful detailed sky, detailed cafe, night, sitting, dating, (nose blush), (smile:1.1),(closed mouth), medium breasts, beautiful detailed eyes, (collared shirt:1.1), bowtie, pleated skirt, (short hair:1.2), floating hair, ((masterpiece)), ((best quality)),
2. (masterpiece, finely detailed beautiful eyes: 1.2), ultra-detailed, illustration, 1 girl, blue hair black hair, japanese clothes, cherry blossoms, tori, street full of cherry blossoms, detailed background, realistic, volumetric light, sunbeam, light rays, sky, cloud,
3. highres, highest quallity, illustration, cinematic light, ultra detailed, detailed face, (detailed eyes, best quality, hyper detailed, masterpiece, (detailed face), blue hairlwhite hair, purple eyes, highest details, luminous eyes, medium breats, black halo, white clothes, backlighting, (midriff:1.4), light rays, (high contrast), (colorful)"""llm = OpenAI(temperature=0)
prompt = PromptTemplate(input_variables=["desc"],template=_template3,
)chain = LLMChain(prompt=prompt,llm=llm)res = chain.run("湖人总冠军")print(res)
  • 生成的提示词如下:

(masterpiece:1.4), ultra-detailed, 1man, strong, solo, detailed basketball court, detailed stadium, night, standing, celebrating, (fist pump), (smile:1.1), (closed mouth), muscular body, beautiful detailed eyes, (jersey:1.1), shorts, (short hair:1.2), floating hair, (trophy:1.3), (confetti:1.2), (fireworks:1.2), (crowd cheering:1.2), (high contrast), (colorful)

将提示词直接输入到stable diffusion webui中得到结果如下:

image.png

格式化输出

为了确保输出的结果可以方便解析,可以再加入一些引导,最终的提示词如下:

_template = """
以下提示用于指导Al绘画模型创建图像。它们包括人物外观、背景、颜色和光影效果,以及图像的主题和风格等各种细节。这些提示的格式通常包括带权重的数字括号,用于指定某些细节的重要性或强调。例如,"(masterpiece:1.4)"表示作品的质量非常重要。以下是一些示例:
1. (8k, RAW photo, best quality, masterpiece:1.2),(realistic, photo-realistic:1.37), ultra-detailed, 1girl, cute, solo, beautiful detailed sky, detailed cafe, night, sitting, dating, (nose blush), (smile:1.1),(closed mouth), medium breasts, beautiful detailed eyes, (collared shirt:1.1), bowtie, pleated skirt, (short hair:1.2), floating hair, ((masterpiece)), ((best quality)),
2. (masterpiece, finely detailed beautiful eyes: 1.2), ultra-detailed, illustration, 1 girl, blue hair black hair, japanese clothes, cherry blossoms, tori, street full of cherry blossoms, detailed background, realistic, volumetric light, sunbeam, light rays, sky, cloud,
3. highres, highest quallity, illustration, cinematic light, ultra detailed, detailed face, (detailed eyes, best quality, hyper detailed, masterpiece, (detailed face), blue hairlwhite hair, purple eyes, highest details, luminous eyes, medium breats, black halo, white clothes, backlighting, (midriff:1.4), light rays, (high contrast), (colorful)仿照之前的提示,写一段描写如下要素的提示:
{desc}你应该仅以 JSON 格式响应,如下所述:
返回格式如下:
{{"question":"$YOUR_QUESTION_HERE","answer": "$YOUR_ANSWER_HERE"
}}
确保响应可以被 Python json.loads 解析。
"""

最终生成的结果如下:

{"question":"湖人总冠军","answer": "(masterpiece:1.4), ultra-detailed, 1man, strong, solo, detailed basketball court, detailed stadium, night, standing, celebrating, (fist pump), (smile:1.1), (closed mouth), muscular body, beautiful detailed eyes, (jersey:1.1), shorts, (short hair:1.2), floating hair, (trophy:1.3), (confetti:1.2), (fireworks:1.2), (crowd cheering:1.2), (high contrast), (colorful)"
}

这样我们就可以比较方便的解析数据了

# 解析json
import json
result = json.loads(res)
print("result:",result)
result["answer"]

使用ChatGLM来生成提示词

llm = ChatGLM(temperature=0.1,history=prompt_history)
prompt = PromptTemplate(input_variables=["desc"],template=_template,
)chain = LLMChain(prompt=prompt,llm=llm)

ChatGLM基于[ChatGLM 集成进LangChain工具]的封装

最终生成的效果不是很好,这里就不展示了。主要问题包括:1.没有按照指令生成json格式;2.生成的描述很多都是中文形式的。

[MagicPrompt]自动续写SD提示词

from transformers import AutoModelForCausalLM, AutoTokenizer,pipelinetext_refine_tokenizer = AutoTokenizer.from_pretrained("Gustavosta/MagicPrompt-Stable-Diffusion")
text_refine_model = AutoModelForCausalLM.from_pretrained("Gustavosta/MagicPrompt-Stable-Diffusion")
text_refine_gpt2_pipe = pipeline("text-generation", model=text_refine_model, tokenizer=text_refine_tokenizer, device="cpu")text = "湖人总冠军"refined_text = text_refine_gpt2_pipe(text)[0]["generated_text"]print(refined_text)

输出如下:

湖人总冠军 港子 Imoko Ikeda, Minaba hideo, Yoshitaka Amano, Ruan Jia, Kentaro Miura, Artgerm, post processed, concept

纯英文输入,最终的输出如下:

lakers championship winner trending on artstation, painted by greg rutkowski

可见MagicPrompt对于中文输入不是很友好,如果想使用的话,需要将输入先翻译成英文。

调用stable diffusion的api生成图片

参考:[Mikubill/sd-webui-controlnet]。主要代码如下:

import cv2
import requests
import base64
import reENDPOINT = "http://localhost:7860"def do_webui_request(url, **kwargs):reqbody = {"prompt": "best quality, extremely detailed","negative_prompt": "longbody, lowres, bad anatomy, bad hands, missing fingers, extra digit, fewer digits, cropped, worst quality, low quality","seed": -1,"subseed": -1,"subseed_strength": 0,"batch_size": 1,"n_iter": 1,"steps": 15,"cfg_scale": 7,"width": 512,"height": 768,"restore_faces": True,"eta": 0,"sampler_index": "Euler a","controlnet_input_images": [],"controlnet_module": 'canny',"controlnet_model": 'control_canny-fp16 [e3fe7712]',"controlnet_guidance": 1.0,}reqbody.update(kwargs)print("reqbody:",reqbody)r = requests.post(url, json=reqbody)return r.json()
  • 调用api
import io
from PIL import Imageprompt = "a cute cat"
resp = do_webui_request(url=ENDPOINT + "/sdapi/v1/txt2img",prompt=prompt,
)image = Image.open(io.BytesIO(base64.b64decode(resp["images"][0])))
display(image)

如果需要使用api功能,stable diffusion 需要开启api功能,启动时需要加上--api

结合stable diffusion+LangChain+LLM自动生成图片

stable diffusion+LangChain+OpenAI

  • 封装实现
import io, base64
import uuid
from PIL import Imageclass RefinePrompt:llm = OpenAI(temperature=0)prompt = PromptTemplate(input_variables=["desc"],template=_template,)chain = LLMChain(prompt=prompt,llm=llm)def run(self,text):res = self.chain.run(text)# 解析jsonresult = json.loads(res)return result["answer"]class T2I:def __init__(self):self.text_refine = RefinePrompt()def inference(self, text):image_filename = os.path.join('output/image', str(uuid.uuid4())[0:8] + ".png")refined_text = self.text_refine.run(text)print(f'{text} refined to {refined_text}')resp = do_webui_request(url=ENDPOINT + "/sdapi/v1/txt2img",prompt=refined_text,)image = Image.open(io.BytesIO(base64.b64decode(resp["images"][0])))image.save(image_filename)print(f"Processed T2I.run, text: {text}, image_filename: {image_filename}")return image_filename,image
  • 使用封装的类,并且展示图片(在python的notebook中展示)
t2i = T2I()
image_filename,image = t2i.inference("湖人总冠军")
print("filename:",image_filename)
display(image)

image.png

stable diffusion+MagicPrompt

  • 封装实现
from transformers import AutoModelForCausalLM, AutoTokenizer, CLIPSegProcessor, CLIPSegForImageSegmentation
from transformers import pipeline, BlipProcessor, BlipForConditionalGeneration, BlipForQuestionAnswering
import io, base64
import uuid
from PIL import Imageclass T2I:def __init__(self, device):print("Initializing T2I to %s" % device)self.device = deviceself.text_refine_tokenizer = AutoTokenizer.from_pretrained("Gustavosta/MagicPrompt-Stable-Diffusion")self.text_refine_model = AutoModelForCausalLM.from_pretrained("Gustavosta/MagicPrompt-Stable-Diffusion")self.text_refine_gpt2_pipe = pipeline("text-generation", model=self.text_refine_model, tokenizer=self.text_refine_tokenizer, device=self.device)def inference(self, text,image_path=None):image_filename = os.path.join('output/image', str(uuid.uuid4())[0:8] + ".png")refined_text = self.text_refine_gpt2_pipe(text)[0]["generated_text"]print(f'{text} refined to {refined_text}')resp = do_webui_request(url=ENDPOINT + "/sdapi/v1/txt2img",prompt=refined_text,controlnet_input_images=[readImage(image_path) if image_path else None], )image = Image.open(io.BytesIO(base64.b64decode(resp["images"][0])))image.save(image_filename)print(f"Processed T2I.run, text: {text}, image_filename: {image_filename}")return image_filename,image
  • 使用封装的类,并且展示图片(在python的notebook中展示)
t2i = T2I("cpu")
image_filename,image = t2i.inference("lakers championship")
print("filename:",image_filename)
display(image)

image.png

总结

本文使用了stable diffusion+LangChain+LLM来实现一句话自动生成图片的功能,虽然最终的效果还不是很满意,但是可以看出来方案可行的。如果还需要优化效果的话,可以尝试:1.针对特不同模型需要输入该模型的更多的示例来辅助和优化最终模型的生成;2.尝试结合controlnet来更好的控制最终图片的生成。

ps:在学习和参考[Mikubill/sd-webui-controlnet]的代码时,发现了其中有一个模仿“Visual ChatGPT”的示例代码,还挺有意思的,接下来也会进一步分析其实现,敬请期待。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/876201.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习的前沿主题:GANs、自监督学习和Transformer模型

💎 欢迎大家互三:2的n次方_ 💎1. 介绍 深度学习在人工智能领域中占据了重要地位,特别是生成对抗网络(GANs)、自监督学习和Transformer模型的出现,推动了图像生成、自然语言处理等多个领域的创…

【计算机网络】DHCP实验

一:实验目的 1:深入理解DHCP(动态主机配置协议)的工作原理和数据包交换过程。 2:掌握如何通过命令行释放和重新获取IP地址,并通过抓包软件分析DHCP消息的具体内容。 二:实验仪器设备及软件 硬…

什么是死锁,原子性

20240727 一、什么是死锁原子性 一、什么是死锁 原子性

CentOS7下操作iptables防火墙和firewalld防火墙

CentOS7下操作iptables防火墙和firewalld防火墙 💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、…

小程序的运营方法:从入门到精通

随着科技的快速发展,小程序已成为我们日常生活和工作中不可或缺的一部分。小程序无需下载安装,即用即走的特点深受用户喜爱。那么,如何运营好一个小程序呢?下面就为大家分享一些小程序的运营方法。 一、明确目标用户 在运营小程序…

【笔记-软考】层次式架构-数据访问层设计

Author:赵志乾 Date:2024-07-27 Declaration:All Right Reserved!!! 1. 数据访问模式 在线访问:占用一个连接,通过该连接与数据源进行交互;DAO(Data Acess …

每日一练 - Agile Controller业务编排

01 真题题目 下列选项中,属于 Agile Controller 的业务编排的亮点的是:(多选) A.基于三层 GRE 隧道进行编排,业务设备的组网方式、部署位置更加灵活. B.通过拓扑可视化方式进行业务编排,配置简单,管理便捷. C.业务设备的增别,不改变现网转发路由,不改变现网物理拓扑. D.无需…

学习硬件测试01:串口下载+结构体封装说明+程序框架思想+程序框架的搭建+硬件测试程序(P42~P46)

一、串口下载 1.1引入 串口下载就是说用串口来烧录 STM32 的程序。 原因:当调试口(SWD)因为IO口没有设置好等原因被锁定而使用不了时,就需要用串口来更新程序。 1.2如何通过串口烧录程序? 1、选择串口&#xff1a…

python3.7环境搭建

Windows: python各个版本下载链接: Python Releases for Windows | Python.org python3.4以上默认安装了pip pip使用点记录: 1、如果使用了VPN软件,使用pip提示下载失败时,可以先关掉尝试看看问题有没有解决 2、…

每日一题~960 div2 A+B+C(简单奇偶博弈,构造,观察性质算贡献)

A题意: N 长的数组。 一次操作: 最开始的mx 为零。 选出一个数(使得这个数>mx) ,之后将mx 更新为这个数,将这个数置为零。 不能做这个操作的,输。 问是否有先手赢的策略。有的话,输出yes 否则no 当时一…

轻松上手的订单管理系统推荐

本文精选了十款订单管理利器:纷享销客、Zoho CRM、简道云ERP、易订货、盘古云ERP、Cin7 Core、畅捷通T、Salesforce Commerce Cloud、NetSuite、浪潮GS。 市场上有各种各样的订单管理系统,每个看起来功能强大,但到底哪个最适合你的业务需求呢…

mysql的MHA以及故障模拟

目录 MHA概念 MHA的组件 MHA的特点 实验:搭建完成MHA的架构 实验:主备切换 实验结果 实验:故障切换 实验:故障恢复 MHA概念 MHA:高可用模式下的故障切换,基于主从复制。它解决的是单点故障和主从复…

C语言笔记36 •双链表•

1.双向链表的结构 Ps:这⾥的“带头”跟前⾯说的“头节点”是两个概念,实际前⾯的在单链表阶段称呼不严谨,但是为了我们更好的理解就直接称为单链表的头节点。带头链表⾥的头节点,实际为“哨兵位”,哨兵位节点不存储任何…

利用python os datetime subprocess库 实现数据库文件导出

目录 一.前言 二.库的介绍 三.代码及解析 3.1导入需要的库 3.2 : 配置数据库连接信息 3.3定义备份文件存储路径 3.4 实现备份函数 3.4.1确保备份目录存在 3.4.2生成时间戳 3.4.3构建备份文件名和路径 3.4.4 构建 mysqldump 命 3.4.5 执行备份命令 3.4.6处理备份…

《Redis设计与实现》读书笔记-一条命令执行过程

目录 最近在重读《Redis设计与实现》这本书,通过记录笔记,整理知识体系,希望我的笔记分享,能对致力于不断学习的你有点用。 1. 命令请求的执行过程概述 2.1 发送命令请求 2.2 读取命令请求 2.3命令执行(1&#xf…

类和对象 学会啦!

1.组成 属性 行为 2.类和对象的关系 (比方) 类:设计图纸 对象:生产的具体实体 3.面向对象编程 使用对象进行编程,并使用对象来进行具体的工作 示例 class Clock:id Noneprice Nonedef ring(self):import wins…

leetcode 744. 寻找比目标字母大的最小字母

leetcode [744] 寻找比目标字母大的最小字母 方法一: 线性查找 方法一:线性查找 由于给定的列表已经按照递增顺序排序,因此可以从左到右遍历列表,找到第一个比目标字母大的字母,即为比目标字母大的最小字母。 如果目…

基于迁移学习的手势分类模型训练

1、基本原理介绍 这里介绍的单指模型迁移。一般我们训练模型时,往往会自定义一个模型类,这个类中定义了神经网络的结构,训练时将数据集输入,从0开始训练;而迁移学习中(单指模型迁移策略)&#x…

【TypeScript学习打卡第一天】

介绍、常用类型 一、介绍1.概念2.TypeScript 为什么要为 JS 添加类型支持?3.ts的优势 二、ts初体验1.安装编译 TS 的工具包2.编译并运行 TS 代码3.简化运行 TS 的步骤 三、常用类型1.类型注解2.常用基础类型概述(1) 原始类型(2) 数组类型(3) 联合类型(4) 类型别名(5…

【中项第三版】系统集成项目管理工程师 | 第 11 章 规划过程组⑤ | 11.13 - 11.14

前言 第11章对应的内容选择题和案例分析都会进行考查,这一章节属于10大管理的内容,学习要以教材为准。本章上午题分值预计在15分。 目录 11.13 制定预算 11.13.1 主要输入 11.13.2 主要输出 11.14 规划质量管理 11.14.1 主要输入 11.14.2 主要工…