Profile picture

[Python] DALL-E 모델을 활용하여 이미지 생성해보기 - OpenAI

JaehyoJJAng2023년 12월 10일

◾️ DALL-E

DALL-E는 자연어로 된 설명을 기반으로 사실적인 이미지를 생성할 수 있는 인공지능 시스템이다.

  • DALL-E-3 : 2023년 11월에 출시
  • DALL-E-2 : 2022년 11월에 출시
  • 텍스트 프롬프트를 기반으로 이미지 생성
  • 새 텍스트 프롬프트에 따라 모델이 기존 이미지의 일부 영역을 대체하도록 하여 이미지의 편집된 버전 생성
  • 기존 이미지의 변형 만들기 (DALL-E-2만 해당)
  • DALL-E-2의 경우 256x256, 512x512, 1024x1024 지원
  • DALL-E-3의 경우 1024x1024, 1792x1024, 1024,1792 지원

▪️ API 사용방법

  • 프롬프트가 지정된 이미지를 생성해보기

A. 사용 방법

# Request
client.images.generate(
    model="dall-e-3",
    prompt="cute dog",
    n=1,
    size="1024x1024"
)
# Response
{
    "created": 1839549821,
    "data": [
        {
            "url": "https://..."
        },
        {
            "url": "https://..."
        }
    ]
}

B. Request Body
image

  • Prompt : dall-e-2 모델의 경우 1000자, dall-e-3 모델의 경우 4000자
  • n : 생성할 이미지 수, 1에서 10 사이, dall-e-3 모델의 경우 n=1만 지원
  • quality : 생성될 이미지의 화질, HD는 dall-e-3만 지원

image

  • response_format : 생성된 이미지의 반환 형식. URL 또는 b64_json
  • size : 이미지의 크기, dall-e-2의 경우 256x256, 512x512, 1024x1024 지원, dall-e-3는 1024x1024, 1792x1024, 1024x1792 지원
  • style : 이미지 스타일, dall-e-3에서만 지원
    • vivid : 사실적, 선명
    • natural : 자연스러움

▪️ 이미지 만들어보기

  • 기본적으로 이미지는 표준 화질로 생성되지만 DALL-E-3 모델의 경우 HD로 화질 설정 가능함.
  • 정사각형의 표준 화질 이미지가 가장 빠르게 생성됨
  • DALL-E-3 사용 시 API 호출당 최대 1개의 이미지 요청 가능
  • DALL-E-2 사용 시 API 호출당 최대 10개의 이미지 요청 가능

1. 귀여운 강아지 1마리

from openai import OpenAI

class E3():
    def __init__(self,API_KEY: str) -> None:
        self.client : OpenAI = OpenAI(api_key=API_KEY)
    
    def generate_image(self) -> str:
        response = self.client.images.generate(
            model="dall-e-3",
            prompt="A cute dog",
            size="1024x1024",
            quality="standard",
            n=1
        )
        image_url : str = response.data[0].url
        return image_url

_API_KEY : str = ''
e3 = E3(API_KEY=_API_KEY)
print(e3.generate_image())

image


2. 이미지 다운로드 로직 추가

from openai import OpenAI
import request as rq # pip install requests

class E3():
    def __init__(self,API_KEY: str) -> None:
        self.client : OpenAI = OpenAI(api_key=API_KEY)
    
    def generate_image(self) -> str:
        response = self.client.images.generate(
            model="dall-e-3",
            prompt="A cute dog",
            size="1024x1024",
            quality="standard",
            n=1
        )
        image_url : str = response.data[0].url
        return image_url
    
    def download_image(self,save_path: str,image_url : str) -> None:
        response = rq.get(url=image_url,stream=True)
        if response.status_code == 200:       
            with open(save_path,'wb') as fp:
                for chunk in response.iter_content(chunk_size=128):
                    fp.write(chunk)
            print(f'이미지 다운로드 완료! ({save_path})')
        else:
            print(f'이미지 다운로드 실패! ({response.status_code})')

_API_KEY : str = ''
e3 = E3(API_KEY=_API_KEY)

image_url : str = e3.generate_image()
e3.download_image(save_path='dog.png',image_url=image_url)

Ref

https://cookbook.openai.com/articles/what_is_new_with_dalle_3


Loading script...