AI גנרטיבי – יצירת תמונות ממילות מפתח

1. מבוא

העדכון האחרון: 12 באוקטובר 2023

יצירת תמונות באמצעות Imagegen

‫Google Imagen הוא מודל שפה גדול (LLM) מתקדם של Google שיכול ליצור תמונות מציאותיות ויצירתיות מתיאורי טקסט. ‫Imagen ב-Vertex AI מאפשר למשתמשים ליצור מוצרי AI מהדור הבא שמממשים את הדמיון של המשתמשים ומפיקים נכסים ויזואליים באיכות גבוהה תוך שניות. בנוסף ליצירת תמונות מטקסט, הוא תומך גם בעריכת תמונות באמצעות הנחיות טקסט, בכתיבת כתוביות לתמונות, בשאלות ותשובות ויזואליות ובכוונון של מודל תמונות על סמך נושא וסגנון.

יצירת הנחיות

כדי ליצור תמונה באמצעות Imagen, צריך לספק תיאור טקסט של התמונה, שנקרא הנחיה, ועל פיו נוצרת התמונה. עם זאת, כדי ליצור תמונה ריאליסטית באיכות גבוהה, צריך מומחיות בכתיבת הנחיות. ההנחיה יכולה להיות גם תלויה בדומיין, אם רוצים ליצור תמונה שקשורה לדומיינים עסקיים ספציפיים כמו קמעונאות, ייצור וכו'. דרך קלה יותר לעיצוב הנחיה היא לתת למודל Text Bison קבוצה של מילות מפתח.

הגישה הכוללת היא כפי שמתואר בהמשך –

fbb3826592b2816d.png

ממשק משתמש של Gradio

Gradio היא ספריית Python בקוד פתוח שמאפשרת ליצור במהירות רכיבי ממשק משתמש קלים לשימוש וניתנים להתאמה אישית עבור מודל למידת מכונה, כל API או אפילו פונקציית Python שרירותית באמצעות כמה שורות קוד. אתם יכולים לשלב את ממשק המשתמש הגרפי של Gradio ישירות ב-Jupyter Notebook או לשתף אותו כקישור עם כל אחד. ‫Gradio תומך במגוון רחב של סוגי מדיה, כולל טקסט, תמונות, סרטונים ואודיו. הוא גם מספק מספר רכיבי ממשק משתמש מוכנים מראש, כמו שדות להזנת נתונים, לחצנים, מחוונים ותפריטים נפתחים.

מה תפַתחו

ב-codelab הזה תפרסו אפליקציית Gradio שתבצע את הפעולות הבאות:

  • יוצרים הנחיית טקסט באמצעות מילות מפתח או ביטויים. אפשר גם לערוך את ההנחיה שנוצרה באופן ידני.
  • ליצור תמונות מההנחיה שנוצרה בממשק המשתמש.

מה תלמדו

  • איך משתמשים בשיטות למידה ללא דוגמאות ועם מעט דוגמאות באמצעות מודל 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

  • כניסה לפרויקט
  • בתפריט הניווט הימני, עוברים אל סביבת עבודה.
  • בקטע USER-MANAGED NOTEBOOKS (מחברות שנוהלו על ידי המשתמש), יוצרים מחברת חדשה עם אפשרויות ברירת המחדל.
  • אחרי שהמופע יוקצה, לוחצים על OPEN JUPYTERLAB (פתיחת JupyterLab).

הערה: אם ה-notebook במצב עצירה, יכול להיות שיעברו כמה דקות עד שהוא יתחיל לפעול.

קבלת הקוד

הקובץ עם הקוד נמצא כאן. אפשר לייבא את המחברת הזו לסביבה שלכם ולהריץ אותה כמו שהיא (חוץ משינוי פרטי הפרויקט).

3. הרצת הקוד

התקנה/ייבוא של הספריות והתלות הנדרשות

  • התקנת אפליקציית Gradio
  • מייבאים את Vertex AI APIs עבור 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 used in the code

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 = "Prompt: A Young Woman Showcasing and selling an undecorated Fresh Christmas Tree from A bunch of trees. תאורה קרה, תמונה מפורטת באיכות גבוהה שצולמה מרחוק על ידי צלם מקצועי".

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()

פלט –

db04a6bfdd78693b.jpeg

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 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.

70331c9645b1e91b.png

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

a7261e8fafab7073.png

כמה דוגמאות -

דוגמה 1 –

[תמונה שמאלית] הנחיה (שימוש במילות מפתח פשוטות כהנחיות) : שני חברים שטות בסירה.

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

c2f5fabd10baf42.jpeg abc9b8204a9fdf7f.jpeg

דוגמה 2 –

[תמונה ימנית] הנחיה ((שימוש במילות מפתח פשוטות כהנחיות)) : עץ חג המולד

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

f10cf9f52ffd92c7.jpeg cce36df7a439b309.jpeg

5. ניקוי תלונות

כדי למחוק את משאבי הבדיקה,

  • עוצרים את אפליקציית gradio.
  • מפסיקים או מוחקים את ה-Notebook של Workbench.

6. מזל טוב

הצלחתם להטמיע אפליקציית Gradio ליצירת הנחיות ותמונות באמצעות Google Text-Bison API ו-Imagen API.