使用 DALL·E 2 模型和 OpenAI API 生成图像

随着神经网络和潜在扩散模型(LDM) 的进步,在几年前还听起来还很未来的东西现在已成为现实。OpenAI 的 DALL·E 模型通过人们用它创造的惊人的生成艺术和逼真的图像而引起轰动。

OpenAI 现在允许通过他们的API访问 DALL·E ,这意味着我们可以将其功能合并到您的Python 应用程序中。

本文内容中,我们将学会做以下工作:

  • 开始使用 OpenAI Python 库
  • 探索与图像生成 相关的 API 调用
  • 根据文本提示 创建图像
  • 创建生成图像的 变体
  • 将 Base64 JSON 响应转换为 PNG 图像 文件

如果您以前没有玩过DALL·E 的 Web 用户界面功能,先去体验一下,然后再回来学习如何通过 Python 以编程方式使用它并实现功能。

安装 OpenAI Python 库,并获取您的 OpenAI API 密钥

此部分内容是基础,之前文章中已经介绍过,不清楚的点击此链接先学习一下。

使用DALL·E2模型和OpenAIAPI生成图像

使用 OpenAI 的 DALL·E 从文本提示创建图像

新建一个python文件 create.py,如下代码,可以实现从文本提示创建图像功能

import os

import openai

# 文本提示
PROMPT = "An eco-friendly computer from the 90s"

openai.api_key="<your key>"

# 根据文本指令,向DALL·E 模型发送创建图片的请求,返回图片url
response = openai.Image.create(
    prompt=PROMPT,
    n=1,
    size="256x256",
)

print(response["data"][0]["url"])

使用DALL·E2模型和OpenAIAPI生成图像

代码执行效果如上图,返回一个模型根据文本提示生成的图片链接,点击链接 浏览器会打开图片,可以看到图片如下:

使用DALL·E2模型和OpenAIAPI生成图像

将图像数据保存到本地JSON文件

API 允许您将响应的格式从 URL 切换为 Base64 编码的图像数据。在第 15 行中,您将 的值设置response_format为"b64_json"。此参数的默认值为"url",这就是您到目前为止在 JSON 响应中收到 URL 的原因。为了避免丢失一张完美的图像,您可以将 JSON 响应存储在一个文件中。

import json
import os
from pathlib import Path

import openai

PROMPT = "An eco-friendly computer from the 90s"
DATA_DIR = Path.cwd() / "responses"

DATA_DIR.mkdir(exist_ok=True)

openai.api_key="<your key>"

#图片返回格式设置成b64_json,
response = openai.Image.create(
    prompt=PROMPT,
    n=1,
    size="256x256",
    response_format="b64_json",
)

#构建json文件路径名称
file_name = DATA_DIR / f"{PROMPT[:5]}-{response['created']}.json"

# 写文件,保存文件
with open(file_name, mode="w", encoding="utf-8") as file:
    json.dump(response, file)

解码 Base64 JSON 文件生成图片

新建convert.py脚本文件,该脚本将读取一个 JSON 文件,需要调整 的值 JSON_FILE 以匹配您的 JSON 文件的文件名,这将有所不同。

然后脚本从 JSON 数据中获取 Base64 编码的字符串,对其进行解码,并将生成的图像数据作为 PNG 文件保存在目录中。该for循环将解码每个图像并将其保存为一个新文件。

代码片段的真正亮点是 b64decode() . 它解码 Base64 编码的字符串,以便您可以将实际图像数据保存为 PNG 文件。然后您的计算机将能够将其识别为 PNG 图像并可以查看。

# convert.py

import json
from base64 import b64decode
from pathlib import Path

DATA_DIR = Path.cwd() / "responses"
JSON_FILE = DATA_DIR / "An ec-1667994848.json"
IMAGE_DIR = Path.cwd() / "images" / JSON_FILE.stem

IMAGE_DIR.mkdir(parents=True, exist_ok=True)

with open(JSON_FILE, mode="r", encoding="utf-8") as file:
    response = json.load(file)

for index, image_dict in enumerate(response["data"]):
    image_data = b64decode(image_dict["b64_json"])
    image_file = IMAGE_DIR / f"{JSON_FILE.stem}-{index}.png"
    with open(image_file, mode="wb") as png:
        png.write(image_data)

使用DALL·E2模型和OpenAIAPI生成图像

python3 convert.py运行该脚本,就会生成对应png文件,如上图。

创建图像的变体

如果您有一张图像——无论它是否是机器生成的图像——与您正在寻找的图像 相似 但不完全符合要求,那么您可以使用 OpenAI 的 DALL·E 潜在扩散模型创建它的变体。

根据前面编写的代码,我们可以创建一个新文件 vary.py

import json
import os
from base64 import b64decode
from pathlib import Path

import openai

DATA_DIR = Path.cwd() / "responses"
#被变化的原始图片文件
SOURCE_FILE = DATA_DIR / "An ec-1667994848.json" 

openai.api_key="<your key>"

with open(SOURCE_FILE, mode="r", encoding="utf-8") as json_file:
    saved_response = json.load(json_file)
    image_data = b64decode(saved_response["data"][0]["b64_json"])

#原始图片作为参数发送请求给模型,模型返回3张相似的随机变体图片
response = openai.Image.create_variation(
    image=image_data,
    n=3,
    size="256x256",
    response_format="b64_json",
)

new_file_name = f"vary-{SOURCE_FILE.stem[:5]}-{response['created']}.json"

with open(DATA_DIR / new_file_name, mode="w", encoding="utf-8") as file:
    json.dump(response, file)

使用DALL·E2模型和OpenAIAPI生成图像

运行脚本,以原始图片作为参数,请求模型返回3张变体图片,然后再运行convert.py脚本将3张彼岸图图片json转成PGN图片,打开就可以看到如上图所示。