Python| 如何使用 DALL·E 和 OpenAI API 生成图像(1)

news2024/11/19 18:34:41

引言

想象一下,只要描述你想要的画面,电脑就能帮你画出来。这在几年前还像是科幻小说里的场景,但随着神经网络和潜在扩散模型(LDM)技术的发展,现在已经成为可能。OpenAI 推出的 DALL·E 工具,因其能生成令人惊叹的艺术作品和逼真的图像而广受欢迎。

你可以通过 OpenAI 的 API 访问 DALL·E,这样你就可以将它的功能集成到你的 Python 程序中。

本教程[1]将带你:

  • 快速上手 OpenAI 的 Python 库
  • 探索与图像生成相关的 API 调用
  • 根据文本提示生成图像
  • 制作生成图像的不同版本
  • 将 Base64 格式的 JSON 响应转换成 PNG 图像文件

环境准备

如果你对 DALL·E 的强大功能感到好奇,并希望将其集成到你的 Python 项目中,那么这篇文章正是你需要的。在本节中,你将快速了解如何开始在你的代码中利用 DALL·E 来创建图像。

  • 安装 OpenAI Python 库

请确保你的 Python 版本至少是 3.7.1,并创建一个虚拟环境来隔离项目依赖。接下来,安装 OpenAI 提供的 Python 库,以便使用 DALL·E 的功能。

$ python --version
Python 3.12.5
$ python -m venv venv
source venv/bin/activate
(venv) $ python -m pip install openai

openai 包让您可以访问完整的 OpenAI API。在本教程中,您将重点关注图像生成,它使您可以与 DALL·E 模型交互,根据文本提示创建和编辑图像。

  • 获取您的 OpenAI API 密钥

您需要 API 密钥才能成功进行 API 调用。注册 OpenAI 并通过单击仪表板菜单,然后单击导航菜单左下角的 API 密钥来创建新的项目 API 密钥:

alt

在此页面上,您可以创建和管理您的 API 密钥,这使您可以访问 OpenAI 通过其 API 提供的服务。您可以创建和删除密钥。单击“创建新密钥”以创建新的 API 密钥,并复制弹出窗口中显示的值。复制此键的值,以便稍后可以在项目中使用它。您只会看到该键值一次。

  • 将您的 API 密钥保存为环境变量

保存 API 密钥并使其可用于 Python 脚本的一种快速方法是将其保存为环境变量。选择您的操作系统以了解如何:

(venv) $ export OPENAI_API_KEY="<your-key-value-here>"

通过执行这条指令,你可以在当前的终端会话中设置一个名为 OPENAI_API_KEY 的环境变量,以便访问你的 API 密钥。请记住,一旦你关闭了终端窗口,这个密钥就会失效。

你可以根据个人喜好来命名这个环境变量,但如果你按照 OpenAI 的官方文档建议,使用 OPENAI_API_KEY 这个名字,那么你就能够直接使用文档中的代码示例,无需进行额外的配置。

现在,准备工作已经完成,你的 API 密钥也已安全存储,你可以开始根据文本提示来生成图像了。

根据文本描述生成图像

首先,通过命令行界面调用 openai 库来确保你的环境已经配置完毕,准备开始使用。

(venv) $ openai api images.generate -p "a vaporwave computer"

该命令将向 OpenAI 的图像 API 发送请求,并根据文本提示“蒸汽波计算机”创建图像。因此,您将收到一个 JSON 响应,其中包含指向您新创建的图像的 URL:

{
  "created"1723549436,
  "data": [
    {
      "b64_json"null,
      "revised_prompt"null,
      "url""https://oaidalleapiprodscus.blob.core.windows.net/private/org
      ⮑ -H8Satq5hV2dscyutIStbN89m/user-O5O8mpE4TugEI9zqpxx8tGPt/img-4rDZEQ
      ⮑ leCdzAD3fuWowgLb5U.png?st=2024-08-13T10%3A43%3A56Z&se=2024-08-13T1
      ⮑ 2%3A43%3A56Z&sp=r&sv=2024-08-04&sr=b&rscd=inline&rsct=image/png&sk
      ⮑ oid=d505667d-d6c1-4a0a-bac7-5c84a87759f8&sktid=a48cca56-e6da-484e-
      ⮑ a814-9c849652bcb3&skt=2024-08-12T23%3A00%3A04Z&ske=2024-08-13T23%3
      ⮑ A00%3A04Z&sks=b&skv=2024-08-04&sig=c%2BBmroDkC0wkA2Lu8MxkvXH4xjdW5
      ⮑ B18iQ4e4BwJU6k%3D"

    }
  ]
}

单击您的 URL 或将其复制并粘贴到浏览器中以查看图像。这是 DALL·E 针对这一要求设想的图像:

alt

你的生成图像会是独一无二的。这是因为扩散模型仅在你发起请求时才生成图像。

提示:你生成的图像的链接仅在一小时内有效,所以如果你对生成的图像感到满意并希望长期保存,请务必及时将其下载到你的电脑上。

当你向 API 发送请求时,需要遵守 OpenAI 的使用条款。如果你提供的文本提示违反了这些条款,你将收到错误提示,并且如果屡次违规,你的账户可能会被封禁。

既然你已经验证了所有设置都正确无误,并且对使用 OpenAI API 生成图像的功能有了初步了解,接下来你将学习如何将其整合到 Python 脚本中。

调用 API

能够通过命令行界面(CLI)生成图像固然不错,但如果能将这项功能集成到你的 Python 应用中就更棒了。你可以借此构建许多激动人心的项目!

打开你常用的代码编辑器,编写一个脚本。这个脚本将用于根据文本提示生成图像,操作方式与你之前在命令行中进行的操作类似。

但这一次,你将明确指定要使用的 DALL·E 模型版本:

from openai import OpenAI

client = OpenAI()

PROMPT = "A vaporwave computer"

response = client.images.generate(
    model="dall-e-3",
    prompt=PROMPT,
)

print(response.data[0].url)

与之前类似,这段代码向 API 发送了一个经过认证的请求,根据 PROMPT 中的文本生成一张图片。这段代码还做了一些优化,以便你在脚本中添加更多功能:

第 3 行初始化了 OpenAI 的一个实例,并将其存储为 client。这个实例已经包含了身份验证信息,因为你已经将环境变量命名为 OPENAI_API_KEY。如果你遵循了这个命名规则,它会自动从你的环境变量中获取 API 密钥值。当然,你也可以在创建实例时直接通过 api_key 参数传递 API 密钥。

第 5 行将文本提示定义为一个常量。这样做的好处是,如果你需要修改提示文本,只需要在脚本顶部找到这个常量并进行修改,非常方便。

第 7 行调用了 client.images.generate() 方法。接下来的几行代码展示了你可以传递给这个方法的一些参数。

第 8 行指定使用更新的 DALL·E 3 模型,它不仅以不同的方式处理你的提示,还支持不同的参数设置、图片尺寸和质量,与默认的 DALL·E 2 模型有所区别。

第 9 行将 PROMPT 的值传递给名为 prompt 的参数。这样,你就为 DALL·E 提供了用于生成图片的文本。别忘了,你之前在命令行中调用 API 时也传递了文本提示。

最后,你还需要获取生成图片的 URL,以便在线查看。为此,你需要访问响应对象的 .url 属性,并在第 12 行将其值打印到终端。

当你执行这个脚本时,你将得到一个类似于之前的输出,但现在只会显示 URL,而不会显示完整的 JSON 响应。

(venv) $ python create.py
https://oaidalleapiprodscus.blob.core.windows.net/private/org-H8Satq5hV2d
⮑ scyutIStbN89m/user-O5O8mpE4TugEI9zqpxx8tGPt/img-hMAEPhuqVH73JMRQ6BOV4J
⮑ Hz.png?st=2024-08-13T10%3A56%3A54Z&se=2024-08-13T12%3A56%3A54Z&sp=r&sv
⮑ =2023-11-03&sr=b&rscd=inline&rsct=image/png&skoid=d505667d-d6c1-4a0a-b
⮑ ac7-5c84a87759f8&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2024-0
⮑ 8-12T21%3A36%3A11Z&ske=2024-08-13T21%3A36%3A11Z&sks=b&skv=2023-11-03&s
⮑ ig=D7K6UF353uO3wJDOovbeyBsn2yaf384kEotVbjJ5SB4%3D

单击链接或将其粘贴到浏览器中以查看生成的图像。因为您现在使用的是 DALL·E 3 模型,所以输出可能看起来更引人注目:

alt

这表明图像的质量和细节有了显著提高,看起来新模型对蒸汽波风格的理解更加深入。

虽然这很有可能,但在背后还有一些其他因素也在影响着图像细节的提升。当你请求使用 DALL·E 3 模型生成图像时,它会在生成图像前对你的提示进行重新编辑。

如果你想知道 DALL·E 在生成图像时实际使用的修改后的提示是什么,你可以通过 .revised_prompt 属性来查看。

# ...

print(response.data[0].revised_prompt)

在请求生成图像时,通常来说,提供更详细的描述会得到更理想的结果。在你的描述中加入更多的细节可以大幅提升效果!例如,下面是生成上面图像所用的详细描述:

想象一台带有蒸汽波风格的计算机;它像是一台80年代的老式机器,被霓虹粉和蓝色光晕所包围。它的设计充满了怀旧感,机身装饰着复古的字体。外壳上印有发光的数字棕榈树,让人联想到老式视频游戏中的场景。背景中可以看到希腊雕塑和蒸汽波设计中常见的故障日落图案,完美地结合了现代与复古的元素。

这比你最初提供的描述要详细得多!

注意:只有对 DALL·E 3 模型的请求才会进行提示重写,所以如果你使用的是 DALL·E 2,这个属性将不存在。

虽然 DALL·E 3 能够生成更令人印象深刻的图像,但它不允许你关闭提示重写功能,这意味着你对输出的控制会减少。此外,这个模型目前还没有完全开放所有功能。

因此,在本教程的后续部分,你将继续使用 DALL·E 2。首先,编辑脚本,在调用 .generate() 方法时添加一些额外的参数。同时,不妨也为你最初的描述增加一些细节:

from openai import OpenAI

client = OpenAI()

PROMPT = "An eco-friendly computer from the 90s in the style of vaporwave"

response = client.images.generate(
    model="dall-e-2",  # Default
    prompt=PROMPT,
    n=1,
    size="256x256",
)

print(response.data[0].url)

你已经为你的描述增加了一些细节,并切换回了默认的 DALL·E 2 模型。此外,你还添加了两个新参数来进一步定制生成的图像:

第 10 行将数字 1 指定给参数 n。这个参数允许你定义想要根据描述生成的新图像数量。n 的值应在 1 到 10 之间,默认为 1。

第 11 行设置了 size 参数的值。通过这个参数,你可以指定 DALL·E 生成图像的尺寸。这个参数需要是一个字符串,可用的尺寸会根据你使用的模型而有所不同。对于 DALL·E 2,可选的尺寸有 "256x256"、"512x512" 或 "1024x1024"。每个字符串都代表了你将收到的图像的像素尺寸,默认为最大的 "1024x1024"。

在你的脚本最后,你再次将生成图像的 URL 输出到终端。你已经移除了打印 .revised_prompt 的代码行,因为在 DALL·E 2 中这个值是不存在的。

当你执行脚本后,你会得到一个新的 URL 作为回应。点击这个链接或将其复制到你的浏览器中,就可以查看生成的图像了。和之前一样,你的图像会有所不同,但应该与你在 PROMPT 中使用的描述相似。由于你这次使用的是 DALL·E 2,所以图像的细节可能会比上一次少一些。

alt

你可能会注意到,这次生成的图像比你之前创建的要小得多。这是因为你通过 size 参数指定了生成一张 256x256 像素的图片。较小的图像成本较低,所以你刚刚省下了一笔费用!作为一个节省成本的成功者,也许你还想保存其他东西——比如你的图像数据。

Reference
[1]

Source: https://realpython.com/generate-images-with-dalle-openai-api/

本文由 mdnice 多平台发布

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

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

相关文章

vue项目刷新后h5样式失效

vue项目刷新后h5样式失效 今天遇到一个bug&#xff0c;有一个Element的message组件&#xff0c;用它做的一个进度条&#xff0c;它是写在一个页面上&#xff0c;并且是用js控制dom元素的 web端一切正常&#xff0c;h5如果从别的页面跳过来也正常&#xff0c;但是&#xff0c;H…

服装生产管理:SpringBoot框架的高效策略

5 系统的实现 5.1 登录界面的实现 用户要想进入本系统必须进行登录操作&#xff0c;进入对应角色登录界面&#xff0c;在登录界面输入系统账号、登录密码&#xff0c;选择登录类型&#xff0c;点击登录按钮进行登录系统&#xff0c;管理员登录界面展示如图5-1所示&#xff0c…

【STM32开发之寄存器版】(八)-定时器的编码器接口模式

一、前言 1.1 编码器接口原理 编码器模式主要用于检测旋转编码器的转动方向和转动速度。旋转编码器一般输出两路相位相差90度的脉冲信号&#xff08;称为A相和B相&#xff09;&#xff0c;通过这两路信号&#xff0c;定时器可以判断编码器的旋转方向&#xff0c;并计数转动的脉…

嵌入式学习-线性表Day03-栈

嵌入式学习-线性表Day03-栈 栈 顺序栈 2&#xff09;入栈 3&#xff09;出栈 链式栈 栈 什么是栈? 只能在一端进行插入和删除操作的线性表&#xff08;又称为堆栈&#xff09;&#xff0c;进行插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底 栈特点&#xff1a; 先进…

儿童(青少年)可以参加哪些含金量高的比赛?

随着素质教育的推进&#xff0c;越来越多的家长和老师开始关注如何培养孩子的综合素质和能力。而参加各类比赛&#xff0c;不仅可以锻炼孩子的思维、动手能力和团队合作精神&#xff0c;还能帮助孩子在学习的过程中找到兴趣点和成就感。尤其是一些含金量高的比赛&#xff0c;不…

什么是静态加载-前端

什么是前端静态加载 在前端开发中&#xff0c;静态加载是一种常见且重要的技术。简单来说&#xff0c;前端静态加载指的是在页面加载时将所需的资源&#xff08;如HTML、CSS、JavaScript、图片等&#xff09;一并加载到用户的浏览器中。这种方式有助于提高页面的加载速度和用户…

【宽搜】6. leetcode 513 找树左下角的值

1 题目描述 题目链接&#xff1a;找树左下角的值 2 题目解析 思路&#xff1a; 可以使用 层序遍历&#xff0c; 将每一层的值都存入到一个vector< int> 中&#xff0c;当这一层是最后一层的时候&#xff0c;将vector< int>中的第一个值返回即可。 3 代码 cla…

RemoteView(kotlin)

使用场景&#xff1a;通知栏&桌面部件 自定义通知栏 通知权限申请 manifest配置 <uses-permission android:name"android.permission.POST_NOTIFICATIONS" />权限动态申请 package com.example.kotlinlearn.Common;import android.Manifest; import an…

国产长芯微LDUM8801光耦兼容的单通道隔离式栅极驱动器P2P替代UCC23513 FOD8342 TLP5751成本低,质量更好

描述 LDUM8801是单通道兼容光耦输入的隔离式栅极驱动器&#xff0c;可应用于驱动IGBT、SiC 和 MOSFET。它可以提供5A的峰值拉/灌电流。支持150kV/μs的最小共模瞬态免疫&#xff08;CMTI&#xff09;&#xff0c;确保了系统的鲁棒性。驱动器的最大电源电压为32V。 其与光耦式栅…

【计网】【计网】从零开始学习http协议 ---理解http重定向和请求方法

去光荣地受伤&#xff0c; 去勇敢地痊愈自己。 --- 简嫃 《水问》--- 从零开始学习http协议 1 知识回顾2 认识网络重定向3 http请求方法3.1 http常见请求方法3.2 postman工具进行请求3.3 处理GET和POST参数 1 知识回顾 前面两篇文章中我们学习并实现了http协议下的请求与应…

【LeetCode】每日一题 2024_10_9 找到按位或最接近 K 的子数组(LogTrick、位运算)

前言 每天和你一起刷 LeetCode 每日一题~ LeetCode 启动&#xff01; 题目&#xff1a;找到按位或最接近 K 的子数组 代码与解题思路 今天是 2100 的题目&#xff0c;难度略高&#xff0c;不在我的能力范围&#xff0c;推荐题解&#xff1a;两种方法&#xff1a;LogTrick/滑…

设计模式——门面模式 | 外观模式

哈喽&#xff0c;各位盆友们&#xff01;我是你们亲爱的学徒小z&#xff0c;今天给大家分享的文章是设计模式的——门面模式。 文章目录 定义通用类图1.通用结构2.优点3.缺点 使用场景注意事项1.一个子系统可以有多个门面2.门面不参与子系统内的业务逻辑 定义 定义&#xff1a;…

【Flutter】合并多个流Stream

1.说明 无意间发现了一个好用的库rxdart&#xff0c;它为 Dart 的 Stream 添加了额外的功能。 2.功能 &#xff08;1&#xff09;合并多个流Stream 借助Rx.combineLatest2()合并两个流stream1和stream2。 注意&#xff1a;如果dart文件中同时使用了getx&#xff0c;需要隐…

PCL 3D-SIFT关键点检测(Z方向梯度约束

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 SIFT关键点检测 2.1.2 可视化函数 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接&#xff1a; PCL点云算法与项目实战案例汇总&#xff08;长期更新&#…

调用CString::Format接口格式化字符串时产生异常,可能是将当前的CString对象作为参数传给CString::Format接口导致的

最近有人在技术群里问一个关于使用MFC库中的CString类格式化字符串时遇到的问题&#xff0c;有时格式化出来的字符串有问题&#xff08;不是预期的&#xff09;&#xff0c;有时会产生异常崩溃&#xff0c;让我们帮忙分析一下&#xff0c;看看是什么原因导致的。 后来到MSDN上查…

JAVA基础: synchronized 和 lock的区别、synchronized锁机制与升级

1 synchronized 和 lock的区别 synchronized是一个关键字&#xff0c; lock是一个接口&#xff0c;实际使用的是实现类 synchronized通过触发的是系统级别的锁机制&#xff0c; lock是API级别的锁机制 synchronized自动获得锁&#xff0c;自动释放锁。 lock需要通过方法获得锁…

基于SSM的校园教务系统的设计与实现(论文+源码)_kaic

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对校园教务信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差…

【含开题报告+文档+PPT+源码】基于SSM框架的民宿酒店预定系统的设计与实现

开题报告 随着人们旅游需求的增加&#xff0c;民宿行业呈现出快速发展的趋势。传统的住宿方式逐渐无法满足人们对个性化、舒适、便捷的需求&#xff0c;而民宿作为一种新型的住宿选择&#xff0c;逐渐受到人们的青睐。民宿的特点是具有独特的风格、便捷的地理位置、相对亲近的…

基于yolov8的版面分析AI能力生产全流程

目录 1.coco数据集 1.1 基本定义 1.2应用场景 1.3 数据结构 2.labelme标注工具 2.1 基本定义 2.2 应用场景 2.3 安装步骤 3. 模型训练 3.1 数据标注 3.2 环境准备 3.3 数据预处理 3.4 模型训练 3.5 模型推理 4.参考链接 1.coco数据集 1.1 基本定…

数据库的相关知识

数据库的相关知识 1.数据库能够做什么&#xff1f; 存储大量数据&#xff0c;方便检索和访问保持数据信息的一致、完整共享和安全通过组合分析&#xff0c;产生新的有用信息 2.数据库作用&#xff1f; 存储数据、检索数据、生成新的数据 3.数据库要求&#xff1f; 统一、…