1. מבוא
העדכון האחרון: 12 באוקטובר 2023
יצירת תמונות באמצעות Imagegen
Google Imagen הוא מודל שפה גדול (LLM) של Google, שיכול ליצור תמונות מציאותיות ויצירתיות מתיאורי טקסט. Imagen ב-Vertex AI מאפשר למשתמשים ליצור מוצרי AI מהדור הבא, שהופכים את הדמיון של המשתמשים לנכסים חזותיים באיכות גבוהה תוך שניות. בנוסף ליצירת תמונות מטקסט, הוא תומך גם בעריכת תמונות באמצעות הנחיות טקסט, בכתיבת כתוביות לתמונות, בשאלות ותשובות ויזואליות ובכוונון של מודל תמונות על סמך נושא וסגנון.
יצירת פרומפטים
כדי ליצור תמונה באמצעות Imagen, צריך לספק תיאור טקסטואלי של התמונה, שנקרא הנחיה, ועל פיו נוצרת התמונה. עם זאת, כדי ליצור תמונה ריאליסטית באיכות גבוהה, צריך מומחיות בכתיבת הנחיות. ההנחיה יכולה להיות גם תלויה בדומיין, אם רוצים ליצור תמונה שקשורה לדומיינים עסקיים ספציפיים כמו קמעונאות, ייצור וכו'. דרך קלה יותר לעיצוב הנחיה היא לתת למודל Text Bison קבוצה של מילות מפתח.
הגישה הכוללת היא כפי שמתואר בהמשך –
ממשק משתמש של Gradio
Gradio היא ספריית Python בקוד פתוח שמאפשרת ליצור במהירות רכיבי ממשק משתמש קלים לשימוש וניתנים להתאמה אישית עבור מודל למידת מכונה, כל API או אפילו פונקציית Python שרירותית באמצעות כמה שורות קוד. אתם יכולים לשלב את הממשק הגרפי של Gradio ישירות בנוטבוק Jupyter או לשתף אותו כקישור עם כל אחד. Gradio תומך במגוון רחב של סוגי מדיה, כולל טקסט, תמונות, סרטונים ואודיו. הוא גם מספק מספר רכיבי ממשק משתמש מוכנים מראש, כמו שדות קלט, לחצנים, מחוונים ותפריטים נפתחים.
מה תפַתחו
ב-codelab הזה תפרסו אפליקציית Gradio שתבצע את הפעולות הבאות:
- יוצרים פרומפט טקסטואלי באמצעות מילות מפתח או ביטויים. אפשר גם לערוך את הפרומפט שנוצר באופן ידני.
- ליצור תמונות מהפרומפט שנוצר בממשק המשתמש.
מה תלמדו
- איך משתמשים בשיטות למידה ללא דוגמאות ולמידה עם מעט דוגמאות בעזרת מודל text-bison באופן פרוגרמטי כדי ליצור הנחיות ספציפיות ל-Imagen ליצירת תמונות.
- איך יוצרים תמונות באמצעות מודל Imagen דרך API ופרומפט.
- איך ליצור, לפרוס ולבדוק אפליקציית Gradio מתוך notebook של Vertex AI Workbench.
מה תצטרכו
- גישה לפרויקט GCP, לדוגמה – Cloud-llm-preview4
- גישה ליצירת Vertex AI Workbench
- ה-API של Vertex AI מופעל.
- דרישות רשת ל-Gradio: כתובת URL ציבורית לגישה למופע Notebook
2. תהליך ההגדרה
יצירת הנוטבוק
- כניסה לפרויקט
- בתפריט הניווט הימני, עוברים אל סביבת עבודה.
- בקטע USER-MANAGED NOTEBOOKS (מחברות שנוהלו על ידי המשתמש), יוצרים מחברת חדשה עם אפשרויות ברירת המחדל.
- אחרי שהמופע יוקצה, לוחצים על OPEN JUPYTERLAB (פתיחת JupyterLab).
הערה: אם המחברת במצב מושהה, יכול להיות שיעברו כמה דקות עד שהיא תתחיל לפעול.
קבלת הקוד
קובץ הקוד נמצא כאן. אפשר לייבא את המחברת הזו לסביבה שלכם ולהריץ אותה כמו שהיא (למעט שינוי פרטי הפרויקט).
3. הרצת הקוד
התקנה/ייבוא של פריטים בקשרי תלות וספריות
- התקנת אפליקציית 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 prompting) היא טכניקה ליצירת טקסט שבה המודל לא מקבל הקשר או דוגמאות ליצירת טקסט. זה יכול להיות מאתגר, כי המודל צריך להסתמך על הידע שלו כדי ליצור טקסט עקבי ואינפורמטיבי.
עם זאת, פרומפטים בלי דוגמאות (zero-shot prompting) יכולים להיות גם מאוד יצירתיים, כי המודל לא מוגבל על ידי דוגמאות קיימות.
פרומפטים עם כמה דוגמאות (few-shot prompting) היא טכניקה ליצירת טקסט שבה המודל מקבל מספר קטן של דוגמאות ליצירת טקסט. יכול להיות שיהיה לכם קל יותר להשתמש בשיטה הזו מאשר בשיטת פרומפטים בלי דוגמאות (zero-shot prompting), כי המודל מקבל הנחיות לגבי מה ליצור. עם זאת, פרומפטים עם כמה דוגמאות (few-shot prompting) יכולים גם להגביל את המודל, כי יכול להיות שהוא יוכל ליצור רק טקסט שדומה לדוגמאות שקיבל.
בהמשך מופיע קוד לדוגמה להנחיות Few-Shot ו-Zero-shot.
**# Few Shot Prompt used in the code**
few_shot_prompt = f"""You are an expert in writing prompts for Image Generation Models. בעזרת הביטויים ומילות המפתח שסופקו, צריך לשרשר אותם ולהוסיף פרטים מציאותיים כדי ליצור הנחיה הגיונית ומשמעותית שאפשר להשתמש בה ליצירת תמונה.
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"""You are an expert in writing prompts for Image Generation Models. עזרה בכתיבת רשימה של פרומפטים משמעותיים למודל ליצירת תמונות, כולל המילים: "{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 = "הנחיה: אישה צעירה מציגה ומוכרת עץ חג מולד טרי לא מקושט מתוך קבוצת עצים. תאורה קרה, תמונה מפורטת באיכות גבוהה שצולמה מרחוק על ידי צלם מקצועי".
negative_prompt = "Distorted and unattractive faces"
generated_images_list = image_generation(user_prompt,negative_prompt)
#show one of the generated image
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 מספקת רכיבים רבים כמו Image, Video, Slider, Dropdown, Textbox, Radio ואפשרויות אחרות. המרכיבים האלה מאפשרים למפתחים גמישות ושליטה באופן קבלת הקלט מהמשתמשים והעברתו אל Test-bison, imagen או כל מודל ML אחר.
בפרויקט הזה, האפליקציה נוצרה באמצעות Blocks כדי להוסיף גמישות ופונקציות מורכבות
הנתונים זורמים לאפליקציה. בנוסף לבלוקים, יש כמה רכיבי Gradio
השימוש כולל:
- שורות, עמודות כדי ליצור פריסות תקינות.
- לחצן, תיבת טקסט, תפריט נפתח ופס הזזה כדי להשיג את הפונקציונליות הנדרשת ונוחות השימוש
- רכיב Image להצגת התוצאות.
- עוד רכיבי עזר כמו EventData ו-update תומכים בשינויים דינמיים בממשק המשתמש.
בהמשך מופיע קטע קוד שמשמש ליצירת תמונות מקלט ומפרומפט שלילי:
#Image Generation part
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, פשוט מקלידים פרומפט טקסטואלי ולוחצים על הלחצן Generate (יצירה). Imagen ייצור תמונה על סמך ההנחיה שלכם. אתם יכולים לנסות הנחיות שונות כדי לראות אילו סוגים של תמונות Imagen יכול ליצור.
למטה מופיע צילום מסך של יצירת פרומפט באפליקציית Gradio.

למטה מוצג צילום מסך של יצירת תמונות באפליקציית Gradio.

כמה דוגמאות -
דוגמה 1 –
[תמונה שמאלית] הנחיה (שימוש במילות מפתח פשוטות כהנחיות) : שני חברים שטים בסירה.
[תמונה מימין] הנחיה (שימוש בהנחיות שנוצרו על ידי Text-Bison) : תמונה של שני גברים צעירים דגים בסירה שממוקמת באגם מוקף עצים כהים ביער. גברים לובשים חולצות ועומדים על סירה. תאורה טבעית, איכות גבוהה, תמונה באיכות 4K שצולמה על ידי צלם מקצועי.

דוגמה 2 –
[תמונה שמאלית] הנחיה ((שימוש במילות מפתח פשוטות כהנחיות)) : עץ חג המולד
[תמונה מימין] הנחיה (שימוש בהנחיות שנוצרו על ידי Text-Bison) : עץ חג המולד בחדר עם מנורה ורהיטים. העץ מקושט באורות ובתכשיטים. הוא ממוקם ליד חלון, וברקע נראה קיר. תאורה חמה, איכות גבוהה, תמונת HDR שצולמה על ידי צלם מקצועי מרחוק.

5. ניקוי תלונות
כדי למחוק את משאבי הבדיקה,
- מפסיקים את אפליקציית gradio.
- מפסיקים או מוחקים את מחברת Workbench.
6. מזל טוב
הצלחתם לפרוס אפליקציית Gradio ליצירת פרומפטים ותמונות באמצעות Google Text-Bison API ו-Imagen API.