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

UI ของ Gradio
Gradio เป็นไลบรารี Python แบบโอเพนซอร์สที่ช่วยให้คุณสร้างคอมโพเนนต์ UI ที่ใช้งานง่าย ปรับแต่งได้สำหรับโมเดลแมชชีนเลิร์นนิง, API หรือแม้แต่ฟังก์ชัน Python ที่กำหนดเองได้อย่างรวดเร็วโดยใช้โค้ดเพียงไม่กี่บรรทัด คุณสามารถผสานรวม GUI ของ Gradio เข้ากับ Jupyter Notebook โดยตรงหรือแชร์เป็นลิงก์กับใครก็ได้ Gradio รองรับสื่อหลากหลายประเภท ซึ่งรวมถึงข้อความ รูปภาพ วิดีโอ และเสียง นอกจากนี้ ยังมีคอมโพเนนต์ UI ที่สร้างไว้ล่วงหน้าหลายรายการ เช่น ช่องป้อนข้อมูล ปุ่ม แถบเลื่อน และเมนูแบบเลื่อนลง
สิ่งที่คุณจะสร้าง
ใน Codelab นี้ คุณจะได้ทำให้ใช้งานได้แอป Gradio ซึ่งจะทำสิ่งต่อไปนี้
- สร้างพรอมต์ข้อความโดยใช้คีย์เวิร์ดหรือวลี คุณยังแก้ไขพรอมต์ที่สร้างขึ้นด้วยตนเองได้ด้วย
- สร้างรูปภาพจากพรอมต์ที่สร้างขึ้นใน UI
สิ่งที่คุณจะได้เรียนรู้
- วิธีใช้การเรียนรู้แบบ Zero-Shot และ Few-Shot กับโมเดล Text-Bison โดยใช้โปรแกรมเพื่อสร้างพรอมต์เฉพาะของ Imagen สำหรับการสร้างรูปภาพ
- วิธีสร้างรูปภาพโดยใช้โมเดล Imagen ผ่าน API และพรอมต์
- วิธีสร้าง ทดสอบ และติดตั้งใช้งานแอปพลิเคชัน Gradio จาก Notebook ของ Vertex AI Workbench
สิ่งที่คุณต้องมี
- สิทธิ์เข้าถึงโปรเจ็กต์ GCP เช่น "Cloud-llm-preview4"
- สิทธิ์เข้าถึงเพื่อสร้าง Vertex AI Workbench
- เปิดใช้ Vertex AI API แล้ว
- ข้อกำหนดด้านเครือข่ายสำหรับ Gradio: URL สาธารณะสำหรับการเข้าถึงอินสแตนซ์ Notebook
2. การเริ่มตั้งค่า
สร้าง Notebook
- เข้าสู่ระบบโปรเจ็กต์
- ไปที่เวิร์กเบนช์จากเมนูการนำทางด้านซ้าย
- ในส่วน "NOTEBOOK ที่ผู้ใช้จัดการ" ให้สร้าง Notebook ใหม่ด้วยตัวเลือกเริ่มต้น
- คลิก "เปิด JUPYTERLAB" เมื่อจัดสรรอินสแตนซ์แล้ว
หมายเหตุ: หากสมุดบันทึกอยู่ในสถานะหยุดทำงาน ระบบอาจใช้เวลา 2-3 นาทีในการเริ่มสมุดบันทึก
รับรหัส
เราได้วางไฟล์โค้ดไว้ที่นี่ คุณสามารถนำเข้า Notebook นี้ในสภาพแวดล้อมและเรียกใช้ได้ตามที่เห็น (ยกเว้นการเปลี่ยนรายละเอียดโปรเจ็กต์)
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
)
พรอมต์แบบ Few-Shot และ Zero-Shot
การใช้พรอมต์แบบ Zero-Shot เป็นเทคนิคการสร้างข้อความที่โมเดลไม่ได้รับบริบทหรือตัวอย่างใดๆ เพื่อสร้างข้อความ ซึ่งอาจเป็นเรื่องท้าทายเนื่องจากโมเดลต้องอาศัยความรู้ของตัวเองในการสร้างข้อความที่สอดคล้องและให้ข้อมูล
อย่างไรก็ตาม การแจ้งแบบศูนย์ช็อตก็มีความสร้างสรรค์มากเช่นกัน เนื่องจากโมเดลไม่ได้ถูกจำกัดด้วยตัวอย่างที่มีอยู่ก่อนแล้ว
Few-Shot Prompting คือเทคนิคการสร้างข้อความที่โมเดลได้รับตัวอย่างจำนวนเล็กน้อยเพื่อสร้างข้อความ วิธีนี้อาจง่ายกว่าการแจ้งแบบศูนย์ช็อต เนื่องจากโมเดลมีคำแนะนำบางอย่างเกี่ยวกับสิ่งที่ต้องสร้าง อย่างไรก็ตาม Few-Shot Prompting ก็อาจมีข้อจำกัดเช่นกัน เนื่องจากโมเดลอาจสร้างได้เฉพาะข้อความที่คล้ายกับตัวอย่างที่ได้รับ
ด้านล่างนี้คือโค้ดตัวอย่างสำหรับพรอมต์แบบ Few-Shot และ Zero-Shot
**# Few-Shot Prompt ที่ใช้ในโค้ด**
few_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 ที่ใช้ในโค้ด
พรอมต์ = 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
)
ระบบจะรวมโค้ดต่อไปนี้ไว้เพื่อสร้างรูปภาพจากข้อมูลจากผู้ใช้และพรอมต์เชิงลบ โค้ดสุดท้ายใช้พรอมต์ที่สร้างโดยโมเดล Text-Bison
from vertexai.preview.vision_models import 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 = "พรอมต์: หญิงสาวกำลังแสดงและขายต้นคริสต์มาสสดที่ยังไม่ได้ตกแต่งจาก A bunch of trees แสงเย็น รูปภาพคุณภาพสูงและมีรายละเอียดซึ่งถ่ายโดยช่างภาพมืออาชีพจากระยะไกล"
negative_prompt = "ใบหน้าที่บิดเบี้ยวและไม่น่าดึงดูด"
generated_images_list = image_generation(user_prompt,negative_prompt)
#แสดงรูปภาพที่สร้างขึ้น 1 รูป
generated_images_list[0].show()
เอาต์พุต -

4. ทำให้แอป Gradio ใช้งานได้
Gradio ใช้สำหรับฟรอนท์เอนด์ซึ่งผู้ใช้สามารถป้อนคีย์เวิร์ดและสร้างพรอมต์ที่มีโครงสร้างได้ และสามารถใช้พรอมต์เหล่านี้ได้โดยตรงหรือผู้ใช้จะแก้ไขเพิ่มเติมแล้วป้อนลงใน Imagen เพื่อสร้างรูปภาพตามอินพุตก็ได้ Gradio เป็นไลบรารี Python ที่ใช้สร้างอินเทอร์เฟซผู้ใช้สำหรับโมเดลแมชชีนเลิร์นนิงได้ สำหรับแอปพลิเคชันนี้ ระบบจะใช้บล็อกเพื่อเพิ่มความยืดหยุ่นและโฟลว์ข้อมูลที่ซับซ้อนให้กับแอปพลิเคชันนี้ บล็อกช่วยให้จัดการเลย์เอาต์ของแอปพลิเคชันได้โดยใช้แถวและคอลัมน์
with gr.Blocks() as demo:
#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")
with gr.Row():
btn = gr.Button("Submit")
with gr.Row():
returned_prompts = gr.Textbox(label="Result Prompts", interactive = True)
btn.click(fn=prompt_generation, inputs=[Persona, Signals,Theme, photo_modifiers, quality_modifiers, other_desc], outputs = returned_prompts)
Gradio มีคอมโพเนนต์หลายอย่าง เช่น รูปภาพ วิดีโอ แถบเลื่อน เมนูแบบเลื่อนลง กล่องข้อความ ตัวเลือกแบบปุ่มตัวเลือก และตัวเลือกอื่นๆ เพื่อจัดการอินพุตและเอาต์พุตของผู้ใช้ คอมโพเนนต์เหล่านี้ช่วยให้นักพัฒนาแอปมีความยืดหยุ่นและควบคุมวิธีรับอินพุตจากผู้ใช้และป้อนไปยัง Test-bison, Imagen หรือโมเดล ML อื่นๆ ได้
สำหรับโปรเจ็กต์นี้ แอปพลิเคชันสร้างขึ้นโดยใช้ Blocks เพื่อเพิ่มความยืดหยุ่นและความซับซ้อน
ข้อมูลจะไหลไปยังแอปพลิเคชัน นอกจากบล็อกแล้ว ยังมีคอมโพเนนต์ Gradio หลายรายการ
ใช้ซึ่งรวมถึง
- แถว คอลัมน์สำหรับเลย์เอาต์ที่เหมาะสม
- ปุ่ม กล่องข้อความ เมนูแบบเลื่อนลง และแถบเลื่อนเพื่อให้ได้ฟังก์ชันการทำงานที่ต้องการและใช้งานง่าย
- คอมโพเนนต์รูปภาพเพื่อแสดงผลลัพธ์
- ตัวช่วยอื่นๆ เช่น EventData, update เพื่อรองรับการเปลี่ยนแปลงแบบไดนามิกใน UI
ด้านล่างนี้คือข้อมูลโค้ดที่ใช้สร้างรูปภาพจากอินพุตและพรอมต์เชิงลบ
#ส่วนการสร้างรูปภาพ
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 มีดังนี้

ภาพหน้าจอการสร้างรูปภาพในแอป Gradio มีดังนี้

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

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

5. การจัดระเบียบ
หากต้องการล้างข้อมูลทรัพยากร ให้ทำดังนี้
- หยุดแอป Gradio
- หยุด/ลบ Notebook ของ Workbench
6. ขอแสดงความยินดี
ขอแสดงความยินดี คุณได้ติดตั้งใช้งานแอปพลิเคชัน Gradio เพื่อสร้างพรอมต์และรูปภาพด้วย Google Text-Bison API และ Imagen API เรียบร้อยแล้ว