CV Day 40 實戰:文字生成產品情境圖
執行需求:Colab T4 可跑。今天是「生成任務」這個段落的收尾實戰,我們要把前幾天學的 Stable Diffusion、ControlNet、LoRA、FID、CLIP score 全部整合到一個具體的應用場景——「文字生成產品情境圖」。所謂產品情境圖,是指電商網站、行銷素材、產品示意圖中常見的「產品放在某個使用情境裡」的圖片(例如「一只保溫瓶放在雪山背景的木桌上」)。在 Colab T4 上,整個流程約 18 分鐘:用 SD v1.5 與同一個 prompt 生成 12 張候選圖(不同 seed)、用 CLIP score 排序、寫一個簡單的 HTML 索引頁讓人挑圖、儲存 seed 與 prompt 對照表。讀完之後你應該能回答:「什麼樣的 prompt 結構最有效?」「為什麼要固定 seed?」「負向提示要寫什麼才不會畫出怪手或變形文字?」
引言
前幾天我們把生成模型從 VAE、DCGAN、Diffusion 一路走到 Stable Diffusion 推論、ControlNet/LoRA 微調,再用 FID + CLIP score 評估生成品質,並用合成瑕疵解決 MVTec AD 的長尾問題。整個生成段落走到這裡,「會用 Stable Diffusion」這件事已經完備,今天要把它接到一個更具體的應用——文字生成產品情境圖。
產品情境圖是電商與行銷場景的核心需求之一:消費者在購物網站看到的不是「白底產品照」(那個用手機拍就好),而是「產品放在使用情境裡」的示意圖(一只保溫瓶在登山情境、一張沙發在客廳情境、一副耳機在通勤情境)。傳統上這需要攝影師、模特兒、場景布置、後製修圖,整套流程動輒數萬元與數週時間。Stable Diffusion 把這個流程壓縮到「一段文字描述 + 幾分鐘運算 + 一次人工挑圖」,成本下降一到兩個數量級,並且可以針對不同受眾快速迭代(同一個產品針對 25–35 歲女性與 50–60 歲男性各生一組情境圖)。
這個場景的關鍵挑戰有三個:第一,prompt 設計要能精準描述產品、情境、光照、構圖,否則生成的圖會與品牌需求落差很大;第二,生成結果的可重現性要能保證(同一個 seed + 同一個 prompt 必須產生同樣的圖),否則無法在客戶來回修改時回到「上次那張不錯的圖」;第三,要在合理時間內批次生成足夠的候選、並用結構化的方式挑圖。今天的實作會把這三個挑戰逐一解決,並輸出一份「prompt 模板 + seed 對照表 + HTML 索引頁」的完整工作流。
產品情境圖的 prompt 設計原則
產品情境圖的 prompt 設計可以拆成五個維度:主體(subject)、情境(context)、光照(lighting)、構圖(composition)、技術規格(technical specs)。每個維度都有常用的關鍵字與設計原則,分述如下。
主體是 prompt 的核心。要描述清楚「產品的具體樣式、品牌色、材質」,而不是只寫「a bottle」這種太抽象的描述。具體寫法:「a matte black stainless steel insulated water bottle with a wooden cap」,這個描述同時告訴模型顏色(matte black)、材質(stainless steel)、配件(wooden cap)三件事。實務上越具體的描述,生成結果越可控;太抽象的描述會讓模型自己「補完」,補出來的東西往往跟客戶需求不符。
情境描述產品被放在什麼環境裡。常見的情境類型有:戶外(mountains, forest, beach)、室內(modern living room, cozy kitchen)、辦公(office desk, coworking space)、旅行(airport lounge, train window)、生活(morning routine, dinner table)。情境選擇要對應「目標客群想像中會使用這個產品的場景」——保溫瓶配登山情境吸引戶外族群、咖啡機配早晨廚房吸引都會上班族。一個產品通常會準備 3–5 個不同情境的 prompt 版本,這就是「同一個產品給不同受眾」的快速迭代。
光照直接決定圖片的「氛圍」。常用的關鍵字有:「golden hour」(黃金光線,溫暖放鬆)、「studio lighting」(攝影棚光,乾淨專業)、「soft natural light」(柔和自然光,產品照常用)、「dramatic side lighting」(戲劇性側光,營造對比)、「overcast」(陰天,色彩均勻)。產品情境圖最常用的是前兩種:電商情境圖偏 studio lighting、行銷素材偏 golden hour 或 soft natural light。
構圖描述產品在畫面中的位置與角度。常見的關鍵字有:「centered composition」(產品置中)、「rule of thirds」(三分法)、「low angle shot」(低角度仰拍,產品顯得高大)、「eye level shot」(平視,最自然)、「overhead shot」(俯拍,產品周圍擺設一覽無遺)。構圖關鍵字的選擇要對應「產品用途」——保溫瓶用 eye level、咖啡機用 overhead(俯瞰桌面)、戶外用品用 low angle(仰拍顯得雄偉)。
技術規格影響解析度與細節品質,常用關鍵字有:「8k, ultra detailed」(超高解析度)、「sharp focus」(銳利對焦)、「professional photography」(專業攝影風格)、「cinematic」(電影感)、「DSLR photo with 50mm lens」(單眼相機 50mm 鏡頭,產品照最常用)。這類關鍵字主要是「風格引導」,讓模型的渲染方向偏向「專業攝影」而非「插畫」。但要注意:風格詞對 CLIP score 有放大作用(昨天學過),會讓 CLIP score 虛高,需要在比較時固定 prompt 集合才有意義。
負向提示(negative prompt)是 Stable Diffusion 系列的招牌設計,用來告訴模型「不要畫什麼」。常見的負向提示詞:「blurry, low quality, distorted, deformed, ugly, extra fingers, mutated hands, watermark, text, signature, out of frame」。負向提示對「手指變形」、「產品多出一截」、「背景飄浮物」這類失敗模式特別有效。實務上負向提示的設計比正向提示更能決定生成品質——一個好的負向提示可以一次擋掉 60% 以上的失敗樣本。
可重現性:seed 與 generator 的設計
Stable Diffusion 的採樣過程有隨機性:同樣的 prompt、不同次執行,會生成完全不同的影像。這個特性對「探索階段」是優點(每跑一次都能看到新結果),但對「客戶來回修改階段」是災難——客戶說「上次那張不錯」,你根本回不去那張。可重現性(reproducibility)的解法是固定 seed:把 torch.Generator.manual_seed(N) 傳進 pipeline,pipeline 就會用固定的隨機序列採樣,每次執行同樣 seed + 同樣 prompt + 同樣參數都會得到同樣的影像。
實務上的工作流是這樣的:先用一個 seed 範圍(例如 0 到 100)批次生成 100 張候選影像、把這 100 張整理成索引頁、客戶挑出 3–5 張滿意的、根據這 3–5 張的 seed 與 prompt 繼續微調(修改 prompt 細節、固定 seed 重新生成)。這個流程的關鍵是「seed 要記錄下來」——一份完整的「seed ↔ prompt ↔ 參數」對照表是這個工作流的命脈。客戶說「我要第 7 號那張的構圖、但產品顏色換成藍色」,你只要查對照表找到第 7 號的 seed,把 prompt 改成「... matte blue ...」、其他參數與 seed 都不動,就能生成一張新圖供客戶比較。
另一個可重現性的細節是「模型版本要固定」。同一個 prompt 配 runwayml/stable-diffusion-v1-5 與配 stabilityai/stable-diffusion-2-1-base 會生成完全不同的影像,這個差異比 seed 改變更大。因此「我們這組情境圖是用 SD v1.5 跑的」這個資訊也要記錄下來,未來模型升級時整套 prompt 可能需要重新校準。實務上的做法是把模型 ID、commit hash(如果用 diffusers 的本地模型)、Python 套件版本(diffusers 0.31、transformers 4.46)都記錄在 metadata 裡。
完整實作:批次生成、HTML 索引頁、seed 對照表
以下範例在 Colab T4 上約 18 分鐘。流程是:定義一個 prompt 模板(含主體、情境、光照、構圖、技術規格、負向提示)→ 用 SD v1.5 批次生成 12 張(同一個 prompt、不同 seed)→ 用昨天的 CLIP score 排序 → 把 12 張圖整理成 HTML 索引頁 → 輸出 seed ↔ prompt ↔ CLIP score 對照表 CSV。執行前請先安裝:pip install diffusers==0.31 transformers==4.46 accelerate torch torchvision。
# 1. 載入 SD v1.5 並定義 prompt 模板(主體 + 情境 + 光照 + 構圖 + 技術規格 + 負向提示)
import torch
from diffusers import StableDiffusionPipeline
from pathlib import Path
device = "cuda"
pipe = StableDiffusionPipeline.from_pretrained(
"runwayml/stable-diffusion-v1-5",
torch_dtype=torch.float16, safety_checker=None,
).to(device)
pipe.set_progress_bar_config(disable=True)
OUT = Path("/content/product_shots"); OUT.mkdir(exist_ok=True)
# 主體:保溫瓶(具體描述:霧黑不鏽鋼、木蓋、品牌色)
subject = "a matte black stainless steel insulated water bottle with a wooden cap"
# 情境:登山(戶外、雪、山)
context = "placed on a weathered wooden table, snow-capped mountain background, hiking scenario"
# 光照:黃昏暖光
lighting = "golden hour sunlight, soft warm rim light"
# 構圖:產品置中、平視
composition = "centered composition, eye level shot, shallow depth of field"
# 技術規格
technical = "professional product photography, 8k, sharp focus, DSLR photo with 50mm lens"
positive_prompt = f"{subject}, {context}, {lighting}, {composition}, {technical}"
negative_prompt = ("blurry, low quality, distorted, deformed, ugly, extra fingers, "
"mutated hands, watermark, text, signature, out of frame, "
"oversaturated, unnatural colors, product damage")
print(f"正向 prompt:{positive_prompt}")
print(f"負向 prompt:{negative_prompt}")
# 輸出:
# 正向 prompt:a matte black stainless steel insulated water bottle with a wooden cap, ...
# 負向 prompt:blurry, low quality, distorted, deformed, ugly, extra fingers, ...
這段把「prompt 五維度」組合成一個完整的 prompt 模板,每個維度都用一個變數獨立管理,方便日後微調(換情境只要改 context、換光照只要改 lighting)。負向提示詞是 Stable Diffusion 的招牌設計,這份清單包含三類:「影像品質問題」(blurry、low quality、distorted)、「常見生成缺陷」(extra fingers、mutated hands、watermark、text、signature)、「不適合產品情境的元素」(oversaturated、product damage)。負向提示對「手指變形」這類 SD v1.5 的常見失敗模式特別有效,能擋掉約 60% 的失敗樣本。
實務上 prompt 模板要隨著產品調整——保溫瓶換成「a glossy white ceramic coffee mug with a stainless steel handle」、情境換成「placed on a marble kitchen counter, morning light, modern apartment」就能直接生成咖啡機情境圖。這種「模板化」的 prompt 設計是規模化的基礎:當客戶要 20 個產品各 5 個情境時,模板可以批次套用,僅替換主體與情境兩個欄位。
# 2. 批次生成 12 張候選圖(同一 prompt、不同 seed),確保可重現性
import csv
N_VARIANTS = 12
records = []
for seed in range(N_VARIANTS):
gen = torch.Generator(device=device).manual_seed(seed)
img = pipe(
positive_prompt,
negative_prompt=negative_prompt,
num_inference_steps=25,
guidance_scale=7.5,
height=512, width=512,
generator=gen,
).images[0]
fname = f"seed_{seed:03d}.png"
img.save(OUT / fname)
records.append({"seed": seed, "filename": fname, "prompt": positive_prompt})
print(f"已生成 seed={seed:03d} 的候選圖")
# 輸出:
# 已生成 seed=000 的候選圖
# 已生成 seed=001 的候選圖
# ...
# 已生成 seed=011 的候選圖
這段示範「批次生成 + seed 固定」的核心流程。for seed in range(12) 是批次生成 12 張,每張用不同的 seed(0 到 11)。每張圖都用同一個 torch.Generator(device=device).manual_seed(seed) 初始化,傳進 pipeline 後 pipeline 就用這個 generator 採樣——同樣的 seed + 同樣的 prompt + 同樣的參數,每次都會生成同樣的影像。num_inference_steps=25 是品質與速度的平衡點(昨天用 20 步,今天為了 512×512 提高解析度,用 25 步換取更多細節);guidance_scale=7.5 是社群最常用的 classifier-free guidance 權重。T4 上生成一張 512×512 的影像約 8–10 秒,12 張約 2 分鐘。
這裡刻意把 prompt、negative_prompt、num_inference_steps、guidance_scale 全部固定,只改 seed。這種「單一變因」設計是科學實驗的標準做法:當我們要回答「seed 對結果的影響有多大」時,必須確保其他條件都不變;實務上客戶來回修改時也是同樣邏輯——「換構圖」就只動 composition、「換光照」就只動 lighting,不要一口氣改好幾個維度,否則無法判斷是哪個改變帶來了效果。
# 3. 用 CLIP-base 算 CLIP score,把 12 張候選圖按分數排序
from transformers import CLIPModel, CLIPProcessor
from PIL import Image
clip_model = CLIPModel.from_pretrained("openai/clip-vit-base-patch32").to(device)
clip_proc = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch32")
clip_model.eval()
paths = sorted(OUT.glob("seed_*.png"))
with torch.no_grad():
inputs = clip_proc(
text=[positive_prompt] * len(paths),
images=[Image.open(p).convert("RGB") for p in paths],
return_tensors="pt", padding=True, truncation=True,
)
inputs = {k: v.to(device) for k, v in inputs.items()}
img_emb = clip_model.get_image_features(pixel_values=inputs["pixel_values"])
txt_emb = clip_model.get_text_features(input_ids=inputs["input_ids"],
attention_mask=inputs["attention_mask"])
img_emb = img_emb / img_emb.norm(dim=-1, keepdim=True)
txt_emb = txt_emb / txt_emb.norm(dim=-1, keepdim=True)
scores = (img_emb * txt_emb).sum(dim=-1).cpu().tolist()
for r, s in zip(records, scores):
r["clip_score"] = round(s * 100, 2)
records.sort(key=lambda r: r["clip_score"], reverse=True)
print(f"CLIP score 最高:seed={records[0]['seed']}, score={records[0]['clip_score']}")
print(f"CLIP score 最低:seed={records[-1]['seed']}, score={records[-1]['clip_score']}")
# 輸出(實際數字會略有不同):
# CLIP score 最高:seed=007, score=33.21
# CLIP score 最低:seed=003, score=27.58
這段把昨天學的 CLIP score 套到「同一個 prompt、12 張候選」上。同樣 prompt 的不同 seed 會得到不同的 CLIP score,這個差異反映了「seed 對生成結果的隨機影響」——本範例中 seed=007 的 33.21 與 seed=003 的 27.58 差了 5.63 分,這是 Stable Diffusion 在固定 prompt 下的常見波動範圍。實務上「CLIP score 排名」就是「自動挑圖的第一關」:通常排名最高的 3–5 張會被優先送人工複核,排名最低的 3–5 張通常有問題(構圖怪、主體消失)可以直接淘汰。這個順序給人工複核的「看圖順序」提供了有資訊量的排列。
需要再次強調的是:CLIP score 在這個場景只是「初步篩選」,不是「最終決策」。昨天我們看過了,CLIP 對風格詞非常敏感("studio lighting"、"8k" 這類詞會灌高 CLIP score),所以排名高的影像不一定真的「最適合品牌需求」;最終決策仍然需要人工看圖。
# 4. 把 12 張候選圖整理成 HTML 索引頁,方便人工挑圖
html = ["<!DOCTYPE html><html><head><meta charset='utf-8'>"
"<title>Product Scenario Candidates</title>"
"<style>body{font-family:sans-serif;background:#f7f7f7;margin:20px;}"
".grid{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;}"
".card{background:white;border-radius:8px;padding:12px;box-shadow:0 2px 4px rgba(0,0,0,0.1);}"
".card img{width:100%;border-radius:4px;}"
".meta{font-size:13px;color:#555;margin-top:8px;}"
"</style></head><body>"]
html.append(f"<h1>產品情境圖候選 — 12 張</h1>")
html.append(f"<p><strong>Prompt:</strong>{positive_prompt}</p>")
html.append(f"<p><strong>負向 Prompt:</strong>{negative_prompt}</p>")
html.append("<div class='grid'>")
for r in records:
html.append(
f"<div class='card'><img src='{r['filename']}'/>"
f"<div class='meta'>seed={r['seed']:03d} · CLIP score={r['clip_score']}</div></div>"
)
html.append("</div></body></html>")
with open(OUT / "index.html", "w", encoding="utf-8") as f:
f.write("\n".join(html))
print(f"已輸出 HTML 索引頁到 {OUT / 'index.html'}")
# 輸出:已輸出 HTML 索引頁到 /content/product_shots/index.html
這段把 12 張候選圖整理成一份 HTML 索引頁,用 CSS Grid 排成 3 欄、每張圖下方顯示 seed 與 CLIP score。實務上這份 HTML 就是給客戶或設計團隊「看圖挑圖」的標準介面——打開 index.html 就能看到全部 12 張、按照 CLIP score 由高到低排序、每張都標明 seed(方便日後回頭重現)。HTML 索引頁比單純把所有圖丟給客戶好的地方在於「圖像並排顯示」——客戶可以一眼看出構圖差異(例如「這張雪比較多」、「那張光線比較暖」),而不需要一張一張開啟來看。
CSS 寫法刻意簡單(Grid + flex、簡單陰影、簡單圓角),目的是讓這份 HTML 在任何瀏覽器都能直接打開——不用依賴任何前端框架、不用打包工具。實務上可以再加入「標記最愛」、「標記不要」的勾選欄位,把這份索引頁擴充成「客戶線上標註系統」,但本篇先聚焦最簡形式。
# 5. 輸出 seed ↔ prompt ↔ CLIP score 對照表 CSV,供日後重現
csv_path = OUT / "seed_to_prompt.csv"
with open(csv_path, "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=["seed", "filename", "clip_score", "prompt", "negative_prompt"])
writer.writeheader()
for r in records:
writer.writerow({
"seed": r["seed"], "filename": r["filename"],
"clip_score": r["clip_score"], "prompt": positive_prompt,
"negative_prompt": negative_prompt,
})
print(f"已輸出 seed 對照表到 {csv_path}(共 {len(records)} 列)")
# 輸出:已輸出 seed 對照表到 /content/product_shots/seed_to_prompt.csv
這段把「seed ↔ prompt ↔ CLIP score ↔ negative_prompt」整理成 CSV。這份 CSV 是整個工作流的命脈:客戶說「我要第 3 高分那張的構圖、但產品顏色換成藍色」,你只要打開 CSV、找到對應的 seed(譬如 seed=007)、把 prompt 改成「a matte blue stainless steel insulated water bottle ...」、其他參數與 seed 都不動,重新跑一次 pipeline,就能生成一張新圖供客戶比較。沒有這份對照表時,「回到上次那張」這件事會需要碰運氣(記得 prompt、記得 seed、記得參數⋯⋯),有了這份對照表,重現只需要 30 秒。
實務上這份對照表可以擴充:加入「model_id」、「diffusers_version」、「torch_version」、「inference_steps」、「guidance_scale」、「timestamp」等欄位。當模型或套件版本升級時,這份 metadata 可以幫助你判斷「這批圖是用哪個版本生成的」、「升級後是否需要重新生成」。
# 6. 完整的「回到上次那張」重現範例:客戶要 seed=007 的構圖、但換成藍色
# 從 CSV 讀回原設定、改 prompt、固定 seed,重新生成
import csv
with open(csv_path, "r", encoding="utf-8") as f:
rows = list(csv.DictReader(f))
target = next(r for r in rows if int(r["seed"]) == 7)
print(f"重現 seed=007 的原 prompt:{target['prompt'][:80]}...")
new_subject = subject.replace("matte black", "matte navy blue")
new_prompt = f"{new_subject}, {context}, {lighting}, {composition}, {technical}"
print(f"新 prompt(產品改藍色):{new_prompt[:80]}...")
gen = torch.Generator(device=device).manual_seed(7) # 固定 seed=007
new_img = pipe(
new_prompt,
negative_prompt=negative_prompt,
num_inference_steps=25, guidance_scale=7.5,
height=512, width=512, generator=gen,
).images[0]
new_img.save(OUT / "seed_007_navy_blue.png")
print(f"已重新生成 seed=007 的藍色版本到 {OUT / 'seed_007_navy_blue.png'}")
# 輸出:
# 重現 seed=007 的原 prompt:a matte black stainless steel insulated water bottle with a wooden...
# 新 prompt(產品改藍色):a matte navy blue stainless steel insulated water bottle with a wo...
# 已重新生成 seed=007 的藍色版本到 /content/product_shots/seed_007_navy_blue.png
這段示範「重現 + 微調」的標準流程:客戶滿意 seed=007 的構圖、但產品想從黑色換成海軍藍。我們從 CSV 讀回 seed=007 的原始 prompt、用 str.replace 把「matte black」換成「matte navy blue」、固定 generator.manual_seed(7)、其他參數(num_inference_steps、guidance_scale、尺寸)全部不動,重新跑 pipeline。這樣做的關鍵是「除了顏色,其他都固定」——客戶可以明確比較「是顏色改變帶來的差異,還是其他因素」。如果連 seed 都換了,客戶看到差異時會分不清「是顏色換了」還是「是隨機採樣換了」。
這種「固定 seed + 改 prompt 細節」的迭代流程是 Stable Diffusion 實務的標準工作模式:先批次生成 100–200 張候選、客戶挑圖、固定 seed 進行微調迴圈(改構圖、改光照、改主體細節、改負向提示),每一輪微調都是「只改一個維度」的單一變因實驗。這個流程的可重現性完全依賴前面的 seed 對照表與固定 generator,這也是為什麼今天要把這份 CSV 當作工作流的核心資產。
常見錯誤與踩雷
錯誤一:prompt 寫太短、太抽象。如果只寫「a water bottle」,模型會自己決定顏色、材質、配件,生成出來的東西跟客戶需求落差很大。對應排查方向:用「主體 + 情境 + 光照 + 構圖 + 技術規格」五維度結構化 prompt,每個維度至少 3–5 個關鍵字。
錯誤二:忘了寫負向提示。SD v1.5 在生成人物時容易出現「手指變形」、「額外手指」、「產品多出一截」這類失敗模式;負向提示詞能擋掉約 60% 的失敗樣本。對應排查方向:負向提示詞清單至少包含「blurry, low quality, distorted, deformed, extra fingers, mutated hands, watermark, text」這幾個基本款,產品情境圖再加「product damage, out of frame」。
錯誤三:客戶來回修改時忘記固定 seed。如果客戶說「上次那張構圖不錯」,但你沒有固定 seed,下一次執行同樣 prompt 會生成完全不同的圖,無法回到「上次那張」。對應排查方向:每次生成時都用 torch.Generator.manual_seed(N) 固定 seed,把這個 seed 寫進 CSV;微調時只改 prompt 細節、保留 seed 與其他參數。
錯誤四:批次生成太多導致 VRAM 不足。SD v1.5 在 FP16 下生成 512×512 約佔 3–4 GB VRAM,T4 的 16 GB 還有餘裕;但如果同時生成多張(batch_size > 1),VRAM 會快速堆高。對應排查方向:批次生成時每張獨立呼叫 pipeline(不傳 num_images_per_prompt > 1),或把 num_images_per_prompt 限制在 4 以內;真的要批次就用順序呼叫,把中間變數釋放掉(del pipe_output; torch.cuda.empty_cache())。
錯誤五:解析度設太高導致 VRAM 爆炸。SD v1.5 預訓練在 512×512,硬上 1024×1024 會產生「重複物體」、「臉部變形」這類失敗模式(這是 SD 系列的已知限制,要靠 SDXL 解決)。對應排查方向:SD v1.5 建議解析度 512×512 或 768×768,不要超過 1024×1024;真的要 1024 以上請改用 SDXL 或後續模型(但模型版本要記錄下來)。
效能與實務提醒
在 Colab T4 上跑完整個流程的時間分配:載入 SD v1.5 約 4 分鐘、生成 12 張 512×512 約 2 分鐘、CLIP score 計算約 1 秒、輸出 HTML 與 CSV 約 1 秒,加起來約 6 分鐘(扣掉模型載入時間,純生成只要 2 分鐘)。如果用 SD-Turbo(stabilityai/sd-turbo),單步推論可以把 12 張的時間壓到 30 秒;代價是細節略差、CLIP score 平均略低(約低 1–2 分)。
實務上的三個關鍵取捨:第一,prompt 模板的「情境數量」要對應「目標客群數量」——同一個產品配 3–5 個情境(登山、辦公、居家、旅行、禮物)就能覆蓋大多數受眾;第二,負向提示詞清單要隨著「累積的失敗樣本」持續更新——每次人工複核發現新失敗模式,就把它加進負向提示;第三,可重現性 metadata(seed、prompt、negative_prompt、num_inference_steps、guidance_scale、模型版本)要全部記錄在 CSV 裡,這份 CSV 是日後客戶來回修改、模型升級、新人接手時的唯一依據。整個文字生成產品情境圖的工作流可以總結成一句話:「批次生成、CLIP 排序、人工挑圖、seed 對照、單維度微調」——五件事都做到,規模化就可行。
小結
今天我們把整個生成段落的最後一個應用「文字生成產品情境圖」實作完成。流程包含 prompt 五維度設計(主體、情境、光照、構圖、技術規格)、負向提示設計、固定 seed 批次生成 12 張、CLIP score 排序、HTML 索引頁輸出、seed 對照表 CSV 輸出、「重現 + 微調」範例。重點觀念有四個:第一,prompt 五維度結構化能大幅提升生成結果的可控性;第二,負向提示能擋掉 60% 以上的常見失敗樣本,是 SD 系列最簡單也最有效的品質提升手段;第三,固定 seed 是可重現性的核心,沒有 seed 對照表就無法在客戶來回修改時回到「上次那張」;第四,微調時只改一個維度(構圖、光照、主體細節)是標準的單一變因實驗設計。生成段落到這裡告一段落;明天開始我們會進入貫穿專案的最後一段:Day 41 專案定義與資料整備,把「合成罕見瑕疵」這條技術路線正式整合進工業瑕疵檢測的完整流程,並為 Day 42–44 的模型訓練、評估、部署做準備。
結語
今天的重點是「文字生成產品情境圖的完整工作流」。我們把前幾天學的 Stable Diffusion、CLIP score、固定 seed、負向提示等技術整合到一個具體的應用場景,並用 prompt 模板、HTML 索引頁、seed 對照表三件套把整個流程結構化。讀完這篇你應該能回答:什麼樣的 prompt 結構最有效?為什麼要固定 seed?負向提示要寫什麼?怎麼在客戶來回修改時回到「上次那張」?明天,我們會進入貫穿專案的最後一段:Day 41 專案定義與資料整備,把「合成罕見瑕疵」這條技術路線正式整合進工業瑕疵檢測的完整流程,並規劃 Day 42–44 的模型訓練、評估、部署工作。生成段落告一段落,但 Stable Diffusion 這條技術路線會在貫穿專案中持續扮演「補足長尾資料」的角色。
延伸資源
- Stable Diffusion v1.5 官方權重(RunwayML,2022,CreativeML Open RAIL-M 授權):
https://huggingface.co/runwayml/stable-diffusion-v1-5,今天所有生成範例都基於這個權重;使用前需同意授權條款。 openai/clip-vit-base-patch32(OpenAI,2021,MIT 授權):https://huggingface.co/openai/clip-vit-base-patch32,CLIP-base 模型,今天用來做候選圖排序。- diffusers 官方文件(0.31,2024):
https://huggingface.co/docs/diffusers/index,Stable Diffusion pipeline 的完整 API 與進階用法。 - Stable Diffusion prompt 設計指南(Stable Diffusion 社群,2024):
https://stable-diffusion-art.com/prompt-guide/,prompt 五維度(主體、情境、光照、構圖、技術規格)與負向提示的社群整理。 - Day 36 章節(Stable Diffusion 推論實戰):
https://blog.hao-code.com/2024/12/cv-day-36-stable-diffusion.html,本系列對 Stable Diffusion 推論的第一次完整實作,今天的工作流是它的延伸。 - Day 37 章節(ControlNet 與 LoRA):
https://blog.hao-code.com/2024/12/cv-day-37-controlnet-lora.html,本系列對 ControlNet 與 LoRA 的介紹,實務上產品情境圖會用 ControlNet 控制構圖(例如指定邊界框)。 - Day 38 章節(FID 與 CLIP score):
https://blog.hao-code.com/2024/12/cv-day-38-fid-clip-score.html,昨天的章節,今天的 CLIP score 排序是它的具體應用。 - Day 39 章節(生成式資料增強):
https://blog.hao-code.com/2024/12/cv-day-39-generative-augmentation.html,昨天的章節,今天的「批次生成 + CLIP 過濾」流程是它在產品情境圖領域的延伸。
留言
張貼留言