Midjourney 的影像生成仰賴有效的提示詞策略。除了基礎的提示詞設計外,更進階的技巧包含參考其他成功案例的 Meme 對映、修改現有作品的影像重混,以及利用 /shorten 指令分析提示詞權重,精準調整生成結果。更進一步,可以透過本地佈署 Stable Diffusion 或使用 Dream-Studio API,更彈性地控制生成引數,實作更精細的影像生成效果。
在影像生成領域中,提示詞工程扮演著舉足輕重的角色。一個精心設計的提示詞能夠有效引導 AI 模型生成高品質且符合預期的影像。本文除了介紹 Midjourney 的提示詞技巧外,也探討了 Stable Diffusion 的使用,包含本地佈署、API 呼叫以及程式碼範例,讓讀者能夠更全面地掌握影像生成技術。
提示工程的最佳實踐:影像生成的進階技巧
在影像生成領域,提示工程(Prompt Engineering)扮演著至關重要的角色。適當的提示詞(prompt)設計能夠顯著提升生成影像的品質和準確性。本章節將探討Midjourney影像生成工具中的標準實踐方法,特別是在提示詞最佳化、靈感來源探索以及影像品質評估等方面。
影像重混的藝術
影像重混是一種創意十足的技巧,它允許使用者透過修改現有的藝術作品來創造新的影像。這種方法不僅能夠產生令人驚豔的視覺效果,還能夠激發新的創意靈感。例如,將達利(Dali)的超現實主義風格與現代場景結合,可以創造出獨特且引人入勝的藝術作品。
影像重混的實踐
以達利風格的時報廣場(Times Square)為例,我們可以透過調整顏色和元素來創造出新的影像。這種方法不僅限於修改現有作品,還可以將不同藝術家的元素結合起來,創造出全新的藝術作品。
graph LR
A[原始影像] -->|修改顏色|> B[調整後影像]
A -->|新增元素|> C[增強後影像]
B -->|結合元素|> D[新影像]
C -->|結合元素|> D
圖表翻譯: 此圖示展示了影像重混的過程,從原始影像出發,透過修改顏色和新增元素,最終創造出新的影像。
影像重混的技術限制
目前,這種技術主要適用於那些訓練資料中包含的知名藝術家和作品。隨著AI模型朝著多模態(multi-modal)方向發展,未來將能夠直接輸入影像並獲得相應的描述,從而進一步擴充套件創作的可能性。
Meme對映:探索提示詞的靈感來源
Meme對映是一種系統性地尋找和識別成功提示詞模式的方法。透過瀏覽Midjourney Discord社群、Reddit以及其他相關網站,使用者可以發現許多成功的提示詞範例。Lexica.art是一個非常有用的資源,它提供了一個可搜尋的資料函式庫,包含了許多Stable Diffusion影像及其對應的提示詞。
Meme對映的實踐
以「Super Mario」為例,透過在Lexica上搜尋相關影像,使用者可以發現許多建立真實風格Mario的範例。這種方法不僅能夠節省時間,還能夠激發新的創意。例如,將「as a Soviet factory worker」新增到提示詞中,可以增強影像的真實感和粗糙感。
輸入:portrait of Homer Simpson as a Soviet factory worker, gritty, dirty, beautiful, very detailed, hyperrealistic, medium shot, very detailed painting by Glenn Fabry, by Joao Ruas --no cartoon
Meme對映的技術實作
Meme對映可以手動進行,透過複製和貼上範例到電子試算表或生產力工具中。然而,這種方法耗時且效率低下。因此,可以透過編寫自定義程式碼來程式化地抓取網站內容,並使用實體識別模型(如Google Vision)或多模態模型(如GPT-4 Vision)對影像進行標註和分析,從而更高效地識別模式。
提示詞分析:最佳化生成結果
在設計提示詞時,一個常見的錯誤是不斷增加詞語數量,而沒有思考哪些詞語是真正必要的。過多的詞語會為模型增加噪聲,影響最終的生成結果。Midjourney提供了/shorten命令,可以幫助使用者簡化提示詞,去除不必要的詞語。
提示詞分析的實踐
透過/shorten命令,使用者可以獲得提示詞中每個詞語的重要性權重。例如,對於以下提示詞:
輸入:portrait of Homer Simpson as a Soviet factory worker, gritty, dirty, beautiful, very detailed, hyperrealistic, medium shot, very detailed painting by Glenn Fabry, by Joao Ruas --no cartoon
輸出:**portrait** (0.08) of **homer simpson** (1.00) as a **soviet** (0.19) **factory** (0.21) **worker** (0.08), gritty (0.02), dirty (0.02), beautiful (0.0), very (0.0) detailed (0.01), hyperrealistic (0.01), medium (0.0) shot (0.0), very (0.0) detailed (0.01) painting (0.05) by Glenn Fabry (0.08), by **Joao Ruas** (0.09)
提示詞分析的技術解讀
透過分析權重,使用者可以清楚地看到哪些詞語對最終結果影響最大。例如,在上述範例中,「Homer Simpson」、「Soviet」、「factory」等詞語具有較高的權重,而「beautiful」、「very」等詞語權重較低。這種分析能夠幫助使用者最佳化提示詞,提高生成影像的品質。
影像品質評估
評估生成影像的品質是提示工程中的重要一環。透過分析模型的權重分配,使用者可以深入瞭解模型的運作機制,並根據實際情況調整提示詞,從而獲得更好的生成結果。
影像品質評估的重要性
瞭解模型對每個詞語的權重分配,可以幫助使用者糾正對提示詞重要性的誤解。透過這種分析,使用者可以更準確地控制生成結果,提高影像品質。
隨著多模態AI模型的進一步發展,使用者將能夠更靈活地結合文字和影像進行創作。這將為藝術創作、設計和其他相關領域帶來革命性的變化。未來,我們可以期待看到更多根據AI的創意工具和應用出現。
參考資料
- Midjourney官方檔案
- Lexica.art資料函式庫
- GPT-4 Vision模型介紹
附錄:程式碼範例
以下是一個簡單的Python指令碼,用於從Lexica.art抓取影像及其對應的提示詞:
import requests
from bs4 import BeautifulSoup
def scrape_lexica(query):
url = f"https://lexica.art?q={query}"
response = requests.get(url)
soup = BeautifulSoup(response.content, 'html.parser')
# 解析HTML內容並提取所需資訊
# 這裡僅為示例,實際實作需要根據Lexica.art的HTML結構進行調整
images = soup.find_all('img')
prompts = []
for img in images:
# 假設圖片的alt屬性包含提示詞
prompts.append(img['alt'])
return prompts
# 示例用法
prompts = scrape_lexica("Super Mario")
for prompt in prompts:
print(prompt)
內容解密:
此Python指令碼示範瞭如何使用requests和BeautifulSoup函式庫從Lexica.art抓取與特定查詢相關的影像及其對應的提示詞。首先,指令碼傳送一個GET請求到Lexica.art,並根據查詢引數檢索相關內容。接著,使用BeautifulSoup解析HTML回應內容,並提取所有圖片標籤。假設圖片的alt屬性包含提示詞,指令碼將這些提示詞收集到一個列表中並傳回。這種技術可以用於自動化地收集和分析大量的提示詞資料,為Meme對映提供支援。
進階影像生成技術:使用Stable Diffusion
大多數與AI影像相關的工作只需要簡單的提示工程技術,但當需要對輸出結果有更多的創意控制,或是想要為特定任務訓練自定義模型時,就需要更強大的工具。這些更複雜的能力往往需要更多的技術能力和結構化思維,作為建立最終影像的工作流程的一部分。
本章節中的所有影像都是由Stable Diffusion XL生成,除非另有說明,例如在依賴於ControlNet等擴充套件的部分,舊版的v1.5模型支援更多的方法。所討論的技術被設計為可轉移到任何未來或替代模型。我們廣泛使用了AUTOMATIC1111的Stable Diffusion WebUI,並提供了詳細的設定說明,這些說明在寫作時是最新的,但請參考官方儲存函式庫以取得最新的說明,並診斷您遇到的任何問題。
執行Stable Diffusion
Stable Diffusion是一個開源的影像生成模型,因此如果您有NVIDIA或AMD GPU,或者是搭載M1、M2或M3的Mac,您可以在本地電腦上免費執行它。第一個流行版本(1.4)的Stable Diffusion通常在Google Colab筆記本中執行,它提供了免費的雲端GPU存取(儘管如果Google限制免費層,您可能需要升級到付費帳戶)。
如果您之前沒有使用過Google Colab,請存取Google Colab網站,或查詢有關限制的最新資訊。本文的GitHub儲存函式庫中儲存了一份Python筆記本的副本,但您應該將其上傳到Google Drive並在Google Colab中執行,以避免設定問題。
安裝Stable Diffusion
可以透過Hugging Face的diffusers函式庫以及少數依賴項來安裝Stable Diffusion。在Google Colab中,以下程式碼安裝了必要的依賴項(如果在本地安裝而不是在Jupyter Notebook或Google Colab中,則會刪除感嘆號(!)):
!pip install diffusers==0.11.1
!pip install transformers scipy ftfy accelerate
下載和使用模型
要下載和使用模型,首先需要建立一個推理管道(在使用模型時執行的管道):
# 建立一個推理管道
import torch
from diffusers import StableDiffusionPipeline
pipe = StableDiffusionPipeline.from_pretrained(
"CompVis/stable-diffusion-v1-4",
torch_dtype=torch.float16)
pipe = pipe.to("cuda")
內容解密:
import torch:匯入PyTorch函式庫,這是一個用於機器學習的開源函式庫,廣泛用於電腦視覺和自然語言處理等應用。from diffusers import StableDiffusionPipeline:從diffusers函式庫中匯入StableDiffusionPipeline類別,這是一個用於使用擴散模型的管道,Stable Diffusion是最流行的例子。pipe = StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v1-4", torch_dtype=torch.float16):使用預訓練權重建立一個StableDiffusionPipeline例項。from_pretrained方法載入了預訓練模型的權重,這裡的模型是CompVis/stable-diffusion-v1-4。torch_dtype=torch.float16引數指定了模型中使用float16資料型別,這是一種半精確度浮點數格式。使用float16可以加快模型計算速度並減少記憶體使用量(對於保持在Google Colab免費層限制內是必要的)。pipe = pipe.to("cuda"):將管道移動到GPU(如果可用的話),以利用GPU加速計算。
Stable Diffusion工作流程圖示
graph LR
A[開始] --> B[安裝依賴]
B --> C[下載模型]
C --> D[建立推理管道]
D --> E[生成影像]
E --> F[結束]
**圖表翻譯:**此圖示呈現了使用Stable Diffusion生成影像的基本流程。首先,需要安裝必要的依賴項。接著,下載預訓練的Stable Diffusion模型。然後,建立一個推理管道,並利用該管道生成影像。最後,完成整個過程。
進階技術與未來方向
本章節將探討更多進階的影像生成技術,包括如何利用ControlNet模型對影像的風格和構圖進行更精細的控制。這些技術將顯著提高影像生成的品質和可靠性,為創作者提供更廣泛的創作可能性。
隨著Stable Diffusion和相關技術的不斷發展,我們可以預見未來將會有更多創新性的應用出現,為藝術創作、設計和娛樂等領域帶來革命性的變化。
使用CUDA加速Stable Diffusion模型
在進行大規模的影像生成任務時,使用GPU加速可以顯著提高運算效率。以下程式碼展示瞭如何將Stable Diffusion模型遷移到CUDA支援的GPU上:
pipe = pipe.to("cuda")
內容解密:
這行程式碼將pipe模型遷移到GPU上。“cuda"字串指的是CUDA,一種由Nvidia開發的平行計算平台和應用程式介面(API)模型。透過這一步驟,pipe模型的所有計算將在GPU上執行,對於大型模型和資料來說,這比在CPU上執行要快得多。
設定提示詞與生成引數
接下來,我們需要設定提示詞和其他引數來引導模型生成影像:
prompt = "a photograph of an astronaut riding a horse"
generator = torch.Generator("cuda").manual_seed(1024)
image = pipe(prompt, num_inference_steps=50, guidance_scale=7, generator=generator).images[0]
內容解密:
prompt變數定義了輸入模型的提示詞,用於引導影像生成。generator變數建立了一個PyTorch生成器,並設定了隨機種子為1024,以確保結果的可重現性。image變數透過呼叫pipe模型生成影像。引數包括:num_inference_steps=50:模型進行50步的推理,更多的步驟通常會得到更高品質的影像,但會消耗更多時間。guidance_scale=7:控制提示詞對生成影像的影響程度,較高的值會使影像更貼近提示詞,但可能會導致影像品質下降或多樣性降低。generator=generator:傳入之前建立的隨機數生成器。
儲存與顯示生成的影像
生成的影像可以儲存到本地檔案系統,或在支援的環境中直接顯示:
image.save(f"astronaut_rides_horse.png")
image
內容解密:
image.save()方法將生成的影像儲存為PNG檔案。- 在Jupyter Notebook或Google Colab等環境中,直接輸入
image會自動顯示影像。
使用Stability AI的Dream-Studio API
除了本地執行模型外,Stability AI提供了Dream-Studio API,方便使用者透過API呼叫Stable Diffusion模型生成影像。以下是使用API的範例程式碼:
import os
import base64
import requests
from IPython.display import Image
engine_id = "stable-diffusion-xl-1024-v1-0"
api_host = os.getenv('API_HOST', 'https://api.stability.ai')
api_key = os.getenv("STABILITY_API_KEY")
image_description = "computers being tied together"
prompt = f"""an illustration of {image_description}. in the style of corporate memphis, white background, professional, clean lines, warm pastel colors"""
response = requests.post(
f"{api_host}/v1/generation/{engine_id}/text-to-image",
headers={
"Content-Type": "application/json",
"Accept": "application/json",
"Authorization": f"Bearer {api_key}"
},
json={
"text_prompts": [{"text": prompt}],
"cfg_scale": 7,
"height": 1024,
"width": 1024,
"samples": 1,
"steps": 30,
},
)
if response.status_code != 200:
raise Exception("Non-200 response: " + str(response.text))
data = response.json()
image_paths = []
if not os.path.exists("./out"):
os.makedirs("./out")
for i, image in enumerate(data["artifacts"]):
filename = f"./out/image-{i}.png"
with open(filename, "wb") as f:
f.write(base64.b64decode(image["base64"]))
image_paths.append(filename)
Image(filename=image_paths[0])
內容解密:
- 程式碼首先匯入必要的函式庫並設定API相關引數,包括
engine_id、api_host和api_key。 - 定義了影像描述和提示詞,並建構了API請求。
- 傳送POST請求到Dream-Studio API,包含提示詞、影像尺寸、推理步數等引數。
- 處理API回應,儲存生成的影像到本地,並顯示第一張影像。