2024不可不会的StableDiffusion之反向提示词(六)

news2024/11/18 5:43:10

1. 引言

在之前的文章中,我们先后介绍了Stable Diffusion中的所有关键组件,以及如何根据文本提示词来生成图像的整体流程。在这篇文章中,我将展示如何编辑反向提示词( Negative Prompt)来控制图像生成功能,希望可以为大家提供足够的动力来进行相关研究。

闲话少说,我们直接开始吧!

2. 反向文本提示词概念

反向提示词是我们可以添加到SD模型中的一种额外功能,用于告诉稳定扩散模型我们不想在生成的图像中看到什么。这个功能很流行,可以删除用户不想从原始生成的图像中看到的任何内容。示例图像如下:
在这里插入图片描述

3. 原理理解

让我们从导入所需的库和辅助函数开始。所有这些已经在本系列前面的几个组件部分中使用和解释过了,这里就不再累述,我们直接从函数prompt_2_img 开始讲起。 现在,我们将通过传递一个额外的参数neg_prompts来更改prompt_2_img函数。反向文本提示的工作方式是在进行采样时使用用户指定的文本来替代之前空字符串进行条件嵌入(uncond)。 原理如下:
在这里插入图片描述

4. 代码实现

基于上述分析,我们使用以下代码来实现反向文本提示信息的嵌入,代码如下:

def prompt_2_img(prompts, neg_prompts=None, g=7.5, seed=100, steps=70, dim=512, save_int=False):
    # Defining batch size
    bs = len(prompts)     
    # Converting textual prompts to embedding
    text = text_enc(prompts) 
    
    # Adding an unconditional prompt , helps in the generation process
    if not neg_prompts: uncond =  text_enc([""] * bs, text.shape[1])
    else: uncond =  text_enc(neg_prompts, text.shape[1])
    emb = torch.cat([uncond, text]) 
    # Setting the seed
    if seed: torch.manual_seed(seed)
    # Initiating random noise
    latents = torch.randn((bs, unet.in_channels, dim//8, dim//8))
    
    # Setting number of steps in scheduler
    scheduler.set_timesteps(steps)
    # Adding noise to the latents 
    latents = latents.to("cuda").half() * scheduler.init_noise_sigma
    
    # Iterating through defined steps
    for i,ts in enumerate(tqdm(scheduler.timesteps)):
        # We need to scale the i/p latents to match the variance
        inp = scheduler.scale_model_input(torch.cat([latents] * 2), ts)
        # Predicting noise residual using U-Net
        with torch.no_grad(): u,t = unet(inp, ts, encoder_hidden_states=emb).sample.chunk(2)
        # Performing Guidance
        pred = u + g*(t-u)
        # Conditioning  the latents
        latents = scheduler.step(pred, ts, latents).prev_sample
        # Saving intermediate images
        if save_int: 
            if not os.path.exists(f'./steps'): os.mkdir(f'./steps')
            latents_to_pil(latents)[0].save(f'steps/{i:04}.jpeg')
            
    # Returning the latent representation to output an image of 3x512x512
    return latents_to_pil(latents)

整体代码逻辑和之前的逻辑保持一致,唯一不同的就是对反向提示词的处理,已在上一节进行阐述。

5. 功能验证

接着,我们使用以下代码来验证上述函数的功能,相关代码实现如下:

## Image without neg prompt
images = [None, None]
images[0] = prompt_2_img(prompts = ["A dog wearing a white hat"], neg_prompts=[""],steps=50, save_int=False)[0]
images[1] = prompt_2_img(prompts = ["A dog wearing a white hat"], neg_prompts=["White hat"],steps=50, save_int=False)[0]
    
## Plotting side by side
fig, axs = plt.subplots(1, 2, figsize=(12, 6))
for c, img in enumerate(images): 
    axs[c].imshow(img)
    if c == 0 : axs[c].set_title(f"A dog wearing a white hat")
    else: axs[c].set_title(f"Neg prompt - white hat")

得到结果如下:
在这里插入图片描述

6. 扩展

正如我们所看到的,这是一个非常方便的功能,可以根据大家的喜好对图像进行微调。当然也可以用它来生成一张非常逼真的脸,仅仅需要增加更加详细的文本提示描述。让我们试试:

prompt = ['Close-up photography of the face of a 30 years old man with brown eyes, (by Alyssa Monks:1.1),
 by Joseph Lorusso, by Lilia Alvarado, beautiful lighting, sharp focus, 8k, high res, (pores:0.1),
  (sweaty:0.8), Masterpiece, Nikon Z9, Award - winning photograph']
neg_prompt = ['lowres, signs, memes, labels, text, food, text, error, mutant, cropped, worst quality, 
low quality, normal quality, jpeg artifacts, signature, watermark, username, blurry, made by children, 
caricature, ugly, boring, sketch, lacklustre, repetitive, cropped, (long neck), facebook, youtube,
body horror, out of frame, mutilated, tiled, frame, border, porcelain skin, doll like, doll']

images = prompt_2_img(prompts = prompt, neg_prompts=neg_prompt, steps=50, save_int=False)
out = images[0]

得到结果如下:
在这里插入图片描述

非常整洁!我希望这能引起大家一些关于如何使用文本提示词来控制稳定扩散模型输出的想法。

7. 总结

本文重点介绍了使用反向文本提示词来进行条件嵌入实现控制文本生成图像内容的相关背景知识和具体代码实现,并给出了相应的示例。

您学废了嘛?

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

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

相关文章

导入jar包的办法,若Maven报日志错误,Cannnot resolve XXXXX.jar

相信很多人在进行涉及到java工程项目,都会遇到很多问题,在pom文件中导入jar包,或许会出现cannot resolve XXXXX的问题,从而会报个别的错误。 接下来我将介绍两种导入jar包的方法 导入jar包,从官网直接下载下来相关的…

5-3、S曲线生成器【51单片机+L298N步进电机系列教程】

↑↑↑点击上方【目录】,查看本系列全部文章 摘要:本节介绍步进电机S曲线生成器的计算以及使用 一.计算原理 根据上一节内容,已经计算了一条任意S曲线的函数。在步进电机S曲线加减速的控制中,需要的S曲线如图1所示,横…

2024年【高处安装、维护、拆除】最新解析及高处安装、维护、拆除新版试题

题库来源:安全生产模拟考试一点通公众号小程序 2024年【高处安装、维护、拆除】最新解析及高处安装、维护、拆除新版试题,包含高处安装、维护、拆除最新解析答案和解析及高处安装、维护、拆除新版试题练习。安全生产模拟考试一点通结合国家高处安装、维…

蓝桥杯每日一题-----数位dp练习

题目 链接 参考代码 写了两个,一个是很久以前写的,一个是最近刚写的,很久以前写的时候还不会数位dp所以写了比较详细的注释,这两个代码主要是设置了不同的记忆数组,通过这两个代码可以理解记忆数组设置的灵活性。 im…

ArcGISPro中Python相关命令总结

主要总结conda方面的相关命令 列出当前活动环境中的包 conda list 列出所有 conda 环境 conda env list 克隆环境 克隆以默认的 arcgispro-py3 环境为模版的 my_env 新环境。 conda create --clone arcgispro-py3 --name my_env --pinned 激活环境 activate my_env p…

opensuse安装百度Linux输入法

前言 Linux下有输入法,拼音,百度的都有,但是用起来总感觉不如在windows下与安卓中顺手。 目前搜狗与百度都出了Linux的输入法,但是没有针对OpenSUSE的,只有ubuntu/deepin/UOS的安装包。 本文主要讲的如何把百度Linux输…

如何进行游戏服务器的负载均衡和扩展性设计?

​在进行游戏服务器的负载均衡和扩展性设计时,需要考虑多个方面,以确保服务器的稳定性和可扩展性。以下是一些关键的步骤和考虑因素: 负载均衡的需求分析 在进行负载均衡设计之前,需要深入了解游戏服务器的负载特性和需求。这包括…

记录关于node接收并解析前端上传excel文件formData踩的坑

1.vue2使用插件formidable实现接收文件,首先接口不可以使用任何中间件,否则form.parse()方法不执行。 const express require(express) const multipart require(connect-multiparty); const testController require(../controller/testController)/…

天线阵列车载应用——第1章 介绍 1.1节 汽车工业中的天线阵列:应用和频率范围

1.1 汽车工业中的天线阵列:应用和频率范围 无线通信系统的发展需要新的技术来支持更高质量的通信、新的服务和应用。近年来,汽车无线通信市场得到了极大的扩展。现代汽车使用不同的服务:AM/FM收音机、卫星广播(SDARS)、移动电话通信、数字音频广播(DAB)、远程无钥匙…

Flink面试准备

零. 主要内容 一. Flink 提交 1. Flink怎么提交? Local模式 JobManager 和 TaskManager 共用一个 JVM,只需要jdk支持,单节点运行,主要用来调试。 Standlone模式 Standlone 是Flink自带的一个分布式集群,它不依赖其他的资源调度框架、不依赖y…

Docker进阶篇-CIG重量级监控系统

一、简介 通过docker stats命令可以很方便的查看当前宿主机上所有容器的CPU、内存、网络流量等数 据,可以满足一些小型应用。 但是docker stats统计结果只能是当前宿主机的全部容器,数据资料是实时的,没有地方存储、 没有健康指标过线预警…

YOLOv5改进 | 细节涨点篇 | DySample一种超级轻量的动态上采样算子(效果完爆CARAFE)

一、 本文介绍 本文给大家带来的改进机制是一种号称超轻量级且有效的动态上采样器——DySample。与传统的基于内核的动态上采样器相比,DySample采用了一种基于点采样的方法,相比于以前的基于内核的动态上采样器,DySample具有更少的参数、浮点运算次数、GPU内存和延迟。此外…

深度学习缝模块怎么描述创新点?(附写作模板+涨点论文)

深度学习缝了别的模块怎么描述创新点、怎么讲故事写成一篇优质论文? 简单框架:描述自己这个领域,该领域出现了什么问题,你用了什么方法解决,你的方法有了多大的性能提升。 其中,重点讲清楚这两点&#xf…

Visual Studio 20XX控制台程序鼠标点击阻塞问题

文章目录 方法一方法二 在Visual Studio 20xx编写的控制台程序中,当鼠标点击控制台时,会阻塞控制台程序运行,不按回车无法继续运行。 方法一 右击控制台标题栏,选择属性,去掉快速编辑模式(Q)的勾选,如&…

橘子学linux调优之工具包的安装

今天在公司无聊的弄服务器,想着有些常用的工具包安装一下,这里就简单记录一下。 一、sysstat的安装和使用 1、安装 我是通过源码的方式安装的,这样的好处在于可以自由选择你的版本,很直观。 直接去github上找到sysstat的地址&a…

「深度学习」循环神经网络RNN

一、序列模型的例子 二、数学符号定义 X^{(i)<t>}&#xff1a;训练样本 i 的输入序列的第 t 个元素。 T_{X}^{i}&#xff1a;训练样本 i 的输入序列的长度。 Y^{(i)<t>}&#xff1a;训练样本 i 的输出序列的第 t 个元素。 T_{Y}^{i}&#xff1a;训练样本 i 的输…

医美行业都在用的畅心付分账系统,通过支付分账更好地管理财务

着社会经济的发展&#xff0c;医美行业也在快速的发展。为了提高竞争力与效率&#xff0c;医美机构开始采用美务通分账系统来进行支付分账。美务通分账系统是一种用于将支付款项分配给多个账户的系统。它可以自动将支付款项分成多个部分&#xff0c;分给不同的账户&#xff0c;…

Sklearn、TensorFlow 与 Keras 机器学习实用指南第三版(四)

原文&#xff1a;Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第二部分&#xff1a;神经网络和深度学习 第十章&#xff1a;使用 Keras 入门人工神经网络 鸟类启发我们飞行&#xff0c;牛蒡植…

二叉树的详解

二叉树 【本节目标】 掌握树的基本概念掌握二叉树概念及特性掌握二叉树的基本操作完成二叉树相关的面试题练习 树型结构&#xff08;了解&#xff09; 概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。…

Elasticsearch:基本 CRUD 操作 - Python

在我之前的文章 “Elasticsearch&#xff1a;关于在 Python 中使用 Elasticsearch 你需要知道的一切 - 8.x”&#xff0c;我详细讲述了如何建立 Elasticsearch 的客户端连接。我们也详述了如何对数据的写入及一些基本操作。在今天的文章中&#xff0c;我们针对数据的 CRUD (cre…