生成式 AI - 根據關鍵字產生圖片

1. 簡介

上次更新時間:2023 年 10 月 12 日

產生圖像

Google 圖片是強大的 Google 大型語言模型,可根據文字描述產生寫實創意的圖片。Vertex AI 中的 Imagen 可讓使用者在幾秒內建構新一代 AI 產品,將使用者的想像力轉化為高品質的視覺素材資源。除了文字生成圖片外,這項功能也支援透過文字提示、圖片說明文字、圖像問答、主題與風格式圖像模型調整。

生成提示

如要使用 Imagen 建立圖片,您需要提供圖片的文字說明 (即提示),並使用生成的圖片。不過,如要生成高品質的擬真圖片,就必須提示專業知識。如果您想生成與特定業務領域 (例如零售、製造等) 相關的圖片,這也取決於網域。

整體方法大致上是

fbb3826592b2816d.png

GRadio 使用者介面

Gradio 是開放原始碼的 Python 程式庫,可讓您使用幾行程式碼,快速為機器學習模型、任何 API 或甚至是任意 Python 函式建立簡單好用且可自訂的 UI 元件。您可以直接將 GRadio GUI 整合至 Jupyter 筆記本,或是透過連結與任何人分享。GRadio 支援多種媒體類型,包括文字、圖片、影片和音訊。此模式也提供許多預先建立的 UI 元件,例如輸入欄位、按鈕、滑桿和下拉式選單。

建構項目

在本程式碼研究室中,您將部署 GRadio 應用程式,如下所示:

  • 使用關鍵字或詞組生成文字提示。也可以手動編輯產生的提示。
  • 在 UI 中根據產生的提示生成圖片。

課程內容

  • 如何透過程式輔助方式使用零樣本和少量樣本學習,透過程式輔助方式生成圖片專屬的提示,生成圖像。
  • 如何透過 API 和提示使用 Imagen 模型產生圖片。
  • 瞭解如何透過 Vertex AI Workbench 筆記本建構、部署及測試 GRadio 應用程式。

軟硬體需求

  • 可存取 GCP 專案,例如「Cloud-llm-preview4」
  • 具備建立 Vertex AI Workbench 的權限
  • 已啟用 Vertex AI API。
  • GRadio 的網路要求:筆記本執行個體存取公開網址

2. 開始設定

建立筆記本

  • 登入專案
  • 從左側導覽選單前往 Workbench
  • 在「使用者管理的筆記本」下方,使用預設選項建立新的筆記本。
  • 按一下「開啟 JUPYTERLAB」。設定完成後

注意事項:如果筆記本處於停止狀態,可能需要幾分鐘的時間才能啟動筆記本。

取得程式碼

我們已將程式碼檔案放在這裡。您可以在環境中匯入這個筆記本,並依原樣執行 (變更專案詳細資料除外)。

3. 執行程式碼

安裝/匯入必要的依附元件和程式庫

  • 安裝 GRadio 應用程式
  • 匯入 Vertex AI API,用於 Text-Bison 和圖像生成。
  • 匯入所有其他必要程式庫。

使用 Text-Bison 產生提示

使用含有關鍵字和/或詞組的使用者輸入內容,也就是以半形逗號分隔的關鍵字或詞組清單,以描述要生成所需圖片的句子。

例如「人物角色」、「主旨」、「背景」、「照明」和其他說明。

產生提示的函式如下所示:

defPrompt_generation(人物 a,signal,theme, light, Quality, extra_desc):

model = TextGenerationModel.from_pretrained("text-bison")

response_few_shot = model.predict(

    few_shot_prompt,

    **parameters

)

response_single_shot = model.predict(

    prompt,

    **parameters

)

少量樣本和零樣本提示

「零樣本提示」是一種文字生成技術,不會提供生成文字的背景資訊或範例,這可能相當困難,因為模型必須依賴自身的知識來產生連貫且資訊豐富的文字。

不過,零樣本提示也可以很有創意,因為模型不受任何既有範例的限制。

「少量樣本提示」是一種文字生成技術,其中會提供少量樣本來生成文字。這可能比零樣本提示更簡單,因為模型對於生成內容有一些指引。不過,少量樣本提示可能也會受到限制,因為模型只能產生與範例類似的文字。

以下是少量樣本和零樣本提示的程式碼範例。

**# 程式碼中出現少量樣本提示**

multi_shot_prompt = f""" 你是撰寫圖像生成模型提示的專家,使用提供的詞組和關鍵字串連起來,並加入逼真的細節,生成合理又有意義的提示,可用於生成圖片。

input: people, gardening, house garden, colorful plants, Real, HD image, Photo.

output: A Photo of people gardening in a house garden landscape with few coloured flowering plants. Realistic FULL HD Images, Elegant and natural facial and eye features taken by professional photographer

input: plumber, faucet, kitchen, high quality, natural lighting, Photo

output: A Photo of a plumber fixing a faucet in the kitchen. High quality image with natural indoor lighting.

input: house and garden, halloween, warm lighting, high quality image, Sketch

output: A Sketch of Beautiful House and Garden with Halloween Decorations. Warm lighting, High Quality, 4K photograph taken by professional photographer from front.

input: nice living room, warm lighting,Professional Photographer from far, Photo

output: A photo of a Well designed Living Room. Warm lighting, High Quality, 4K photograph taken by Professional Photographer from far

input: {params_list_str}

output:

"""

# 用於程式碼的零樣本提示

prompt = f"""你是撰寫圖像生成模型提示的專家,幫我寫一份圖片生成模型專用的有意義的提示清單,內含「{params_list_str}」字詞。請記得在提示中加入這些字詞,並確保提示具有有意義的意義。"""

使用 Imagen 產生圖片

採用使用者輸入提示和排除提示(選用),動態饋給則與模型相同 (imagegeneration@002)。

def image_generation_result(input, negative_prompt):

input_prompt = input

model = ImageGenerationModel.from_pretrained("imagegeneration@002")

response = model.generate_images(

    prompt=input_prompt,

    number_of_images=4, #kept to static value of 4

    negative_prompt=negative_prompt

)

內含以下程式碼,可根據使用者輸入提示和排除提示生成圖像。最後程式碼會使用 Text-bison 模型產生的提示。

from vertexai.preview.vision_models 匯入 ImageGenerationModel

def image_generation(input, negative_prompt):

input_prompt = input

model = ImageGenerationModel.from_pretrained("imagegeneration@002")

response = model.generate_images(

    prompt=input_prompt,

    number_of_images=4, #kept to static value of 4.. can be a max value of 8

    negative_prompt=negative_prompt

)

images = response.images

return images

user_prompt = "Prompt:小女子展示,在一堆樹木中出售未經裝飾的「新鮮聖誕樹」。冷燈、高畫質且清晰的影像,由專業攝影師從遠處拍攝。」

negative_prompt =「失真且無突發的臉孔」

generate_images_list = image_generation(user_prompt,negative_prompt)

#show 一張生成圖像

generated_images_list[0].show()

輸出內容 -

db04a6bfdd78693b.jpeg

4. 部署 GRadio 應用程式

GRadio 適用於前端,使用者可在使用者輸入關鍵字並生成結構化提示後,直接使用或進一步編輯這些提示,再輸入至 Imagen,根據輸入內容產生圖像。GRadio 是一種 Python 程式庫,可用來建立機器學習模型的使用者介面。就這個應用程式而言,Blocks 可用來為這個應用程式新增彈性和複雜的資料流程。Blocks 使用列和欄提供應用程式版面配置管理:

with gr.Blocks() 示範:

#Prompt Generation Part

with gr.Row():

    with gr.Column(scale=1):

        Persona = gr.Textbox(label="Persona", info = "Customer segment such as Plumber, Electrician etc.")

    with gr.Column(scale=1):

        Signals = gr.Textbox(label="Signals", info = "Main content of banner such as Faucet, Lamp etc.")

    with gr.Column(scale=1):

        Theme = gr.Textbox(label="Theme", info = "Context of the banner such as Halloween, Kitchen etc.")

with gr.Row():

    with gr.Column(scale=1):

        photo_modifiers = gr.Textbox(label="Photography Modifiers", info = "Photography specific modifiers and parameters such as Lighting(Dramatic/Natural/Warm/Cold), Camera Proximity etc.")

    with gr.Column(scale=1):

        quality_modifiers =  gr.Textbox(label="Image Quality Modifier", info = "Quality Modifiers like high-quality, beautiful, stylized. 4K, HDR, By a professional etc")

    with gr.Column(scale=1):

        other_desc =  gr.Textbox(label="Any Other Description", info = "Other Descriptions for Image such as Style (Painting/Photo/Sketch), Bakground/Foreground Context")

加入 gr.Row():

    btn = gr.Button("Submit")

加入 gr.Row():

    returned_prompts = gr.Textbox(label="Result Prompts", interactive = True)    

btn.click(fn=prompt_generation, input=[Persona, Signals,Theme, photos_modifiers, Quality_modifiers, other_desc], outputs = return_prompts)

為了處理使用者的輸入和輸出內容,GRadio 提供多種元件,例如圖片、影片、滑桿、下拉式選單、Textbox、Radio 等選項。有了這些元件,開發人員就能靈活控管使用者輸入資料的方式,並提供給 Test-Bison、Imagen 或任何其他機器學習模型。

這項專案的應用程式使用 Blocks 建立而成,因此可增加彈性和複雜性

資料流向應用程式在《Addition to Blocks》中,多個 GRadio 元件

,其中包括:

以下程式碼片段可用來根據輸入內容和排除提示生成圖片:

 #圖片產生部分

with gr.Row():

    with gr.Column(scale=1):

        image_prompt = gr.Textbox(label="Image Generation Prompt")

with gr.Accordion("Advanced options", open=False): #Let's hide the advanced options!

    with gr.Row():

        negative_prompt = gr.Textbox(label="Negative prompt", info = "Specify What not to Include in Image ex. Bad Quality Image")

with gr.Row():

    with gr.Column(scale=1):    

        img_btn = gr.Button("Generate Images")

with gr.Row():

    with gr.Column():

        output_image_1 = gr.Image(label = "Result Image 1", visible = False)

    with gr.Column():

        output_image_2 = gr.Image(label = "Result Image 2", visible = False)

with gr.Row():

    with gr.Column():

        output_image_3 = gr.Image(label = "Result Image 3", visible = False)

    with gr.Column():

        output_image_4 = gr.Image(label = "Result Image 4", visible = False)

returned_prompts.select(populate_image_prompt, inputs = [returned_prompts], outputs = image_prompt)

img_btn.click(fn=image_generation_completion, inputs=[image_prompt,negative_prompt], outputs = [output_image_1,output_image_2,output_image_3,output_image_4])       

如要執行並測試 GRadio 應用程式,只要輸入文字提示,然後按一下「產生」按鈕即可。Imagen 會依據提示生成圖片。你可以嘗試不同提示,瞭解 Imagen 可產生哪些類型的圖片。

以下是 GRadio 應用程式「生成提示」的螢幕截圖。

70331c9645b1e91b.png

以下是 GRadio 應用程式「生成圖像」的螢幕截圖。

a7261e8fafab7073.png

以下列舉幾個例子:

範例 1:

[左圖] 提示 (使用簡單的關鍵字做為提示):兩位朋友划船。

[右圖] 提示 (使用 Text-Bison 產生的提示):2 名年輕男性在船上釣魚的相片,四周環繞著深色樹林。男子身穿襯衫,站在船上。由專業攝影師拍攝的自然光線、高畫質 4K 相片。

c2f5fabd10baf42.jpeg abc9b8204a9fdf7f.jpeg

範例 2:

[左圖] 提示 (使用簡單的關鍵字做為提示):聖誕樹

[右圖] 提示 (使用 Text-Bison 產生的提示):在裝飾燈和家具的房間中,呈現聖誕樹。樹上裝飾著燈飾和裝飾品。牆壁位於窗戶附近,背景內有一面牆壁。由專業攝影師從遠處拍攝的,暖身、高畫質、高動態範圍相片。

f10cf9f52ffd92c7.jpeg cce36df7a439b309.jpeg

5. 清除

如要清理資源

  • 停止 gRadio 應用程式。
  • 停止/刪除 Workbench 筆記本。

6. 恭喜

恭喜!您已成功使用 Google Text-Bison API 和 Imagen API,部署 GRadio 應用程式以建立提示和圖片。