本章涵盖
- 生成式 AI 视觉模型、其模型架构以及企业的关键用例
- 使用 Stable Diffusion 的 GUI 和 API 进行图像生成和编辑
- 使用高级编辑技术 - inpainting, outpainting和图像变化
- 企业需要考虑的实用图像生成技巧
生成图像是 Generative Al 的众多用途之一,它致力于通过简单的提示创建独特且真实的内容。 企业越来越多地采用生成式人工智能来开发创新的图像生成和编辑解决方案。 许多创新用例都由此得以实现——从用于建筑创新设计的人工智能架构到时装设计、化身生成、虚拟试衣和虚拟患者医疗培训等等。 这些令人兴奋的产品可以实现其中的一些功能,例如 Microsoft Designer 和 AdobeFirefly,我们将在本章中介绍它们。
在前面的章节中,我们深入研究了生成式人工智能的基础知识以及使我们能够生成文本(包括补全和聊天)的技术。 然而,在本章中,我们将转变方向,探索如何利用生成式人工智能来生成和调整图像。 我们将发现创建图像是一个简单的过程,并强调正确创建图像的一些复杂性。
我们最初的重点是理解促进新图像生成的生成式人工智能方法以及企业必须考虑的整体工作流程。 这些技术的应用非常广泛,在电子商务、娱乐和医疗保健领域尤其有用。 我们还将研究用于图像处理的各种生成人工智能产品和服务。 让我们深入了解吧!
4.1 视觉模型
生成式人工智能视觉模型是可以根据提示生成逼真的新图像和新颖的模型。 让我们首先看一些企业用例和示例,了解这些生成式人工智能视觉模型如何提供帮助。
- 内容创建和编辑:不同行业有多种用例,生成式 AI 视觉模型可以帮助媒体和营销专业人员生成新的主题和场景,从图像中删除不必要或不需要的内容,或应用风格转换。具体用例因行业而异。
- 医疗保健:图像生成人工智能在健康领域有多种用例。 无论是教育和培训医学生还是新技术(见下一点),通过帮助增强和清晰的医学图像来改善患者的诊断和预后最后,它使制药公司能够通过分析新分子、复杂的分子相互作用及其 预测以及优化配方和合成。
- 教育:我们可以根据学生的进步和当前的学习动态创建交互式视觉效果。 这包括现实和多样化的场景,使用数据增强进行训练模拟,以及帮助提高教育者和学生的教学质量。
- 研发:我们可以创建复杂数据结构和关系的更易于解释的视觉表示,否则这些对我们来说可能并不明显。 这些核心元素有助于根据趋势、独特的视觉元素、品牌和布局创建新产品设计,并发现数据中的微妙模式。
- 营销:生成针对特定个人或人群的特定视觉效果; 这还可以包括用于 A/B 测试的不同视觉效果,以了解成功的营销活动。
- 制造:能够快速迭代和可视化新材料和组件,包括装配过程。
- 个性化:这种水平用例可以跨越不同的维度,让我们能够生成个性化的视觉效果。 无论是在电子商务环境中,购物者都可以可视化对象、内容、服装等,为游戏和社交平台创建高度定制和个性化的化身。 最后,时尚和创意领域创造了新的图案、布局、服装设计和家具设计。
让我们看看如何生成这些内容并将其变为现实的真实示例。
- 创意内容:生成式人工智能视觉模型可以生成新颖多样的图像或视频,用于艺术、娱乐或营销目的。 其中一些模型创建了真实但不存在的人的真实面孔,或者修改现有面孔以考虑不同的特征,例如年龄、性别、发型等。例如,图 4.1 显示了使用草莓生成的熊猫。
图 4.1 草莓熊猫
- 图像编辑、内容改进和风格转换:我们可以使用生成式 AI 视觉模型来增强现有图像。 这些可以解决各种问题,例如提高分辨率和质量以及删除不需要的元素。 我们还可以使用一个图像的风格和技术并将其移植到另一个图像上。 例如,下面的图 4.2 向我们展示了一幅西雅图太空针塔的油画,就像是文森特·梵高 (Vincent Van Gogh) 所画的一样。 在这种情况下,梵高的绘画风格被转移到了另一种风格,太空针塔。
图4.2 文森特·梵高所画的西雅图太空针塔油画
- 合成数据:我们可以使用 GenerativeAI 视觉模型创建真实的合成图像。这些合成图像可用于其他 AI 模型的训练和验证数据。 一个例子是网站 https://thispersondoesnotexist.com/,它会生成现实生活中不存在的假人面孔。 综合数据带来挑战; 当我们讨论生成式人工智能挑战时,我们将在本书后面详细介绍。
- 生成工程和设计:我们可以生成新的设计选项,其中包括新的对象和结构,可以帮助我们优化某些标准或约束,例如功能、性能或美观。这些模型可以为产品或数字资产生成独特、新颖的设计,从而减少时间 以及用于手动设计的资源。 下面的图 4.3 显示了一个示例 - 这些椅子针对各种因素进行了优化,例如强度、重量、材料和美观。 它们具有与传统椅子不同的独特且具有未来感的形状。
图 4.3 椅子的强度、美观、材料和重量设计
四种主要的生成式 AI 模型架构类型用于使这些用例和示例成为可能 - Variational Autoencoders 变分自动编码器 (VAE)、Generative Adversarial 生成对抗网络 (GAN)、Diffusion models 扩散模型和Vision Transformers 视觉转换器。我们在前面的章节中看到过。 每种技术都有其优点和缺点,我们概述了适用于它们的场景的正确方法。
- Variational Autoencoders变分自动编码器 (VAE) - 用于生成动物、面部和其他物体的逼真但简单的图像生成。 VAE 适用于需要数据生成的场景 - 新数据点与原始数据点相似但有变化。 此属性还允许 VAE 用于异常检测和推荐系统。
- Generative adversarial networks生成对抗网络(GAN)——GAN 用于数据复杂多样、真实性要求高的场景。 这使得它们适合高质量图像、数据增强和风格迁移。
- Diffusion 扩散 - 基于扩散的模型用于数据高维且连续的场景,我们需要对复杂的数据分布进行建模,生成的质量和速度并不重要。这些模型非常适合生成语音和视频,其中一些我们需要 将在下一章谈到。
- Vision Transformers - 当我们想要生成基于序列的任务的图像时,这些图像非常有用,高度灵活并且适用于许多任务; 他们需要大量的计算资源。
让我们更详细地探讨这些架构
4.1.1 Variational Autoencoders变分自动编码器 (VAEs)
变分自动编码器(VAE)是一种具有重要作用的特定生成模型。 它们通过结合深度学习、概率论和统计力学的各个方面来表示复杂的数据分布。
VAE 包含两个神经网络:编码器和解码器,如图 4.4 所示。 编码器将输入图像映射到捕获其基本特征的低维潜在向量(潜在空间)。 它不仅通过在潜在空间中找到单个点,而且通过找到一个分布来实现这一点。
另一方面,解码器从延迟空间中获取样本并重建原始输入图像,同时添加一些随机性以使其更加多样化。 这种随机性允许我们添加新的数据点,例如输入数据。
两个参数定义潜在状态:mean(均值)和variance(方差)。 顾名思义,平均值是潜在状态的平均值,方差是潜在状态与平均值的测量差异,VAE 使用这些参数从正态分布中采样不同的潜在状态,描述不同潜在状态的可能性的数学函数 通过采样不同的潜在状态,VAE 可以生成与输入数据相似但不相同的不同输出数据。 统计力学为我们提供了一个框架,可以在给定观察者数据的情况下推断潜变量中变量的概率分布。
图 4.4 变分自动编码器架构
VAE 允许的一些关键用途包括:
- 图像生成 - VAE 已广泛用于图像生成,以创建与其训练数据具有相似性的独特图像 - 无论是类人面孔、时装设计还是艺术。
- 图像重建和修复 - 通过学习图像数据的底层结构,VAE 可以重建图像丢失的部分或损坏的部分。 这些重建或填充缺失方面的特性在某些领域非常有用,例如医学成像、利用旧的和具有考古意义的照片等。
- 风格迁移 - VAE 允许我们将图像内容与风格分离,并将风格元素从一幅图像迁移到另一幅图像,如前面图 4.2 中的太空针塔所示。
- 语义图像处理——这与图像重建相似但不同。 由于学习到了潜在空间,VAE 可以让我们通过调整生成图像的特定方面(例如面部表情)来更细粒度地控制生成图像中的特征,而不会影响其他不相关的特征。
VAE 功能强大,但也有缺点,例如模糊性、缺乏多样性以及难以对复杂分布进行建模。 训练它们可能要求很高且不稳定,从而导致模型崩溃。 尽管存在这些挑战,VAE 的成就和潜力仍然处于视觉人工智能研究的前沿,建立在数据、数学和创造力之间的复杂关系之上。
注意:
潜在空间以更简单、更有意义的方式表示复杂的数据。 将其视为一张地图,其中相似的项目彼此靠近,不同的项目相距很远。 这有助于我们发现相似性、生成新数据并更好地理解数据。
4.1.2 Generative Adversarial Networks生成对抗网络(GAN)
生成对抗网络 (GAN[1]) 是使用生成 AI 创建图像的最流行的技术之一。GAN 由两个神经网络组成:一个创建新示例的生成器和一个试图区分真实示例和生成示例的鉴别器。
生成器尝试根据随机噪声或输入数据(例如文本或草图)创建看起来像真实图像的假图像。 鉴别器获取真实图像和虚假图像,并尝试区分两者。
这两个网络以博弈论的方式同时进行相互竞争的训练,以提高其性能。GAN 通过最小-最大游戏进行工作,其中生成器试图最大化判别器的错误,而判别器则试图最小化其错误 。
GAN 使用提示词以及一些随机噪声作为生成器的输入。 然后生成器生成一个尝试匹配提示的图像并将其发送到鉴别器。 鉴别器将生成的图像与来自同一提示词的真实图像进行比较,并给出一个分数,表明它认为该图像的真实程度。 然后使用该分数通过反向传播和梯度下降来更新两个网络的权重。 重复这个过程,直到生成器可以创建满足提示的图像并欺骗鉴别器。
GAN 的目标是让生成器生成可以欺骗鉴别器的真实图像。 下面的图 4.5 显示了 GAN 模型架构的高层次结构。 潜在空间代表生成器的可能输入,并且微调允许调整鉴别器和生成器的参数。
图 4.5 GAN 模型架构
GAN 提供了许多类似的用例,例如 VAE,但特别适合以下用途:
- 图像生成 —— 从噪声中创建逼真的图像,在娱乐、设计和艺术中具有特定的应用,从而生成高质量的图像
- 风格迁移 —— 使艺术风格从一幅图像转换到另一幅图像; 这与 VAE 中的相同。
- 超分辨率 —— GAN 可以帮助增强图像的分辨率,使其更加细致和清晰,这对于医疗和空间成像等某些行业非常有帮助。
- 数据增强 —— 与创建合成数据的 VAE 类似,GAN 有助于为边缘情况或缺乏足够数据或数据多样性的情况创建训练数据。
GAN 可以生成与真实图像没有区别的高质量图像。 尽管如此,它们也有缺点,例如模式崩溃(即产生相同的输出)、不稳定以及难以控制输出。 它们还存在道德问题,因为它们很容易被用来制造深度造假,从而导致隐私侵犯、潜在的错误信息和虚假陈述。 最后,与许多其他人工智能模型一样,GAN(1)可能会无意中使生成输出中的训练数据中存在的偏差永久化。
4.1.3 Vision Transformer Models视觉转化模型(ViT)
Transformer 是另一种可以创建图像的模型架构。 这些架构与我们之前在自然语言处理 (NLP) 任务中看到的架构相同。 尽管如此,它们还是在与视觉相关的任务上运行,被称为视觉转化器(ViT)[2]。
Transformer 是使用注意力机制来处理序列数据(例如文本或语音)的神经网络,可用于生成图像提示。 它们在图像识别等特定任务上也非常有效,并且性能优于以前的领先模型架构。
ViT 模型的架构类似于它的 NLP 模型,尽管有一些变化 - 大量的自注意力层和全局注意力机制,允许模型同时关注图像的所有部分。 Transformers 计算每个输入标记彼此之间的相关程度 输入令牌。 这就是所谓的关注。 代币越多,需要的注意力计算就越多。 注意力计算的数量随着令牌数量的平方而增长,即呈二次方。
然而,对于图像来说,分析的基本单位是像素而不是标记。 典型图像中每个像素对的关系在计算上是令人望而却步的。相反,ViT 计算图像各个小部分(通常为 16x16 大小的像素)中的像素之间的关系,这有助于降低计算成本。 这些 16x6 大小的部分及其位置嵌入被放置在线性序列中,并且是 Transformer 的输入。
如下图 4.6 所示,ViT 模型由三个主要部分组成:左、中、右。 左侧部分显示输入类别,例如“Class”、“Bird”、“Ball”、“Car”等。这些是模型可以分配给图像的可能标签。 中间部分显示了扁平化补丁的线性投影,它将输入图像转换为可以馈送到 Transformer 编码器的向量序列。 最后一部分是 Transformer Encoder。 这包括多个多头注意力和归一化层,用于学习不同图像部分之间的关系。
图 4.6 Vision Transformer (ViT) 架构 [2]
ViT 用于各种图像用例,例如分割、分类和检测,并且通常比以前的技术更准确。 它们还支持微调,可以以少量的方式使用较小的数据集,这使得它们对于我们可能没有太多数据的企业用例非常有用。 ViT 模型旨在为类令牌生成最终向量表示,其中包含有关整个图像的信息。
ViT 也面临挑战——计算成本高、数据稀缺和道德问题。 从训练和推理的角度来看,它们的计算都很复杂,并且可解释性较低——这都是活跃的研究领域。 具有 GPT4 等 ViT 的多模式模型具有广阔的前景并释放新的企业可能性。
4.1.4 Diffusion models 扩散模型
扩散模型是生成机器学习模型,可以从随机噪声(例如图像或音频)创建真实数据。 他们的目标是通过建模数据点如何在潜在空间中扩散来学习数据集的潜在结构。 在此过程中,通过向图像缓慢添加噪声来训练模型,并学习通过从输入中去除噪声来反转该过程,直到它类似于所需的输出。 例如,扩散模型可以通过从随机图像开始然后慢慢去除噪声直到它看起来像熊猫来生成熊猫图像。
视觉扩散模型通常由两部分组成:正向扩散过程和反向扩散过程。 前向扩散过程负责逐渐向图像的潜在表示添加噪声,从而破坏该潜在空间。 反向扩散过程是相反的 - 它负责从损坏的潜在表示重建原始图像。
前向扩散过程通常被实现为马尔可夫链(即,一个没有过去记忆的系统,下一步的概率取决于当前状态)。 这意味着每一步损坏的潜在表示仅取决于前一步的潜在表示。 这使得前向扩散过程高效且易于训练。
反向扩散过程通常作为神经网络实现。这意味着神经网络通过从损坏的潜在表示预测原始潜在表示来学习反转前向扩散过程。 这种反向扩散过程很慢,因为它是逐步重复的。
扩散模型的一些优点是:
- 扩散模型可以生成满足或击败 GAN 生成图像的高质量图像,特别是对于复杂场景,但生成图像需要更长的时间
- 扩散模型不会出现模型崩溃的问题,而模型崩溃是 GAN 的常见问题。 当生成器仅产生有限种类的输出,忽略某些数据分布模式时,就会发生模式崩溃。
- 扩散模型可以通过使用向输入数据添加噪声的马尔可夫链过程来捕获数据分布的全部多样性。
- 扩散模型可以与其他模型(例如自然语言模型)相结合,以创建文本引导生成系统。
Stable Diffusion 是最流行的基于扩散的图像生成模型之一。 其架构由三个主要部分组成,如下图4.7所示。
- 一是文本编码器,它将用户的提示转换为矢量表示。
- 第二部分包括一个去噪自动编码器(称为 UNet),用于从延迟空间重建图像,以及帮助重建原始图像的调度算法。 我们称之为“图像信息创造者”。 UNet 被称为去噪自动编码器,因为它学会从输入图像中去除噪声并生成干净的输出图像。 UNet 是一个具有编码器-解码器结构的神经网络。 编码器部分降低输入图像的分辨率并提取其特征。 另一方面,解码器部分提高分辨率并重建输出图像。
- 第三是变分自动编码器(VAE),用于创建尽可能接近正态分布的图像。
图 4.7 Stable Diffusion 逻辑架构
这些模型之间的选择取决于具体应用、计算资源的可用性、训练数据以及图像质量、速度等非功能性要求。表中列出了一些可以从文本创建图像的更常见的生成式 AI 视觉系统 4.1如下。
表 4.1 最常见的 AI 视觉工具
AI 视觉工具 | 描述 |
---|---|
Imagen | Imagen 是谷歌的文本到图像扩散模型,可以从文本描述生成逼真的图像。 Imagen 在发布时仅提供有限预览,并且已证明能够生成与真实照片无法区分的图像。 |
DALL-E | OpenAI 开发的 Transformer 语言模型可以根据提示创建多样化、原创性、真实性和创造性的图像和艺术。 它可以根据上下文编辑图像,例如添加、删除或更改图像的特定部分。 它从简单的文本提示生成了各种图像,从日常物品到超现实主义艺术。 DALL-E 3 是改进版本,可以生成更逼真、更准确的图像,分辨率提高 4 倍。 |
Midjourney | 基于人工智能的艺术生成器,使用深度学习和神经网络根据提示以及其他图像和视频创建艺术品。 这只能通过 Discord 服务器访问,并且结果可以根据任何审美进行定制,从抽象到现实,为创意表达提供无限的可能性。 |
Adobe Firefly | Adobe Firefly 是一系列创意、生成式 AI 扩散模型,旨在帮助设计师和创意专业人士创建图像和文本效果以及编辑和重新着色。 它很容易使用,尤其是 Adobe 的其他工具,例如 Photoshop 和 Illustrator。 |
Stable Diffusion | Stable Diffusion XL 是一种使用扩散模型的图像生成模型,可使用具有更高级别照片真实感功能的提示创建高质量图像。 它可以从文本描述生成新颖的图像。 |
截至本文发布时,上面列出的许多人工智能视觉模型还不是普遍可用的,只能供一些受邀测试的人使用。这仍然是一个新领域,大多数提供商都进展缓慢,并与少数客户一起学习 在更广泛地推广这些之前。
使用生成式人工智能创建和操作图像是一个令人兴奋且具有挑战性的研究领域,具有许多潜在的应用和影响。然而,它引发了有关生成内容的所有权、真实性和影响的伦理和社会问题。 因此,以负责任和合乎道德的方式使用生成式人工智能,并考虑其对社会的好处和风险非常重要。
4.1.5 多模态模型
多模态模型可以处理不同类型的输入数据。 “模态”是指数据的模式或类型,“多模态”是指多种数据类型。这些类型包括文本、图像、音频、视频等。 例如,GPT4 有一个多模态模型变体,它利用图像和相关提示来进行预测或推理。
Bing Chat 最近启用了这种多模式功能,允许我们在提示中使用图像和文本。 例如,如下图4.8所示,我们给模型提供了两个东西:图像和与图像相关的提示。 在这种情况下,展示一些农产品并询问模型可以用它做什么。
图 4.8 多模态示例 - 同时使用图像和提示
在这种情况下,模型必须理解图像和不同部分(即我们示例中的成分)并与生成答案的提示相关联。 我们看到阴影文本中的响应,表明我们可以制作鳄梨酱、销售、鳄梨吐司等。
多模式模型通常使用不同的人工智能技术。 虽然它们可以利用模型架构的不同组合,在我们的示例中,GPT4 组合了不同的转换器块,如下图 4.9 所示。
图4.9 多模态模型设计
注意:
当显示 transformer 块时,如上图所示,惯例是使用“Nx”,指的是 transformer 块重复多次; 换句话说,它被堆叠了“x”次。 在我们的多模态示例中,所有三个转换器块都是这种情况 - 左侧的图像 (Lx)、右侧的文本 (Rx) 和组合层 (Nx)。
多模态模型在复杂的现实应用程序中特别有用,其中数据有多种形式。 例如:
- Web 应用程序 - 分析文本和图像以进行内容审核和情绪分析。
- 电子商务 - 使用照片和文字描述进行产品推荐。
- 医疗保健 - 使用文本数据(患者病史)和医学成像(图像数据)进行诊断。
- 自动驾驶 - 将传感器数据(雷达和激光雷达)与视觉数据(摄像头)集成,以实现态势感知和决策。
现在我们已经了解了一些模型、它们的输出以及视觉 AI 模型如何工作的一般意义,让我们使用 Stable Diffusion 生成图像。
4.2 Stable Diffusion的图像生成
Stability Al 是Stable Diffusion 背后的公司,拥有先进的基于扩散的模型,其中 SDXL 是迄今为止最新、最强大的模型。 我们可以使用多种选项:
- 自托管 - 模型和相关权重已发布,可通过 Hugging Face (https://huggingface.co/stabilityai) 获取,并且可以自托管; 这需要适当的计算硬件,包括 GPU。
- DreamStudio - 这是 StabilityAI 的消费者应用程序,针对消费者。这是一个简单的 Web 界面,可用于生成图像。 他们还有一个名为 StableStudio 的开源版本,由社区驱动。 有关 DreamStudio 的更多详细信息,请访问 https://dreamstudio.ai/
- 平台 API - Stability AI 有一个我们将使用的平台 API,因为大多数企业更喜欢可以更好地大规模管理的 API。 我们将在此处使用 REST API 作为示例,因为这样可以在所有平台上实现最大的灵活性。 Stable Diffusion 也有 gRPC API,非常相似。
4.2.1 依赖
我们将在第 3 章前面所需的包的基础上进行构建,并假设已安装以下内容:Python、开发 IDE 和虚拟环境(例如 conda)。 为了Stable Diffusion,我们需要以下内容:
- 稳定性AI账户及相关API密钥; 这可以通过 https://platform.stability.ai/account/keys 的帐户页面完成。 帐单详细信息也需要在同一位置设置。 我们 pip 安装 stable-sdk python 包: pip install stable-sdk
- 对 API 密钥保密并遵循管理机密的最佳实践。 我们将使用环境变量来安全地存储密钥。它可以配置如下:
对于 Windows:
setx STABILITY_API_KEY “your-openai-key”
在 Linux/Mac 上:
export STABILITY_API_KEY=your-openai-endpoint
Bash:
echo export STABILITY_API_KEY=“YOUR_KEY”/etc/environment && source /etc/environment
我们首先使用引擎 API 获取所有可用模型的列表,这列出了所有可用的引擎(即模型),如下面的清单 4.1 所示。
清单 4.1 Stable Diffusion - 列出模型
import os
import requests
import json
api_host = "https://api.stability.ai"
url = f"{api_host}/v1/engines/list"
response = requests.get(url, headers={
"Authorization": f"Bearer {api_key}"
})
payload = response.json()
# format the payload for printing
payload = json.dumps(payload, indent=2)
print(payload)
当我们运行时,输出如清单 4.2 所示。 这向我们展示了必须使用的引擎,并有助于端到端测试 API 调用是否有效以及我们可以进行身份验证并获得响应。
清单 4.2 输出 - Stable Diffusion 模型列表
[
{
"description": "Real-ESRGAN_x2plus upscaler model",
"id": "esrgan-v1-x2plus",
"name": "Real-ESRGAN x2",
"type": "PICTURE"
},
{
"description": "Stability-AI Stable Diffusion XL v1.0",
"id": "stable-diffusion-xl-1024-v1-0",
"name": "Stable Diffusion XL v1.0",
"type": "PICTURE"
},
{
"description": "Stability-AI Stable Diffusion v1.5",
"id": "stable-diffusion-v1-5",
"name": "Stable Diffusion v1.5",
"type": "PICTURE"
},
…
]
4.2.2 生成图像
我们使用 Stable Diffusion 图像生成端点(REST API)来生成图像。 我们将使用本文发布时的最新型号,即 SDXL 型号。 该模型对应的引擎 ID 是stable-diffusion-xl-1024-v1-0,正如我们在前面的模型示例列表中看到的那样。 此引擎 ID 是 REST API 路径参数的一部分,可以在以下位置找到:
https://api.stability.ai/v1/generation/engine id)/text-to-image
下面的清单 4.3 显示了使用此 API 生成图像的示例。
清单 4.3 Stable Diffusion - 图像生成
import base64
import os
import requests
import datetime
import re
engine_id = "stable-diffusion-xl-1024-v1-0"
api_host = "https://api.stability.ai"
api_key = os.getenv("STABILITY_API_KEY")
prompt = "Laughing panda in the clouds eating bamboo"
# Set the folder to save the image; make sure it exists
image_dir = os.path.join(os.curdir, 'images')
if not os.path.isdir(image_dir):
os.mkdir(image_dir)
# Function to clean up filenames
def valid_filename(s):
s = re.sub(r'[^\w_.)( -]', '', s).strip()
return re.sub(r'[\s]+', '_', s)
response = requests.post(
f"{api_host}/v1/generation/{engine_id}/text-to-image",
headers={
"Content-Type": "application/json",
"Accept": "application/json",
"Authorization": f"Bearer {api_key}"
},
json={
"text_prompts": [
{
"text": f"{prompt}",
}
],
"cfg_scale": 7,
"height": 1024,
"width": 1024,
"samples": 1,
"steps": 50,
},
)
data = response.json()
for i, image in enumerate(data["artifacts"]):
filename = f"sd_{valid_filename(prompt)}_{i}_{datetime.datetime.now().strftime('%Y%m%d_%H%M%S')}.png"
image_path = os.path.join(image_dir, filename)
with open(image_path, "wb") as f:
f.write(base64.b64decode(image["base64"]))
生成“笑熊猫云吃竹”的图像,如下图4.10所示。 这是一只非常快乐、生动的熊猫。
图 4.10 Stability Diffusion 散生成图像
Stability Diffusion API 公开的一些参数与我们看到的参数类似。 尽管如此,考虑到底层模型架构与我们在下面的表 4.2 中看到的不同,有些还是不同的。 因为我们使用的是 REST API,所以我们还有两组参数 - 一组是标头参数,另一组是正文参数。
表 4.2 Stable Diffusion 标头参数 - 图像创建 API
参数 | 类型 | 默认值 | 描述 |
---|---|---|---|
Accept | String | Blank (application/json) | 响应格式可以是默认(空白)JSON 或设置为 image/png(对于 PNG 图像)。 |
Organization | String | Null (Optional) | 允许将请求范围限定为用户默认组织之外的组织的标记。 此参数可以帮助调试、监视和检测滥用。 |
Stability-Client-ID | String | Null (Optional) | 用于识别请求的来源,例如客户端应用程序或子组织。 此参数可以帮助调试、监视和检测滥用。 |
Stability-Client-Version | String | Null (Optional) | 用于识别发出请求的应用程序或服务的版本。 此参数可以帮助调试、监视和检测滥用。 |
Authorization | String | Bearer API_KEY | 验证 API 调用所需的密钥。 |
下面的表 4.3 概述了构成 API 调用主体的参数,可用于更好地控制模型并引导其更接近我们想要生成的内容。
参数 | 类型 | 默认值 | 描述 |
---|---|---|---|
height | Integer | 512 (Optional) | 图像的高度(以像素为单位)。 它必须以 64 为增量。有效值为: 1024x1024 、 1152x896 、 1216x832 、 1344x768 、 1536x640 、 640x1536 、 768x1344 、 832x1216 、 896x1152 。 请注意,其中一些会根据所使用的引擎而有所不同。 |
width | Integer | 512 (Optional) | 图像的宽度(以像素为单位)。 它必须以 64 为增量。有效值为: 1024x1024 、 1152x896 、 1216x832 、 1344x768 、 1536x640 、 640x1536 、 768x1344 、 832x1216 、 896x1152 。 请注意,其中一些会根据所使用的引擎而有所不同。 |
text_prompts | String | Null (Required) | 一系列文本提示用于生成图像。 该数组中的每个元素由两个属性组成 - 一个是提示本身,另一个是该提示的关联权重。 对于负面提示,权重应该为负。 例子:“文本提示”:[{ “text”: “垫子上的狗”, ”重量”:0.7 }] 文本属性最多可包含 2000 个字符。 |
cfg_scale | String | 7 (Optional) | 它可以在 0 – 35 之间; 它定义了扩散过程遵循提示的严格程度。 值越高,图像越接近提示。 |
clip_guidance_preset | String | None (Optional) | 不同的值控制使用 CLIP 指导的数量,并用于控制所生成图像的质量和相关性。 值为: NONE 、 FAST _BLUE 、 FAST _GREEN 、 SIMPLE 、 SLOW 、 SLOWER 、 SLOWEST |
sampler | String | Null (Optional) | 定义用于扩散过程的采样器。 如果省略此值,API 会自动为您选择合适的采样器。值为: DDIM 、 DDPM 、 K_DPMPP_2M 、 K_DPM_2 、 K_EULER、K_DPMPP_2S_ANCESTRAL 、 K_HEUN 、 K_DPM_2_ANCESTRAL 、 K_LMS 、 K_EULER_ANCESTRAL |
samples | Integer | 1 (Optional) | 指定要生成的图像数量。 值必须在 1 – 10 之间。 |
seed | Integer | 0 (Optional) | 随机种子是决定噪声外观的数字。 保留 0 作为随机种子值。 可能的值介于 0 和 4294967295 之间。 |
steps | Integer | 50 (Optional) | 定义要运行的扩散步骤数。 值在 10 – 150 之间。 |
style_preset | String | Null (Optional) | 用于引导图像模型走向特定的预设风格。 值:3d 模型、模拟电影、动漫、电影、漫画书、数字艺术、增强、幻想艺术、等距、线条艺术、低多边形、建模复合、霓虹朋克、折纸、摄影、 像素艺术,瓷砖纹理、注意:此样式预设列表可能会随着时间的推移而发生变化。 |
让我们看看创建图像的其他一些方法。
4.3 与其他提供商一起生成图像
当我们想要生成图像时,其他一些供应商也有 Generative AI 视觉模型; 但是,他们没有平台或 API。 在本节中,我们将展示其他允许创建图像但没有 API 的平台,并且在大多数情况下需要通过其 GUl 进行访问。
4.3.1 OpenAI DALLE 3
DALLE 3 是 OpenAl 图像生成模型的新版本,可以根据提示创建图像,并且是大多数人可以交互的第一个图像生成模型之一。 DALLE 代表“离散自动编码器语言潜在编码器”,这意味着它使用特殊类型的神经网络将图像和文本编码为标记,然后使用这些标记来创建图像。 DALLE 可以通过 API 和 GUI 来使用。
鉴于使用 DALLE 生成的图像与 StableDiffusion 非常相似,我们在此不详细介绍 API。 本书随附的 GitHub 代码存储库 (https://bit.ly/GenAIBook) 包含 DALLE 的 API 和代码示例。
4.3.2 Bing Image Creator
Bing 有一个内部使用 DALLE 的 Image Creator 应用程序,但它创建的图像得到了增强,并且有些不同。 我们只需要一个网络浏览器就可以使用它; API 未公开。 我们可以通过访问 https://www.bing.com/create 并输入提示来生成图像。 除了提示本身指定的那些之外,没有太多可以进行的调整。
下图4.11展示了“宁静的度假湖边小屋与狗的水彩画”的生成
图 4.11 Bing Create,创建水彩画图像
稍后我们将使用其中一张图像来了解如何编辑图像
4.3.3 Adobe Firefly
Adobe 拥有一套生成式 AI 工具,其中 Firefly 是他们的生成式 AI 模型系列。 它已集成到各种 Adobe 产品中,例如 Photoshop,可通过 https://firefly.adobe.com/ 访问
尽管没有 API,但整体流程和模式与我们之前在 OpenAl 中看到的相同。 登录后,我们会看到一个 Ul,我们输入提示并生成图像。 让我们使用上一个示例中的相同示例。“笑熊猫在云中吃竹子”。 默认创建四张图片,如下图4.12
图 4.12 Adobe Firefly 生成视觉
注意:
谷歌最近发布了名为 Vertex AI 的生成式人工智能 API 套件; 截至发布时,同样基于扩散模型构建的 Vision API 尚不可用。
现在我们已经创建了图像,让我们看看如何编辑和增强这些图像。
4.4 使用 Stable Diffusion 编辑和增强图像
除了生成图像之外,Stable Diffusion 还允许我们编辑和增强图像。我们使用“Stable Diffusion Web UI”(Stable Diffusion 的开源 Web 界面之一)来展示如何使用修复和增强图像。 Web 界面是模型的包装器,虽然它不调用 API,但它具有相同的属性。
我们首先使用之前生成的水彩画图像之一。 在这个例子中,我们屏蔽了两个区域:狗和图像左下角的不同颜色,如下图 4.13 所示。
图4.13 Inpainting sketch 修复草图
当我们将图像上传到 Inpaint 时,Web 应用程序的功能之一是使用 CLIP 模型来询问图像并猜测提示。 尽管我们知道原始生成的提示,但这是一个不同的模型,建议让 Stable Diffusion 找出提示; 我们在下面的图 4.14 中展示了结果。
图4.14 使用CLIP模型猜图提示
如下图 4.15 所示,修复的附加设置可以实现更精细的控制。 其中一些与图像生成相同并且同样重要,例如采样步骤的数量和方法。
图 4.15 Stable Diffusion inpainting options 修复选项
outpainting 是一个附加设置,它将在我们选择的方向上生成和扩展图像。 通过同一设置选项卡上的脚本下拉菜单选择此选项,如下图 4.16 所示。
图 4.16 Stable Diffusion 中的 Outpainting 设置
我们通过使用蒙版删除我们想要的区域,重新生成,然后添加我们需要的新元素来完成修复的迭代。 这些迭代的最终结果如下图 4.17 所示。
图 4.17 使用 Stable Diffusion 进行修复的最终编辑。
注意:
Stable Diffusion Web Ul 的详细信息,包括设置、配置和部署,超出了本书的范围; 然而,它是非常流行的应用程序之一,允许用户在 Windows、Linux 和 MacOS 上自行托管。您可以在其 GitHub 存储库中获取更多详细信息:https://github.com/AUTOMATIC1111/stable-diffusion-webui
4.4.1 使用Image-to-Image API生成
图像到图像是一个强大的工具,用于生成或修改新图像,使用现有图像作为起点和文本提示。 我们可以使用此 API 生成新图像,但更改样式和情绪并添加或删除方面。
让我们使用之前的宁静湖示例,然后使用 Image-to-Image API 生成一个新图像,如下面的清单 4.4 所示。 我们以之前看到的两个示例为基础 - 使用宁静的湖泊作为输入,并要求模型生成“一只快乐的熊猫在天空中吃竹子”
清单 4.4 图像到图像的生成
import base64
import os
import requests
import datetime
import re
engine_id = "stable-diffusion-xl-1024-v1-0"
api_host = "https://api.stability.ai"
api_key = os.getenv("STABILITY_API_KEY")
orginal_image = "images/serene_vacation_lake_house.jpg"
#helper functions
...
response = requests.post(
f"{api_host}/v1/generation/{engine_id}/image-to-image",
headers={
"Accept": "application/json",
"Authorization": f"Bearer {api_key}"
},
files={
"init_image": open(orginal_image, "rb")
},
data={
"image_strength": 0.35,
"init_image_mode": "IMAGE_STRENGTH",
"text_prompts[0][text]": "A happy panda eating bamboo in the sky",
"cfg_scale": 7,
"samples": 1,
"steps": 50,
"sampler": "K_DPMPP_2M"
}
)
data = response.json()
for i, image in enumerate(data["artifacts"]):
filename = f"{valid_filename(os.path.basename(orginal_image))}_img2img_{i}_{datetime.datetime.now().strftime('%Y%m%d_%H%M%S')}.png"
image_path = os.path.join(image_dir, filename)
with open(image_path, "wb") as f:
f.write(base64.b64decode(image["base64"]))
我们看到生成的图像如下面图像到图像 API 调用的图 4.28 左侧所示; 我们看到熊猫和竹子,以及它们如何使用输入图像来设置场景以及生成图像的类型和美感。 但它不符合提示的云方面。
图 4.18 Stable diffusion 图像到图像的生成
4.4.2 使用masking API
Stable Diffusion 还有一个 Masking API,允许我们以编程方式编辑图像的部分内容。 该 API 与创建 API 非常相似,如下面清单 4.5 中的示例所示。 它确实有一些限制 - 遮罩图像需要与原始图像具有相同的尺寸,并且是 PNG,大小小于 4MB。
该 API 具有与我们在讨论图像生成的章节中概述的相同的标头参数; 我们将避免重复这一点。
清单 4.5 Stable Diffusion masking API 示例
import base64
import os
import requests
import datetime
import re
engine_id = "stable-inpainting-512-v2-0"
api_host = "https://api.stability.ai"
api_key = os.getenv("STABILITY_API_KEY")
orginal_image = "images/serene_vacation_lake_house.jpg"
mask_image = "images/mask_serene_vacation_lake_house.jpg"
prompt = " boat with a person fishing and a dog in the boat"
# helper functions
...
response = requests.post(
f"{api_host}/v1/generation/{engine_id}/image-to-image/masking",
headers={
"Accept": 'application/json',
"Authorization": f"Bearer {api_key}"
},
files={
'init_image': open(orginal_image, 'rb'),
'mask_image': open(mask_image, 'rb'),
},
data={
"mask_source": "MASK_IMAGE_BLACK",
"text_prompts[0][text]": prompt,
"cfg_scale": 7,
"clip_guidance_preset": "FAST_BLUE",
"samples": 4,
"steps": 50,
}
)
data = response.json()
for i, image in enumerate(data["artifacts"]):
filename = f"{valid_filename(os.path.basename(orginal_image))}_masking_{i}_{datetime.datetime.now().strftime('%Y%m%d_%H%M%S')}.png"
image_path = os.path.join(image_dir, filename)
with open(image_path, "wb") as f:
f.write(base64.b64decode(image["base64"]))
下面的表 4.4 概述了 API 的所有参数; 在控制模型的选项方面,它的大部分内容与之前的图像创建类似。
表 4.4 Stable Diffusion masking API 参数
参数 | 类型 | 默认值 | 描述 |
---|---|---|---|
init_image | String | Binary(必填) | 我们要编辑的初始图像。 |
mask_source | Sting | Null(必填) | 决定生成区域和相关优势的掩模细节。 它可以是以下之一:MASK_IMAGE_WHITE :使用白色像素作为遮罩; 白色像素被修改; 黑色像素不变。MASK_IMAGE_BLACK :使用黑色像素作为遮罩; 黑色像素被修改,白色像素不变INIT_IMAGE_ALPHA :使用alpha通道作为遮罩; 编辑完全透明的像素; 完全不透明的像素不变。 |
mask_image | Sting | Binary(必填) | 指导需要修改像素的模型的掩模图像。 仅当 mask_source 为 MASK_IMAGE_BLACK 或 MASK_IMAGE_WHITE 时才使用此参数。 |
text_prompts | String | Null(必填) | 一系列文本提示用于生成图像。 该数组中的每个元素由两个属性组成 - 一个是提示本身,另一个是关联的权重。 对于负面提示,权重应该为负。 提示需要遵循以下格式: text_prompts[index][text |
cfg_scale | String | 7(必填) | 它可以在 0 – 35 之间; 它定义了扩散过程遵循提示的严格程度。 值越高,图像越接近提示。 |
clip_guidance_preset | String | None(必填) | 不同的值控制使用 CLIP 指导的数量,并用于控制所生成图像的质量和相关性。 可能的值为: NONE 、 FAST _BLUE 、 FAST _GREEN 、 SIMPLE 、 SLOW 、 SLOWER 、 SLOWEST |
sampler | String | None(必填) | 定义用于扩散过程的采样器。 如果省略此值,API 会自动为您选择合适的采样器。可能的值为: DDIM 、 DDPM 、 K_DPMPP_2M 、 K_DPM_2 、 K_EULER K_DPMPP_2S_ANCESTRAL 、 K_HEUN 、 K_DPM_2_ANCESTRAL 、 K_LMS 、 K_EULER_ANCESTRAL |
samples | Integer | 1(可选) | 定义要生成的图像数量。 值必须在 1 – 10 之间。 |
seed | Integer | 0(可选) | 随机种子是决定噪声外观的数字。 保留 0 作为随机种子值。 可能的值介于 0 和 4294967295 之间。 |
steps | Integer | 50(可选) | 定义要运行的扩散步骤数。 可能的值介于 10 – 150 之间。 |
style_preset | String | Null(可选) | 用于引导图像模型走向特定的预设风格。 可能的值:3d-model、analog-film、anime、cinematic、comic-book、digital-art、enhancement、fantasy-art、isometric、line-art、low-poly、modeling-compound、neon-punk、origami、photographic , 像素艺术 , 瓷砖纹理。注意:此样式预设列表可能会随着时间的推移而发生变化。 |
4.4.3 使用 Upscale API 调整大小
我们想要介绍的最后一个Stable Diffusion API 是升级图像,即生成给定图像的更高分辨率的图像。 默认设置是将输入图像放大两倍,最大像素数为 4,194,304,相当于最大尺寸 2048x2048 和 4096x1024。
该 API 很简单,如下面的清单 4.6 所示。 需要注意的主要事情是通过引擎 id 参数使用正确的模型。
清单 4.6 Stable Diffusion resizing API
import base64
import os
import requests
import datetime
import re
engine_id = "esrgan-v1-x2plus"
api_host = "https://api.stability.ai"
api_key = os.getenv("STABILITY_API_KEY")
orginal_image = "images/serene_vacation_lake_house.jpg"
# helper functions
...
response = requests.post(
f"{api_host}/v1/generation/{engine_id}/image-to-image/upscale",
headers={
"Accept": "image/png",
"Authorization": f"Bearer {api_key}"
},
files={
"image": open(orginal_image, "rb")
},
data={
"width": 2048,
}
)
filename = f"{valid_filename(os.path.basename(orginal_image))}_upscale_{datetime.datetime.now().strftime('%Y%m%d_%H%M%S')}.png"
image_path = os.path.join(image_dir, filename)
with open(image_path, "wb") as f:
f.write(response.content)
现在我们已经使用 GUI 和 API 检查了许多图像生成选项,让我们看看一些适合企业的最佳实践。
AI 生成图像的水印
由于人工智能生成的图像越来越好,而且我们常常无法区分真实图像和人工智能生成的图像,因此有人在推动对人工智能生成的图像加水印。 目前有两种主要方法可以做到这一点:可见水印,如 Bing 和 DALLE 所做的,或不可见水印,它们对我们来说不可见,但嵌入在图像中,可以使用特殊工具检测到。
Google 更进一步,开发了一种名为 SynthID 的新型水印。 每个图像像素中都嵌入了不可见的水印,使其对图像处理(例如滤镜、调整大小和裁剪)更加鲁棒。这样做不会以任何明显的方式降低图像质量,也不会显着改变图像大小。
对人工智能生成的图像添加水印有多种好处。 除了表明图像的来源和可能的所有权之外,它们还有助于阻止未经授权的使用和分发,并最终有助于防止错误信息的传播。
4.4.4 图像生成技巧
下面,我们概述了考虑图像生成时的一些最佳实践。 在企业的背景下,除了某些职能(例如平面设计师和艺术家)之外,许多其他具有不同技能的人也需要帮助。这些建议将帮助他们入门。 我们将在本书后面讨论即时工程时介绍更多细节。
- 详细描述 - 详细描述您想要生成的主要主题。 我们想象或想要的视觉元素可能与模型的解释不匹配,因此添加细节和提示可以引导它更接近您想要的。 许多人还忘记描述背景; 添加这些细节也很重要。
- 氛围和艺术风格 - 指定您想要的氛围或艺术风格; 例如,我们之前在提示中勾勒出一幅画的轮廓。 这个列表是无穷无尽的,在某些方面,取决于你的想象力,从油画到蒸汽朋克再到动作摄影。
- 设置情绪、能量和情绪 - 添加传达情绪、能量和整体情绪的形容词和动词 - 例如,生成的图像旨在积极且高能量,或积极但低能量等
- 手部和脸部生成 - 这些对于许多模型来说都是有问题的。虽然它们正在变得更好,但有时最好将库存或其他图像添加到生成的图像中。
- 结构、尺寸、光线、观看视角——在考虑目标图像的氛围和风格时,还必须考虑文物的尺寸和结构。 例如,我们期望一些小而复杂的东西还是大而独立的东西? 在这些照片中,他们被观察的视角是什么——是特写镜头、长镜头、广角镜头、户外镜头、自然光下的镜头等等? 当然,鉴于它是及时的,它可以结合许多这些东西。
- 文字、徽标、字符 - 图像模型不是LLMs,通常会处理我们期望生成文字的图像(例如,宠物沙龙及其外面的名称)。 这些最好在编辑图像时手动添加。 添加完成后,我们就可以使用inpaint了。
- 避免同时使用多个角色 - 如果在同一提示和生成任务中添加许多角色,模型通常会感到困惑。 最好从较小的任务开始,然后使用修复或手动编辑这些元素。
下一章将展示除了文本和图像之外还可以生成的其他内容。 我们将介绍音频生成器、视频生成器和代码生成器。
4.5 总结
- 基于视觉的生成式人工智能模型使我们能够通过简单的提示创建独特且真实的内容。 这些模型可以生成新内容、编辑和增强现有图像以及使用简单的提示。
- 生成式 AI 视觉模型有多种用例 - 创意内容、图像编辑、合成数据创建和生成设计。
- 有四种主要的生成式人工智能模型架构,每种架构都有优点和挑战。 我们解释了变分自动编码器 (VAE)、生成对抗网络 (GAN)、视觉变换模型 (ViT) 和扩散模型。
- 多模态模型是不同的生成式 AI 模型,使我们能够同时处理不同类型的输入数据,包括文本、图像、音频和视频。
- OpenAI 的 DALLE、Bing、Adobe 和 Stability AI 的 Stable Diffusion 是企业用于图像生成和编辑的一些比较著名和常见的生成 AI 图像模型。 大多数通过 API 公开的东西也有相关的 GUI 界面。
- 许多生成式 AI 视觉模型支持修复(修改图像内的部分)、修复(将图像扩展到其原始边界之外)和创建图像变化。
- 扩散模型对于模型崩溃更加稳健并支持各种输出。
- 最后,在考虑图像时,我们需要考虑场景、主角、结构以及文本和面孔等一些元素,这些元素最好手动完成并编辑到图像中。 这些方面需要添加到生成提示中。 在本书的后面,我们将作为提示工程的一部分讨论这一点。