OpenAI: DALL-E
웹사이트에서 이미지를 업로드 하거나, 이미지를 생성하는 기능 구현이 잘 되어 있습니다.
in-painting, out-painting 도구도 함께 제공합니다.
Copy import os
from dotenv import load_dotenv
# 토큰 정보로드
api_key = os.getenv("OPENAI_API_KEY")
load_dotenv()
1. Client 생성
client
는 OpenAI 모듈로 생성된 인스턴스 입니다.
[주의] 아래의 코드에서 오류가 난다면 API 키의 오류일 가능성이 높습니다.
Copy import openai
print(f"설치된 버전: {openai.__version__}")
Copy from openai import OpenAI
client = OpenAI()
2. 이미지 생성
Reference: https://platform.openai.com/docs/guides/images/introduction?context=node
model
생성: 사용 가능한 모델은 dall-e-3
및 dall-e-2
기준 이미지에 대한 다양화(variation): dall-e-2
이미지 크기
dall-e-2
256x256
, 512x512
, 1024x1024
dall-e-3
1024x1024
, 1792x1024
, 1024x1792
기본적으로 이미지는 표준 화질로 생성되지만, DALL-E 3을 사용할 때는 화질을 설정할 수 있습니다. "HD"로 설정하면 디테일이 향상됩니다. 정사각형의 표준 화질 이미지가 가장 빠르게 생성됩니다.
사진요청 개수
DALL-E 3을 사용하면 한 번에 1개의 이미지를 요청 할 수 있고(병렬 요청을 통해 더 많은 이미지를 요청할 수 있음), DALL-E 2를 사용하면 n 매개변수와 함께 한 번에 최대 10개의 이미지를 요청 할 수 있습니다.
참고: https://dallery.gallery/the-dalle-2-prompt-book/
Copy # DALL-E 3 모델을 사용하여 이미지를 생성
response = client.images.generate(
model="dall-e-3",
prompt="A detailed neoclassicism painting depicting the frustration of being put on hold during a phone call(iphone)",
size="1024x1024",
quality="standard",
n=1,
)
# 생성된 이미지의 URL을 저장합니다.
image_url = response.data[0].url
Copy # 생성된 이미지의 URL을 출력합니다.
print(image_url)
Copy https://oaidalleapiprodscus.blob.core.windows.net/private/org-02DqyGW1hIRR5v2Jr4hcMc9w/user-GHD7b1j0xZU32xRQ83ConRyq/img-Jo4iciz8dth5aLaAJ7qU3860.png?st=2024-02-20T09%3A35%3A52Z&se=2024-02-20T11%3A35%3A52Z&sp=r&sv=2021-08-06&sr=b&rscd=inline&rsct=image/png&skoid=6aaadede-4fb3-4698-a8f6-684d7786b067&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2024-02-20T08%3A21%3A47Z&ske=2024-02-21T08%3A21%3A47Z&sks=b&skv=2021-08-06&sig=nbNUZyl5bMZG5HSnEEE9iazYiDnc%2BslEpCoSt4yAE8U%3D
Jupyter 출력
Copy from IPython.display import Image
# 생성된 이미지를 출력
Image(url=image_url, width=500)
이미지 저장
Copy import urllib
# 생성된 이미지를 URL로부터 다운로드하여 저장합니다.
urllib.request.urlretrieve(image_url, "generated_image.jpg")
Copy ('generated_image.jpg', <http.client.HTTPMessage at 0x7f0bebbea7d0>)
DALLE-3 프롬프트 예시
1️⃣ 예시 프롬프트:
a closeup of a female face with headphones in retro colors, synthwave style, 2d digital vector art
2️⃣ 예시 프롬프트:
A detailed neoclassicism painting depicting the frustration of being put on hold during a phone call(iphone)
더 많은 예시는 다음의 링크를 참고해 보세요:
https://dallery.gallery/the-dalle-2-prompt-book/
Copy response = client.images.generate(
model="dall-e-3",
prompt="A sunlit indoor lounge area with a pool with clear water"
"and another pool with translucent pastel pink water, next"
" to a big window, digital art",
size="1024x1024",
quality="standard",
n=1,
)
image_url = response.data[0].url
Copy https://oaidalleapiprodscus.blob.core.windows.net/private/org-02DqyGW1hIRR5v2Jr4hcMc9w/user-GHD7b1j0xZU32xRQ83ConRyq/img-ezLqo1kGout5RU9M520LXboH.png?st=2024-02-20T09%3A38%3A26Z&se=2024-02-20T11%3A38%3A26Z&sp=r&sv=2021-08-06&sr=b&rscd=inline&rsct=image/png&skoid=6aaadede-4fb3-4698-a8f6-684d7786b067&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2024-02-20T05%3A10%3A24Z&ske=2024-02-21T05%3A10%3A24Z&sks=b&skv=2021-08-06&sig=/2Io%2B6ARMPoSl2A7dfJNamyZhhn50gJb3BHvTei7PrM%3D
Copy # 생성된 이미지를 출력합니다.
Image(url=image_url, width=500)
Copy # 생성된 이미지를 URL로부터 다운로드하여 저장
urllib.request.urlretrieve(image_url, "generated_image2.jpg")
Copy ('generated_image2.jpg', <http.client.HTTPMessage at 0x7f0bea876410>)
3. 이미지 수정(Image Edit)
도큐먼트: https://platform.openai.com/docs/api-reference/images/createEdit
주요 파라미터
mask
:
마스킹 영역은 완전히 투명한 영역(예: 알파가 0인 곳)이 이미지를 편집할 위치를 나타내는 추가 이미지입니다.
4MB 미만의 유효한 PNG 파일이어야 하며 이미지와 크기가 같아야 합니다.
마스킹한 영역에 대하여 다양한 버전의 이미지를 생성합니다.
model
: 이미지 생성에 사용할 모델입니다. 현재 dall-e-2
만 지원됩니다.
size
: 256x256
, 512x512
, or 1024x1024
. 기본값은 1024x1024
입니다.
Copy from openai import OpenAI
client = OpenAI()
response = client.images.edit(
model="dall-e-2",
image=open("data/sample.png", "rb"),
mask=open("data/sample-mask.png", "rb"),
prompt="add a Christmas tree",
n=1,
size="1024x1024",
)
image_url = response.data[0].url
Copy # 원본 이미지를 출력합니다.
Image(url="data/sample.png")
Copy # 생성된 이미지를 URL로부터 다운로드하여 저장합니다.
urllib.request.urlretrieve(image_url, "edited_output.png")
# 생성된 이미지를 출력합니다.
Image(url="edited_output.png")
3. 다양한 버전의 이미지 생성(Image Variation)
주어진 이미지의 변형을 생성합니다.
도큐먼트: https://platform.openai.com/docs/api-reference/images/createVariation
주요 파라미터
image
: 변형의 기준으로 사용할 이미지입니다. 4MB 미만의 유효한 PNG
파일이어야 하며 정사각형
이어야 합니다.
model
: 이미지 생성에 사용할 모델입니다. 현재 dall-e-2
만 지원됩니다.
size
: 256x256
, 512x512
, or 1024x1024
. 기본값은 1024x1024
입니다.
Copy number_of_variations = 2
image_size = "512x512"
response = client.images.create_variation(
image=open("data/generated_image_porche.png", "rb"), # 기준 이미지
n=number_of_variations, # 생성할 이미지의 개수
size=image_size, # 생성할 이미지의 크기
)
image_url = response.data[0].url
Copy import matplotlib.pyplot as plt
from matplotlib.image import imread
fig, ax = plt.subplots(1, number_of_variations, figsize=(8, 8 * number_of_variations))
for i in range(1, number_of_variations + 1):
filename = f"variated_image_{i}.jpg"
i -= 1
urllib.request.urlretrieve(response.data[i].url, filename)
img = imread(filename)
ax[i].imshow(img)
ax[i].axis("off")
ax[i].set_title(f"Variation {i+1}")
plt.tight_layout()
plt.show()