當前位置: 華文世界 > 科技

Python| 如何使用 DALL·E 和 OpenAI API 生成影像(1)

2024-10-11科技

引言

想象一下,只要描述你想要的畫面,電腦就能幫你畫出來。這在幾年前還像是科幻小說裏的場景,但隨著神經網絡和潛在擴散模型(LDM)技術的發展,現在已經成為可能。OpenAI 推出的 DALL·E 工具,因其能生成令人驚嘆的藝術作品和逼真的影像而廣受歡迎。

你可以透過 OpenAI 的 API 存取 DALL·E,這樣你就可以將它的功能整合到你的 Python 程式中。

本教程[1]將帶你:

  • 快速上手 OpenAI 的 Python 庫
  • 探索與影像生成相關的 API 呼叫
  • 根據文本提示生成影像
  • 制作生成影像的不同版本
  • 將 Base64 格式的 JSON 響應轉換成 PNG 圖檔
  • 環境準備

    如果你對 DALL·E 的強大功能感到好奇,並希望將其整合到你的 Python 專案中,那麽這篇文章正是你需要的。在本節中,你將快速了解如何開始在你的程式碼中利用 DALL·E 來建立影像。

  • 安裝 OpenAI Python 庫
  • 請確保你的 Python 版本至少是 3.7.1,並建立一個虛擬環境來隔離專案依賴。接下來,安裝 OpenAI 提供的 Python 庫,以便使用 DALL·E 的功能。

    $ python --versionPython 3.12.5$ python -m venv venv$ source venv/bin/activate(venv) $ python -m pip install openai

    openai 包讓您可以存取完整的 OpenAI API。在本教程中,您將重點關註影像生成,它使您可以與 DALL·E 模型互動,根據文本提示建立和編輯影像。

  • 獲取您的 OpenAI API 金鑰
  • 您需要 API 金鑰才能成功進行 API 呼叫。註冊 OpenAI 並透過單擊儀表板選單,然後單擊導航選單左下角的 API 金鑰來建立新的專案 API 金鑰:

    在此頁面上,您可以建立和管理您的 API 金鑰,這使您可以存取 OpenAI 透過其 API 提供的服務。您可以建立和刪除金鑰。單擊「建立新金鑰」以建立新的 API 金鑰,並復制彈出視窗中顯示的值。復制此鍵的值,以便稍後可以在專案中使用它。您只會看到該鍵值一次。

  • 將您的 API 金鑰保存為環境變量
  • 保存 API 金鑰並使其可用於 Python 指令碼的一種快速方法是將其保存為環境變量。選擇您的作業系統以了解如何:

    (venv) $ export OPENAI_API_KEY="<your-key-value-here>"

    透過執行這條指令,你可以在當前的終端會話中設定一個名為 OPENAI_API_KEY 的環境變量,以便存取你的 API 金鑰。請記住,一旦你關閉了終端視窗,這個金鑰就會失效。

    你可以根據個人喜好來命名這個環境變量,但如果你按照 OpenAI 的官方文件建議,使用 OPENAI_API_KEY 這個名字,那麽你就能夠直接使用文件中的程式碼範例,無需進行額外的配置。

    現在,準備工作已經完成,你的 API 金鑰也已安全儲存,你可以開始根據文本提示來生成影像了。

    根據文本描述生成影像

    首先,透過命令列界面呼叫 openai 庫來確保你的環境已經配置完畢,準備開始使用。

    (venv) $ openai api images.generate -p "a vaporwave computer"

    該命令將向 OpenAI 的影像 API 發送請求,並根據文本提示「蒸汽波電腦」建立影像。因此,您將收到一個 JSON 響應,其中包含指向您新建立的影像的 URL:

    { "created": 1723549436, "data": [ { "b64_json": null, "revised_prompt": null, "url": "https://oaidalleapiprodscus.blob.core.windows.net/private/org ⮑ -H8Satq5hV2dscyutIStbN89m/user-O5O8mpE4TugEI9zqpxx8tGPt/img-4rDZEQ ⮑ leCdzAD3fuWowgLb5U.png?st=2024-08-13T10:43:56Z&se=2024-08-13T1 ⮑ 2:43:56Z&sp=r&sv=2024-08-04&sr=b&rscd=inline&rsct=image/png&sk ⮑ oid=d505667d-d6c1-4a0a-bac7-5c84a87759f8&sktid=a48cca56-e6da-484e- ⮑ a814-9c849652bcb3&skt=2024-08-12T23:00:04Z&ske=2024-08-13T23%3 ⮑ A00:04Z&sks=b&skv=2024-08-04&sig=c+BmroDkC0wkA2Lu8MxkvXpxjdW5 ⮑ B18iQ4e4BwJU6k=" } ]}

    單擊您的 URL 或將其復制並貼上到瀏覽器中以檢視影像。這是 DALL·E 針對這一要求設想的影像:

    你的生成影像會是獨一無二的。這是因為擴散模型僅在你發起請求時才生成影像。

    提示 :你生成的影像的連結僅在一小時內有效,所以如果你對生成的影像感到滿意並希望長期保存,請務必及時將其下載到你的電腦上。

    當你向 API 發送請求時,需要遵守 OpenAI 的使用條款。如果你提供的文本提示違反了這些條款,你將收到錯誤提示,並且如果屢次違規,你的賬戶可能會被封禁。

    既然你已經驗證了所有設定都正確無誤,並且對使用 OpenAI API 生成影像的功能有了初步了解,接下來你將學習如何將其整合到 Python 指令碼中。

    呼叫 API

    能夠透過命令列界面(CLI)生成影像固然不錯,但如果能將這項功能整合到你的 Python 套用中就更棒了。你可以借此構建許多激動人心的專案!

    開啟你常用的程式碼編輯器,編寫一個指令碼。這個指令碼將用於根據文本提示生成影像,操作方式與你之前在命令列中進行的操作類似。

    但這一次,你將明確指定要使用的 DALL·E 模型版本:

    from openai import OpenAIclient = OpenAI()PROMPT = "A vaporwave computer"response = client.images.generate( model="dall-e-3", prompt=PROMPT,)print(response.data[0].url)

    與之前類似,這段程式碼向 API 發送了一個經過認證的請求,根據 PROMPT 中的文本生成一張圖片。這段程式碼還做了一些最佳化,以便你在指令碼中添加更多功能:

    第 3 行初始化了 OpenAI 的一個例項,並將其儲存為 client。這個例項已經包含了身份驗證資訊,因為你已經將環境變量命名為 OPENAI_API_KEY。如果你遵循了這個命名規則,它會自動從你的環境變量中獲取 API 金鑰值。當然,你也可以在建立例項時直接透過 api_key 參數傳遞 API 金鑰。

    第 5 行將文本提示定義為一個常量。這樣做的好處是,如果你需要修改提示文本,只需要在指令碼頂部找到這個常量並進行修改,非常方便。

    第 7 行呼叫了 client 的 .images.generate() 方法。接下來的幾行程式碼展示了你可以傳遞給這個方法的一些參數。

    第 8 行指定使用更新的 DALL·E 3 模型,它不僅以不同的方式處理你的提示,還支持不同的參數設定、圖片尺寸和質素,與預設的 DALL·E 2 模型有所區別。

    第 9 行將 PROMPT 的值傳遞給名為 prompt 的參數。這樣,你就為 DALL·E 提供了用於生成圖片的文本。別忘了,你之前在命令列中呼叫 API 時也傳遞了文本提示。

    最後,你還需要獲取生成圖片的 URL,以便線上檢視。為此,你需要存取響應物件的 .url 內容,並在第 12 行將其值打印到終端。

    當你執行這個指令碼時,你將得到一個類似於之前的輸出,但現在只會顯示 URL,而不會顯示完整的 JSON 響應。

    (venv) $ python create.pyhttps://oaidalleapiprodscus.blob.core.windows.net/private/org-H8Satq5hV2d⮑ scyutIStbN89m/user-O5O8mpE4TugEI9zqpxx8tGPt/img-hMAEPhuqVH73JMRQ6BOV4J⮑ Hz.png?st=2024-08-13T10:56:54Z&se=2024-08-13T12:56:54Z&sp=r&sv⮑ =2023-11-03&sr=b&rscd=inline&rsct=image/png&skoid=d505667d-d6c1-4a0a-b⮑ ac7-5c84a87759f8&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2024-0⮑ 8-12T21:36:11Z&ske=2024-08-13T21:36:11Z&sks=b&skv=2023-11-03&s⮑ ig=D7K6UF353uO3wJDOovbeyBsn2yaf384kEotVbjJ5SB4=

    單擊連結或將其貼上到瀏覽器中以檢視生成的影像。因為您現在使用的是 DALL·E 3 模型,所以輸出可能看起來更引人註目:

    這表明影像的質素和細節有了顯著提高,看起來新模型對蒸汽波風格的理解更加深入。

    雖然這很有可能,但在背後還有一些其他因素也在影響著影像細節的提升。當你請求使用 DALL·E 3 模型生成影像時,它會在生成影像前對你的提示進行重新編輯。

    如果你想知道 DALL·E 在生成影像時實際使用的修改後的提示是什麽,你可以透過 .revised_prompt 內容來檢視。

    # ...print(response.data[0].revised_prompt)

    在請求生成影像時,通常來說,提供更詳細的描述會得到更理想的結果。在你的描述中加入更多的細節可以大幅提升效果!例如,下面是生成上面影像所用的詳細描述:

    想象一台帶有蒸汽波風格的電腦;它像是一台80年代的老式機器,被霓虹粉和藍色光暈所包圍。它的設計充滿了懷舊感,機身裝飾著復古的字型。外殼上印有發光的數碼棕櫚樹,讓人聯想到老式影片遊戲中的場景。背景中可以看到希臘雕塑和蒸汽波設計中常見的故障日落圖案,完美地結合了現代與復古的元素。

    這比你最初提供的描述要詳細得多!

    註意 :只有對 DALL·E 3 模型的請求才會進行提示重寫,所以如果你使用的是 DALL·E 2,這個內容將不存在。

    雖然 DALL·E 3 能夠生成更令人印象深刻的影像,但它不允許你關閉提示重寫功能,這意味著你對輸出的控制會減少。此外,這個模型目前還沒有完全開放所有功能。

    因此,在本教程的後續部份,你將繼續使用 DALL·E 2。首先,編輯指令碼,在呼叫 .generate() 方法時添加一些額外的參數。同時,不妨也為你最初的描述增加一些細節:

    from openai import OpenAIclient = OpenAI()PROMPT = "An eco-friendly computer from the 90s in the style of vaporwave"response = client.images.generate( model="dall-e-2", # Default prompt=PROMPT, n=1, size="256x256",)print(response.data[0].url)

    你已經為你的描述增加了一些細節,並切換回了預設的 DALL·E 2 模型。此外,你還添加了兩個新參數來進一步客製生成的影像:

    第 10 行將數碼 1 指定給參數 n。這個參數允許你定義想要根據描述生成的新影像數量。n 的值應在 1 到 10 之間,預設為 1。

    第 11 行設定了 size 參數的值。透過這個參數,你可以指定 DALL·E 生成影像的尺寸。這個參數需要是一個字串,可用的尺寸會根據你使用的模型而有所不同。對於 DALL·E 2,可選的尺寸有 "256x256"、"512x512" 或 "1024x1024"。每個字串都代表了你將收到的影像的像素尺寸,預設為最大的 "1024x1024"。

    在你的指令碼最後,你再次將生成影像的 URL 輸出到終端。你已經移除了打印 .revised_prompt 的程式碼行,因為在 DALL·E 2 中這個值是不存在的。

    當你執行指令碼後,你會得到一個新的 URL 作為回應。點選這個連結或將其復制到你的瀏覽器中,就可以檢視生成的影像了。和之前一樣,你的影像會有所不同,但應該與你在 PROMPT 中使用的描述相似。由於你這次使用的是 DALL·E 2,所以影像的細節可能會比上一次少一些。

    你可能會註意到,這次生成的影像比你之前建立的要小得多。這是因為你透過 size 參數指定了生成一張 256x256 像素的圖片。較小的影像成本較低,所以你剛剛省下了一筆費用!作為一個節省成本的成功者,也許你還想保存其他東西——比如你的影像數據。

    [1]Source: https://realpython.com/generate-images-with-dalle-openai-api/