FB粉專: L’s 碎碎念
基礎設定:OpenAI API 入門 — 那些你需要知道的事
Chat endpoint介紹:OpenAI API 入門 — Chat Endpoint
這篇會介紹怎麼使用OpenAI影像相關endpoints,以及提供簡單的範例code給大家玩耍,但我個人認為目前的OpenAI影像還沒有到非常驚艷,大家看了不要太失望(?
OpenAI 官方文件:https://platform.openai.com/docs/guides/images/image-generation
在進到如何使用之前,想先跟大家提一下目前OpenAI image的限制與計費方式。
- OpenAI目前只支援正方形的圖,大小有256×256、512x512、1024x1024
- 如果有提供圖給OpenAI做修改,他還是會把它變成上述的幾種大小,所以可能會有預期之外的變形
- OpenAI目前只支援png,而且必須要有alpha層,後面會教要怎麼convert某些沒有alpha層的png
- 腥羶色、暴力的詞彙是沒辦法放在prompt裡面的,所以沒辦法讓AI畫一些你可能想畫的那些圖,這部分如果想瞭解更多可以看moderations這個endpoint,也可以參考content policy
- 計費方式跟大小以及產生的張數有關,以下是目前官網提供的費用表格,如果產生512x512的圖3張,總花費就會是$0.018 * 3 = $0.054
OpenAI的image endpoints總共有三個,分別是 Generations, Edits與Variations,三者後面的Model皆使用DALL·E,與目前DALL·E 2網頁版理論上是差不多的模型。
Generations
顧名思義,這個endpoint就是拿來產生圖片的,使用者可以給一段prompt,描述自己想要的圖,在OpenAI官方提供的guide中有非常詳細的各種形容詞,包括影像範圍(遠近/全半身)、風格(90年代/龐克風)、色彩、氛圍等等的敘述,先不論照著他是否可以產出一樣美的圖,至少我讀完學了很多英文單字😊。下面是從guide中截出來的prompt範例,這是一句請AI畫出照片的prompt,所以包含了影像類別、拍攝主體、光影、照片使用情境等等,可以參考這種方式讓AI努力畫出你想要的東西。
產生影像的code非常的簡單,只需要給prompt、設定大小(256×256、512x512、1024x1024)以及數量就行了。
import openai
openai.api_key = "{之前有教過要怎麼取得的API key}"
prompt = """
An image that is futuristic and shows the power of artificial intelligence.
The picture is the cover photo of an article that introduces the techonology of using artificial intelligence to generate images.
"""
image_response = openai.Image.create(prompt=prompt, n=1, size="512x512")
print(image_response)
會得到以下的回覆(這就是我產生的封面圖…不過我prompt下得挺隨便的就是了,大家可以試試看有沒有辦法讓AI畫出更好的圖)
{
"created": 1695298002,
"data": [
{
"url": "https://oaidalleapiprodscus.blob.core.windows.net/private/org-K9epHurHutrkDMojMwFjYYhB/user-JDbh1rGwWkDgFZDnK9kuE3wG/img-eXr47TrXi6PemoNvjoUvgTg3.png?st=2023-09-21T11%3A06%3A42Z&se=2023-09-21T13%3A06%3A42Z&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=2023-09-20T21%3A59%3A09Z&ske=2023-09-21T21%3A59%3A09Z&sks=b&skv=2021-08-06&sig=C8hk3dJHSgEVbK2oUGNC1j3fkyiJFL5hEOBL5W5NRRw%3D"
}
]
}
如果只要image url的話可以用下面這行code
url = image_response['data'][0]['url']
# 如果有多張圖(n>1),就把data遍歷一輪就好了
加碼download image的code,這整段串起來就可以自動把圖存到local啦
# copied from https://stackoverflow.com/questions/30229231/python-save-image-from-url
import requests
img_data = requests.get(image_url).content
with open('image_name.png', 'wb') as handler:
handler.write(img_data)
Edits
這個是image endpoints中最複雜的一個,主要的目的是根據使用者給的prompt去修改使用者給的圖,但OpenAI現在有點笨,需要使用者提供另一張mask,告訴AI他應該改哪裡。
以下是官網的範例圖,我自己是拿日本明星的照片來玩,怕放上來有版權問題,所以還是先放官方的圖。Image與Mask這兩張圖是你需要提供的,最後OpenAI就會根據mask中被塗掉的地方在哪裡,去修改原圖。
Code依舊蠻簡單的,只是要多給點input,包括原圖(image)、把要修改的地方塗掉的圖(mask)、prompt、想產生的張數(n)以及大小(size)。
import openai
openai.api_key = "{之前有教過要怎麼取得的API key}"
# copied from https://platform.openai.com/docs/guides/images/edits
response = openai.Image.create_edit(
image=open("sunlit_lounge.png", "rb"),
mask=open("mask.png", "rb"),
prompt="A sunlit indoor lounge area with a pool containing a flamingo",
n=1,
size="1024x1024"
)
image_url = response['data'][0]['url']
接著就可以一樣利用download的code取得image_url裡的影像了。
但這裡有個會踩雷的地方,假如你本來的影像不是png的話,就要先把它轉成png,而某些converter會沒有alpha層,這會導致OpenAI讀不懂你的mask,這時可以利用下面這段code把alpha層加回來,再加工成你要的mask。
image = Image.open(img_path)
if image.mode not in ["RGBA", "LA", "L"]:
rgba_image = image.convert("RGBA")
rgba_image.save(image_path, "png")
至於mask要怎麼生呢?方法簡單暴力,打開小畫家/GIMP/預覽程式或任何可以修改圖的軟體,找到橡皮擦/框範圍的工具,刪掉你不要的部分就好了。美中不足的是,這件事需要人工完成。
Variations
這個endpoint老實說我真的不知道要幹嘛,他的input只需要你想修改的圖,不接受任何其他指令,接下來就看OpenAI自己要怎麼玩。以下是官方的範例(這endpoint太不明所以,我就不浪費錢了)
import openai
openai.api_key = "{之前有教過要怎麼取得的API key}"
# Copied from https://platform.openai.com/docs/guides/images/variations
response = openai.Image.create_variation(
image=open("corgi_and_cat_paw.png", "rb"),
n=1,
size="1024x1024"
)
image_url = response['data'][0]['url']
官方宣稱的產出,但應該很難reproduce,我目前也沒想到什麼usecase
OpenAI入門系列到這邊告一個段落了,我相信聰明的大家看完這三篇,一定有能力舉一反三,參考OpenAI官方文件,學會怎麼使用剩下的endpoints。如果有任何問題都歡迎留言、私訊粉專,我會盡我所能回答疑問!
之後有機會還是想去玩玩midjourney系列的服務……