随着神经网络和潜在扩散模型(LDM) 的进步,在几年前还听起来还很未来的东西现在已成为现实。OpenAI 的 DALL·E模型通过人们用它创造的惊人的生成艺术和逼真的图像而引起轰动。
OpenAI 现在允许通过他们的API访问 DALL·E ,这意味着我们可以将其功能合并到您的Python 应用程序中。
本文内容中,我们将学会做以下工作:
开始使用OpenAI Python 库
探索与图像生成相关的 API 调用
根据文本提示创建图像
创建生成图像的变体
将 Base64 JSON 响应转换为PNG 图像文件
如果您以前没有玩过DALL·E 的 Web 用户界面功能,先去体验一下,然后再回来学习如何通过 Python 以编程方式使用它并实现功能。
安装 OpenAI Python 库,并获取您的 OpenAI API 密钥
此部分内容是基础,之前文章中已经介绍过,不清楚的点击此链接先学习一下。
使用 OpenAI 的 DALL·E 从文本提示创建图像
新建一个python文件 create.py,如下代码,可以实现从文本提示创建图像功能
import os
import openai
# 文本提示
PROMPT = “An eco-friendly computer from the 90s”
openai.api_key=””
# 根据文本指令,向DALL·E 模型发送创建图片的请求,返回图片url
response = openai.Image.create(
prompt=PROMPT,
n=1,
size=”256×256″,
)
print(response[“data”][0][“url”])
代码执行效果如上图,返回一个模型根据文本提示生成的图片链接,点击链接 浏览器会打开图片,可以看到图片如下:
将图像数据保存到本地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=””
#图片返回格式设置成b64_json,
response = openai.Image.create(
prompt=PROMPT,
n=1,
size=”256×256″,
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)
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=””
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=”256×256″,
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)
运行脚本,以原始图片作为参数,请求模型返回3张变体图片,然后再运行convert.py脚本将3张彼岸图图片json转成PGN图片,打开就可以看到如上图所示。