GenAI - การสร้างรูปภาพสำหรับคีย์เวิร์ด

1. บทนำ

อัปเดตล่าสุด 12-10-2023

การสร้างรูปภาพ

Google Imagen คือโมเดลภาษาขนาดใหญ่ของ Google ที่มีประสิทธิภาพซึ่งสามารถสร้างรูปภาพที่สมจริงและสร้างสรรค์จากข้อความอธิบาย Imagen ใน Vertex AI ช่วยให้ผู้ใช้สร้างผลิตภัณฑ์ AI รุ่นถัดไปที่จะเปลี่ยนจินตนาการของผู้ใช้ให้เป็นเนื้อหาภาพคุณภาพสูงได้ในไม่กี่วินาที นอกเหนือจากการสร้างรูปภาพจากข้อความแล้ว แอปยังรองรับการแก้ไขรูปภาพผ่านพรอมต์ข้อความ คำบรรยายภาพ การถามและตอบด้วยภาพ และ "เรื่องและ" การปรับแต่งโมเดลรูปภาพตามสไตล์

การสร้างพรอมต์

หากต้องการสร้างรูปภาพโดยใช้ Imagen คุณต้องระบุข้อความอธิบายของรูปภาพที่เรียกว่าพรอมต์ ซึ่งใช้สร้างรูปภาพดังกล่าว อย่างไรก็ตาม การสร้างรูปภาพคุณภาพสูงที่เหมือนจริงนั้นต้องอาศัยความเชี่ยวชาญ นอกจากนี้ยังอาจขึ้นอยู่กับโดเมนหากคุณต้องการสร้างรูปภาพที่เกี่ยวข้องกับโดเมนธุรกิจที่เฉพาะเจาะจง เช่น การค้าปลีก การผลิต ฯลฯ วิธีที่ง่ายขึ้นในการออกแบบพรอมต์ก็คือการให้ชุดคีย์เวิร์ดแก่โมเดล Text Bison

แนวทางโดยรวมมีดังนี้

fbb3826592b2816d.png

UI ของ GRadio

Gradio เป็นไลบรารี Python แบบโอเพนซอร์สที่ให้คุณสร้างคอมโพเนนต์ UI ที่ใช้งานง่ายและปรับแต่งได้สำหรับโมเดลแมชชีนเลิร์นนิง, API หรือแม้แต่ฟังก์ชัน Python ที่กำหนดเองได้อย่างรวดเร็วโดยใช้โค้ดเพียงไม่กี่บรรทัด คุณผสานรวม GUI ของ Gradio ลงในสมุดบันทึก Jupyter โดยตรงหรือแชร์เป็นลิงก์กับทุกคนก็ได้ GRadio รองรับสื่อหลากหลายประเภท เช่น ข้อความ รูปภาพ วิดีโอ และเสียง นอกจากนี้ยังมีคอมโพเนนต์ UI ที่สร้างไว้ล่วงหน้าหลายรายการ เช่น ช่องป้อนข้อมูล ปุ่ม แถบเลื่อน และเมนูแบบเลื่อนลง

สิ่งที่คุณจะสร้าง

ใน Codelab นี้ คุณจะทำให้แอป GRadio ใช้งานได้ ซึ่งจะ:

  • สร้างพรอมต์ข้อความโดยใช้คีย์เวิร์ดหรือวลี คุณแก้ไขพรอมต์ที่สร้างขึ้นด้วยตนเองได้ด้วย
  • สร้างรูปภาพจากพรอมต์ที่สร้างขึ้นบน UI

สิ่งที่คุณจะได้เรียนรู้

  • วิธีใช้การเรียนรู้แบบ Zero-shot และ com-shot กับโมเดลข้อความควายไบซันเพื่อสร้างพรอมต์แบบภาพที่เฉพาะเจาะจงสำหรับการสร้างรูปภาพ
  • วิธีสร้างรูปภาพโดยใช้โมเดล Imagen ผ่าน API และ Prompt
  • วิธีสร้าง ติดตั้งใช้งาน และทดสอบแอปพลิเคชัน GRadio จากสมุดบันทึกการทำงาน Vertex AI

สิ่งที่คุณต้องมี

  • เช่น สิทธิ์เข้าถึงโปรเจ็กต์ GCP - "Cloud-llm-preview4"
  • สิทธิ์เข้าถึงเพื่อสร้าง Vertex AI Workbench
  • เปิดใช้ Vertex AI API แล้ว
  • ข้อกำหนดเกี่ยวกับเครือข่ายสำหรับ GRadio: URL สาธารณะสำหรับการเข้าถึงอินสแตนซ์สมุดบันทึก

2. การตั้งค่า

สร้างสมุดบันทึก

  • เข้าสู่ระบบโปรเจ็กต์
  • ไปที่ workbench จากเมนูการนำทางด้านซ้าย
  • ในส่วน "สมุดบันทึกที่จัดการโดยผู้ใช้" ให้สร้างสมุดบันทึกใหม่ที่มีตัวเลือกเริ่มต้น
  • คลิก "เปิด JUPYTERLAB" เมื่อจัดสรรอินสแตนซ์แล้ว

หมายเหตุ: อาจใช้เวลาสักครู่ในการเริ่มสมุดบันทึก หากสมุดบันทึกอยู่ในสถานะหยุดทำงาน

รับโค้ด

โดยเราได้วางไฟล์โค้ดไว้ที่นี่ คุณสามารถนำเข้าสมุดบันทึกนี้ในสภาพแวดล้อมของคุณและทำงานตามที่เป็นอยู่ได้ (ยกเว้นสำหรับการเปลี่ยนแปลงรายละเอียดโปรเจ็กต์)

3. เรียกใช้โค้ด

ติดตั้ง/นำเข้าทรัพยากร Dependency และไลบรารีที่จำเป็น

  • ติดตั้งแอป Gradio
  • นำเข้า Vertex AI API สำหรับ Text-Bison และการสร้างรูปภาพ
  • นำเข้าไลบรารีอื่นๆ ทั้งหมดที่จำเป็น

การสร้างพรอมต์โดยใช้ Text-Bison

ใช้อินพุตของผู้ใช้ที่มีคีย์เวิร์ดและ/หรือวลี เช่น รายการคีย์เวิร์ดหรือวลีที่คั่นด้วยคอมมา ซึ่งสามารถใช้เพื่อสร้างประโยคที่อธิบายรูปภาพที่จำเป็นต่อการสร้าง

เช่น ลักษณะตัวตน เรื่อง พื้นหลัง การจัดแสง และคำอธิบายอื่นๆ

ฟังก์ชันที่สร้างข้อความแจ้งมีดังนี้

def prompt_generation(persona,signal,theme, lighting, 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

)

ข้อความแจ้งการช็อตน้อยและเซโรช็อต

พรอมต์แบบ Zero-shot เป็นเทคนิคการสร้างข้อความที่โมเดลไม่ได้รับบริบทหรือตัวอย่างสำหรับสร้างข้อความ เรื่องนี้อาจเป็นเรื่องท้าทาย เนื่องจากโมเดลต้องอาศัยความรู้ของตนเองในการสร้างข้อความที่สอดคล้องและให้ข้อมูล

อย่างไรก็ตาม พรอมต์ Zero-shot อาจเป็นความคิดสร้างสรรค์ได้มาก เนื่องจากโมเดลไม่ได้ถูกจำกัดโดยตัวอย่างที่มีอยู่แล้ว

การแจ้งข้อมูลน้อยเป็นเทคนิคการสร้างข้อความที่โมเดลได้รับตัวอย่างจำนวนน้อยสำหรับใช้สร้างข้อความ ซึ่งอาจง่ายกว่าข้อความแจ้งแบบ Zero Shot เนื่องจากโมเดลมีคำแนะนำเกี่ยวกับสิ่งที่จะสร้าง อย่างไรก็ตาม การแสดงข้อความแจ้ง 2-3 ช็อตก็อาจจํากัดได้เช่นกัน เนื่องจากโมเดลอาจสร้างได้เฉพาะข้อความที่คล้ายกับตัวอย่างที่ให้ไว้เท่านั้น

ด้านล่างนี้คือโค้ดตัวอย่างสำหรับพรอมต์ "ช็อตน้อย" และ "เซโรช็อต"

Ⰳ**# ใช้ Shot Prompt ในโค้ดบางรายการ**

some_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:

"""

มีการใช้ Zero Shot Prompt ในโค้ด

prompt = f"""คุณเป็นผู้เชี่ยวชาญในการเขียนพรอมต์สำหรับโมเดลการสร้างรูปภาพ ช่วยฉันเขียนรายการพรอมต์ที่มีความหมายสำหรับโมเดลการสร้างรูปภาพ โดยเฉพาะคำว่า "{params_list_str}" อย่าลืมใส่คำเหล่านี้ในพรอมต์และทำให้พรอมต์มีความหมาย"""

การสร้างรูปภาพโดยใช้ Imagen

ใช้พรอมต์อินพุตของผู้ใช้และพรอมต์เชิงลบ(ไม่บังคับ) และฟีดเดียวกันกับโมเดล (imagegeneration@002)

🰃def image_generation_completion(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

)

โค้ดต่อไปนี้จะรวมอยู่ในการสร้างรูปภาพจากพรอมต์การป้อนข้อมูลของผู้ใช้และพรอมต์เชิงลบ โค้ดเวอร์ชันสุดท้ายใช้ข้อความแจ้งที่สร้างขึ้นโดยรูปแบบควายไบซัน

🰃จาก 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 = "พรอมต์: หญิงสาวกำลังแสดงและขายต้นคริสต์มาสสดที่ไม่ได้ตกแต่งจากต้นไม้จำนวนมาก แสงเย็น ภาพคุณภาพสูงและมีรายละเอียดถ่ายภาพโดยช่างภาพมืออาชีพจากไกล"

negative_prompt = "ใบหน้าบิดเบี้ยวและไม่น่าสนใจ"

create_images_list = image_generation(user_prompt,negative_prompt)

#แสดงหนึ่งในรูปภาพที่สร้างขึ้น

generated_images_list[0].show()

เอาต์พุต -

db04a6bfdd78693b.jpeg

4. ทำให้แอป GRadio ใช้งานได้

GRadio ใช้สำหรับฟรอนท์เอนด์ที่ผู้ใช้สามารถป้อนคีย์เวิร์ดและสร้างพรอมต์แบบมีโครงสร้างได้ โดยผู้ใช้จะใช้พรอมต์เหล่านี้โดยตรงหรือแก้ไขเพิ่มเติมโดยผู้ใช้แล้วป้อนเข้า Imagen เพื่อสร้างรูปภาพตามอินพุตก็ได้ GRadio เป็นไลบรารี Python ที่ใช้สร้างอินเทอร์เฟซผู้ใช้สำหรับโมเดลแมชชีนเลิร์นนิงได้ สำหรับแอปพลิเคชันนี้ ระบบจะใช้การบล็อกเพื่อเพิ่มความยืดหยุ่นและการรับส่งข้อมูลที่ซับซ้อนให้กับแอปพลิเคชันนี้ Blocks ให้บริการการจัดการเลย์เอาต์ของแอปพลิเคชันโดยใช้ "แถว" และ "คอลัมน์" ดังนี้

Ⰳพร้อม 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, references=[Persona, Signals,Theme, photo_modifiers, quality_modifiers, other_desc], outs = sent_prompts)

ในการจัดการอินพุตและเอาต์พุตของผู้ใช้ GRadio จัดเตรียมองค์ประกอบต่างๆ มากมาย เช่น รูปภาพ วิดีโอ แถบเลื่อน เมนูแบบเลื่อนลง กล่องข้อความ วิทยุ และตัวเลือกอื่นๆ คอมโพเนนต์เหล่านี้ช่วยให้นักพัฒนาแอปมีความยืดหยุ่นและการควบคุมเกี่ยวกับวิธียอมรับอินพุตจากผู้ใช้ และป้อนข้อมูลดังกล่าวลงใน Test-bison, อิมเมจ หรือโมเดล ML อื่นๆ

สำหรับโปรเจ็กต์นี้ แอปพลิเคชันจะสร้างขึ้นโดยใช้การบล็อกเพื่อเพิ่มความยืดหยุ่นและความซับซ้อน

ส่งข้อมูลไปยังแอปพลิเคชัน นอกเหนือจากบล็อกแล้ว คอมโพเนนต์ 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 -

[ภาพซ้าย] พรอมต์ (ใช้คีย์เวิร์ดง่ายๆ เป็นพรอมต์) : เพื่อน 2 คนกำลังแล่นเรือ

[ภาพขวา] พรอมต์ (ใช้พรอมต์ที่สร้างโดย Text-Bison) : รูปภาพชายหนุ่ม 2 คนกำลังตกปลาบนเรือที่รายล้อมด้วยต้นไม้สีเข้มในป่า ผู้ชายใส่เสื้อและยืนบนเรือ แสงธรรมชาติคุณภาพสูง 4K ถ่ายภาพโดยช่างภาพมืออาชีพ

c2f5fabd10baf42.jpeg abc9b8204a9fdf7f.jpeg

ตัวอย่างที่ 2 -

[ภาพด้านซ้าย] ข้อความแจ้ง ((การใช้คีย์เวิร์ดง่ายๆ เป็นพรอมต์)) : ต้นคริสต์มาส

[รูปภาพด้านขวา] พรอมต์ (ใช้พรอมต์ที่สร้างโดย Text-Bison) : ต้นคริสต์มาสในห้องที่มีโคมไฟและเฟอร์นิเจอร์ ต้นไม้ตกแต่งด้วยแสงไฟและเครื่องประดับ โดยจะวางอยู่ใกล้หน้าต่างและมองเห็นผนังเป็นฉากหลัง แสงอบอุ่น คุณภาพสูง รูปภาพ HDR ถ่ายภาพโดยช่างภาพมืออาชีพที่ถ่ายจากระยะไกล

f10cf9f52ffd92c7.jpeg cce36df7a439b309.jpeg

5. การจัดระเบียบ

หากต้องการล้างทรัพยากร

  • หยุดแอป gRadio
  • หยุด/ลบสมุดบันทึก Workbench

6. ขอแสดงความยินดี

ขอแสดงความยินดี คุณได้ทำให้แอปพลิเคชัน GRadio ใช้งานได้สำหรับสร้างพรอมต์และรูปภาพด้วย Google Text-Bison API และ Imagen API เรียบร้อยแล้ว