๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐™‹๐™ฎ๐™ฉ๐™๐™ค๐™ฃ/๐˜ผ๐™‹๐™„

์นด์นด์˜ค API 'Karlo', stable diffusion ์‚ฌ์šฉํ•ด๋ณด๊ธฐ

by beomcoder 2023. 2. 12.
728x90
๋ฐ˜์‘ํ˜•

์ง‘ ์ปดํ“จํ„ฐ๊ฐ€ ์ข‹์ง€ ๋ชปํ•ด stable diffusion์„ colab์—์„œ ์‚ฌ์šฉํ•ด๋ณผ ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ๊ฐ€ ์žˆ์–ด์„œ

๋”ฐ๋ผ์„œ ํ•ด๋ณด๊ณ  ์‚ฌ์šฉํ•ด๋ดค๋Š”๋ฐ ์„ฑ๋Šฅ์ด web ui๋ณด๋‹ค ์ข‹์ง€ ๋ชปํ•ด ์‹ค๋งํ–ˆ๋‹ค.

 

์ฝ”๋žฉ์„ ๋„๊ณ  ํšŒ์‚ฌ์—์„œ ์‚ฌ์šฉํ•  api๋ฅผ ์ฐพ์•„๋ณด๊ณ  ์žˆ์—ˆ๋Š”๋ฐ ์นด์นด์˜ค์—์„œ๋„ text to image๋ฅผ ์„œ๋น„์Šคํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.

๊ทธ๋ž˜์„œ ํ•œ๋ฒˆ ์‚ฌ์šฉํ•ด๋ณด๊ณ , ํ•ด๋ณด๊ณ  ์‹ถ์€ ์‚ฌ๋žŒ๋“ค์ด ์žˆ์„ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์•„ ์‚ฌ์šฉ๋ฐฉ๋ฒ•์„ ์•Œ๋ ค์ฃผ๋ ค๊ณ  ํ•œ๋‹ค.

 

๋ฏธ๋ฆฌ ๋งํ•˜์ง€๋งŒ ์„ฑ๋Šฅ์€ web ui๋ณด๋‹ค ์ข‹์ง€ ๋ชปํ•˜๋‹ค.

์„œ๋ฒ„์—์„œ ์ •ํ•ด์ง„ ๋ชจ๋ธ์— ํ”„๋กฌํฌํŠธ๋งŒ ์ž…๋ ฅํ•˜์—ฌ ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ง€๊ณ  ์˜ค๋Š”๊ฑฐ๋ผ

์ข‹์€ ์„ฑ๋Šฅ์„ ๊ธฐ๋Œ€ํ•˜๋ ค๋ฉด webui๋ฅผ ๊ฐ€์„œ ๊ณต๋ถ€ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ์ข‹๋‹ค.

 

์ทจ์ง€๋Š” ์นด์นด์˜คํ†ก์—์„œ text to image api๋ฅผ ๋งŒ๋“ค์—ˆ์œผ๋‹ˆ ํ•œ๋ฒˆ ์ฐ์–ด๋จน์–ด๋ณด์ž๋ผ๋Š” ์˜๋ฏธ์ด๋‹ค.

 

 

Kakao Developers

์นด์นด์˜ค API๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋‹ค์–‘ํ•œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•ด๋ณด์„ธ์š”. ์นด์นด์˜ค ๋กœ๊ทธ์ธ, ๋ฉ”์‹œ์ง€ ๋ณด๋‚ด๊ธฐ, ์นœ๊ตฌ API, ์ธ๊ณต์ง€๋Šฅ API ๋“ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

developers.kakao.com

 

๋จผ์ € ์นด์นด์˜ค๋””๋ฒจ๋กœํผ์— ๋“ค์–ด๊ฐ€์„œ ํšŒ์›๊ฐ€์ž…์„ ํ•œ๋‹ค.

ํšŒ์›๊ฐ€์ž…์„ ํ•˜๊ณ  '๋‚ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜'์„ ๋ˆ„๋ฅด๊ณ  '์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ถ”๊ฐ€ํ•˜๊ธฐ'๋ฅผ ๋ˆ„๋ฅธ๋‹ค.

 

 

์•ฑ ์ด๋ฆ„๊ณผ ์‚ฌ์—…์ž๋ช…์„ ์ ์–ด์ค€๋‹ค. ๊ทธ๋ƒฅ ๊ณต๋ถ€ํ•  ๋ชฉ์ ์ด๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์–ด๋–ค ์šฉ๋„๋กœ ์“ฐ์ผ์ง€ ์ ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ฒดํฌ๋ฐ•์Šค์— ์ฒดํฌํ•˜๊ณ  ์ €์žฅํ•˜๋ฉด ๋œ๋‹ค.

 

 

์ €์žฅํ•˜์—ฌ ๋งŒ๋“ค์–ด์ง„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํด๋ฆญํ•˜๋ฉด ์•ฑ ํ‚ค๋ฅผ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์šฐ๋ฆฌ๋Š” api๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋ผ REST API ํ‚ค๋ฅผ ๋ณต์‚ฌํ•ด์„œ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค.

๊ทธ๋‹ค์Œ ์ฝ”๋žฉ์„ ํ‚ค๊ฑฐ๋‚˜ vscode๋ฅผ ์ผœ์„œ ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๋œ๋‹ค.

๋‚˜๋Š” ์ฝ”๋žฉ์—์„œ ์‚ฌ์šฉํ•ด์„œ ์ฝ”๋žฉ๊ธฐ์ค€์œผ๋กœ ์•Œ๋ ค์ฃผ๋ ค ํ•œ๋‹ค.

 

# REST API ํ˜ธ์ถœ, ์ด๋ฏธ์ง€ ํŒŒ์ผ ์ฒ˜๋ฆฌ์— ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
import requests
import json
import io
import base64
from PIL import Image
# [๋‚ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜] > [์•ฑ ํ‚ค] ์—์„œ ํ™•์ธํ•œ REST API ํ‚ค ๊ฐ’ ์ž…๋ ฅ
REST_API_KEY = '๋ณธ์ธ์˜ rest apiํ‚ค๋ฅผ ์ž…๋ ฅ'

 

์—ฌ๊ธฐ์„œ ์นด์นด์˜ค ์˜ˆ์ œ์—์„œ๋Š” '${rest_api}' ์˜€์ง€๋งŒ ${}๋ฅผ ์•ˆ์ง€์šฐ๋ฉด

์—๋Ÿฌ์ฒ˜๋ฆฌ๊ฐ€ ๋‚˜์„œ ์ง€์›Œ์„œ ์ž…๋ ฅํ•˜์˜€๋”๋‹ˆ ์‘๋‹ต์ด ์ž˜ ์™”๋‹ค.

 

# ์ด๋ฏธ์ง€ ์ƒ์„ฑํ•˜๊ธฐ ์š”์ฒญ
def t2i(text, batch_size=1):
    r = requests.post( # ์นด์นด์˜คํ•œํ…Œ ์š”์ฒญํ•˜๊ฒ ๋‹ค.
        'https://api.kakaobrain.com/v1/inference/karlo/t2i', # ์ด์‚ฌ์ดํŠธ๋กœ
        json = {
            'prompt': {
                'text': text, # ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ทธ๋ฆผ์˜ ํ”„๋กฌํฌํŠธ๋Š” text์ด๊ณ ,
                'batch_size': batch_size # batch_size๋งŒํผ ๊ทธ๋ ค์ค˜
            }
        },
        headers = {
            'Authorization': f'KakaoAK {REST_API_KEY}', # ์š”์ฒญํ• ๋•Œ ํ•„์š”ํ•œ ์•”ํ˜ธ
            'Content-Type': 'application/json'
        }
    )
    # ์‘๋‹ต JSON ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜
    response = json.loads(r.content)
    return response

# Base64 ๋””์ฝ”๋”ฉ ๋ฐ ๋ณ€ํ™˜ (์ด๋ฏธ์ง€๋กœ ๋ฐ”๋กœ ๋ณด๋‚ด๋ฉด ๋‚ญ๋น„)
def stringToImage(base64_string, mode='RGBA'):
    imgdata = base64.b64decode(str(base64_string))
    img = Image.open(io.BytesIO(imgdata)).convert(mode)
    return img

 

์ฝ”๋“œ๋ฅผ ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•˜๋ ค๊ณ  ์ฃผ์„์ฒ˜๋ฆฌ๋ฅผ ๋‹ฌ์•˜๋‹ค. text์— ๋“ค์–ด๊ฐ€๋Š”๊ฑด ์–ด๋–ค ๊ทธ๋ฆผ์ด ๋‚˜์™”์œผ๋ฉด ์ข‹์„์ง€ ์ ๋Š” ๊ฒƒ์ด๋‹ค.

batch_size๋Š” ์ฒ˜์Œ์—” ํ€„ํ‹ฐ๋ฆฌ๊ฐ€ ์ข‹์•„์ง€๋Š”์ง€ ์•Œ์•˜๋Š”๋ฐ ๊ทธ๋ฆผ์˜ ์žฅ ์ˆ˜์ด๋‹ค.

1~8์žฅ๊นŒ์ง€ ์“ธ ์ˆ˜ ์žˆ๋‹ค.

 

# ํ”„๋กฌํ”„ํŠธ์— ์‚ฌ์šฉํ•  ์ œ์‹œ์–ด
text = "a baby in a cute penguin suit facing the front"

# ์ด๋ฏธ์ง€ ์ƒ์„ฑํ•˜๊ธฐ REST API ํ˜ธ์ถœ
response = t2i(text, 8)

 

text๋Š” ์˜์–ด๋ฐ–์— ์•ˆ๋˜๊ณ  256์ž๊นŒ์ง€ ์“ธ ์ˆ˜ ์žˆ๋‹ค. ๋‚˜์ฒ˜๋Ÿผ ๋ง์ด ๋˜๊ฒŒ ์จ๋„ ๊ดœ์ฐฎ๊ณ ,

' , ' ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์•„๋ฌด ๋‹จ์–ด๋‚˜ ๋‚˜์—ดํ•ด๋„ ์•Œ์•„์„œ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

 

# ์‘๋‹ต์˜ ์ฒซ ๋ฒˆ์งธ ์ด๋ฏธ์ง€ ์ƒ์„ฑ ๊ฒฐ๊ณผ ์ถœ๋ ฅํ•˜๊ธฐ
result = stringToImage(response.get("images")[0].get("image"), mode='RGB')
result

 

response.get("images")[0] ์ด ๋ถ€๋ถ„์„ 0~7๊นŒ์ง€ ๊ณ ์น˜๋ฉด ๋œ๋‹ค. batch_size-1 ๊นŒ์ง€ ๋Š˜๋ฆด ์ˆ˜ ์žˆ๋‹ค.

๋งŒ์•ฝ ์—ฌ๊ธฐ์„œ ์ด๋ฏธ์ง€๊ฐ€ ์ถœ๋ ฅ์ด ๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด response๋ฅผ ์ฐ์–ด๋ณด๋ฉด ์—๋Ÿฌ ์‘๋‹ต์„ ์ฃผ์—ˆ์„ ํ™•๋ฅ ์ด ๋†’๋‹ค.

๋‚˜๋Š” ์ฒ˜์Œ์— batch_size๋ฅผ 10์„ ์ฃผ์—ˆ๋Š”๋ฐ ์ž๊พธ bad requests๊ฐ€ ์™€์„œ ์ฐพ์•„๋ณด๋‹ˆ 8๊นŒ์ง€๋ฐ–์— ์•ˆ๋œ๋‹ค๊ณ  ์จ์ ธ์žˆ์—ˆ๋‹ค.

 

 

๋‹ค๋ฅธ ๊ธฐ๋Šฅ๋„ 2๊ฐ€์ง€ ์ •๋„ ๋” ์žˆ์œผ๋‹ˆ ๊ถ๊ธˆํ•˜๋ฉด ์ง์ ‘ ํ•ด๋ณด๋ฉด ์žฌ๋ฐŒ์„ ๊ฒƒ์ด๋‹ค.

 

Kakao Developers

์นด์นด์˜ค API๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋‹ค์–‘ํ•œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•ด๋ณด์„ธ์š”. ์นด์นด์˜ค ๋กœ๊ทธ์ธ, ๋ฉ”์‹œ์ง€ ๋ณด๋‚ด๊ธฐ, ์นœ๊ตฌ API, ์ธ๊ณต์ง€๋Šฅ API ๋“ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

developers.kakao.com

 

728x90
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€