GenAI - تولید تصویر از کلمات کلیدی

1. معرفی

آخرین به روز رسانی: 2023-10-12

Imagegen Image Generation

Google Imagen یک مدل قدرتمند زبان بزرگ گوگل است که می تواند تصاویر واقعی و خلاقانه را از توضیحات متن ایجاد کند. Imagen on Vertex AI به کاربران این امکان را می دهد که نسل بعدی محصولات هوش مصنوعی بسازند که تخیل کاربر خود را در چند ثانیه به دارایی های بصری با کیفیت بالا تبدیل کند. علاوه بر ایجاد تصویر از متن، از ویرایش تصویر از طریق اعلان های متن، شرح تصویر، پرسش و پاسخ بصری و تنظیم مدل تصویر بر اساس موضوع و سبک نیز پشتیبانی می کند.

Prompt Generation

برای ایجاد یک تصویر با استفاده از Imagen، باید یک توضیح متنی از تصویر به نام اعلان ارائه دهید که با استفاده از آن یک تصویر تولید می شود. با این حال، برای ایجاد یک تصویر واقعی با کیفیت بالا، تخصص لازم است. همچنین اگر می‌خواهید تصویری مرتبط با حوزه‌های تجاری خاص مانند خرده‌فروشی، تولید و غیره ایجاد کنید، می‌تواند وابسته به دامنه باشد. یک رویکرد ساده‌تر برای طراحی یک درخواست، دادن مجموعه‌ای از کلمات کلیدی به مدل Text Bison است.

رویکرد کلی به صورت زیر است -

fbb3826592b2816d.png

رابط کاربری Gradio

Gradio یک کتابخانه Python منبع باز است که به شما امکان می دهد به سرعت اجزای رابط کاربری آسان و قابل تنظیم برای مدل یادگیری ماشین خود، هر API یا حتی یک تابع دلخواه پایتون را با استفاده از چند خط کد ایجاد کنید. می‌توانید رابط گرافیکی Gradio را مستقیماً در نوت‌بوک Jupyter خود ادغام کنید یا آن را به‌عنوان یک پیوند با هر کسی به اشتراک بگذارید. Gradio از طیف گسترده ای از انواع رسانه ها، از جمله متن، تصویر، ویدئو و صدا پشتیبانی می کند. همچنین تعدادی از اجزای رابط کاربری از پیش ساخته شده، مانند فیلدهای ورودی، دکمه‌ها، لغزنده‌ها و منوهای کشویی را فراهم می‌کند.

چیزی که خواهی ساخت

در این کد لبه، شما قصد دارید یک برنامه Gradio را مستقر کنید که:

  • با استفاده از کلمات یا عبارات کلیدی یک پیام متنی ایجاد کنید. درخواست ایجاد شده را می توان به صورت دستی نیز ویرایش کرد.
  • تصاویر را از درخواست ایجاد شده در UI ایجاد کنید.

چیزی که یاد خواهید گرفت

  • نحوه استفاده از یادگیری صفر شات و چند شات با مدل text-bison به صورت برنامه‌ریزی برای تولید اعلان‌های خاص تصویر برای تولید تصویر.
  • نحوه تولید تصاویر با استفاده از مدل Imagen از طریق API و Prompt.
  • نحوه ساخت، استقرار و آزمایش برنامه Gradio از نوت بوک میز کار Vertex AI.

آنچه شما نیاز دارید

  • دسترسی به یک پروژه GCP برای مثال - 'Cloud-llm-preview4'
  • دسترسی به ایجاد Vertex AI Workbench
  • Vertex AI API فعال شد.
  • الزامات شبکه برای Gradio: آدرس عمومی دسترسی به نمونه نوت بوک

2. راه اندازی

نوت بوک را ایجاد کنید

  • وارد پروژه شوید
  • از منوی ناوبری سمت چپ به میز کار بروید
  • در بخش « نوت‌بوک‌های مدیریت‌شده توسط کاربر »، یک نوت‌بوک جدید با گزینه‌های پیش‌فرض ایجاد کنید.
  • پس از تهیه نمونه، روی " OPEN JUPYTERLAB " کلیک کنید.

توجه: اگر نوت بوک در حالت توقف باشد ممکن است چند دقیقه طول بکشد تا نوت بوک راه اندازی شود.

کد را دریافت کنید

ما فایل کد را اینجا قرار داده ایم. این نوت بوک می تواند در محیط شما وارد شود و همانطور که هست اجرا شود (به جز تغییر جزئیات پروژه شما).

3. کد را اجرا کنید

وابستگی ها و کتابخانه های مورد نیاز را نصب/وارد کنید

  • برنامه Gradio را نصب کنید
  • API های Vertex AI را برای Text-Bison و Image Generation وارد کنید.
  • تمام کتابخانه های مورد نیاز دیگر را وارد کنید.

ایجاد سریع با استفاده از Text-Bison

از یک ورودی کاربر حاوی کلمات کلیدی و/یا عبارت استفاده می‌کند، یعنی فهرستی از کلمات یا عبارات کلیدی جدا شده با کاما که می‌تواند برای ساختن جمله‌ای که تصویر مورد نیاز را برای تولید توصیف می‌کند، استفاده کند.

به عنوان مثال - شخصیت، موضوع، پس‌زمینه، نورپردازی و سایر توضیحات.

تابعی که دستور را ایجاد می کند به صورت زیر ارائه می شود:

def prompt_generation (شخصیت، سیگنال، تم، نور، کیفیت، extra_desc):

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

answer_few_shot = model.predict(

    few_shot_prompt,

    **parameters

)

response_single_shot = model.predict(

    prompt,

    **parameters

)

اعلان چند شات و صفر شات

درخواست صفر شات یک تکنیک تولید متن است که در آن هیچ زمینه یا مثالی برای تولید متن به مدل داده نمی شود. این می تواند چالش برانگیز باشد، زیرا مدل باید بر دانش خود برای تولید متنی منسجم و آموزنده تکیه کند.

با این حال، درخواست صفر شات نیز می‌تواند بسیار خلاقانه باشد، زیرا مدل با هیچ نمونه‌ای از قبل محدود نمی‌شود.

درخواست چند شات یک تکنیک تولید متن است که در آن مدل تعداد کمی مثال برای تولید متن داده می شود. این می‌تواند ساده‌تر از درخواست صفر شات باشد، زیرا این مدل راهنمایی‌هایی در مورد آنچه تولید می‌کند دارد. با این حال، درخواست چند شات نیز می‌تواند محدود کننده باشد، زیرا مدل ممکن است فقط بتواند متنی شبیه به نمونه‌های ارائه شده تولید کند.

در زیر کد نمونه دستورات Few-Shot و Zero-shot آمده است.

**# چند دستور شات در کد استفاده شده**

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:

"""

# اعلان شات صفر استفاده شده در کد

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 استفاده می کند.

از vertexai.preview.vision_models ImageGenerationModel را وارد کنید

def image_generation (ورودی، 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 = "چهره های مخدوش و غیرجذاب"

لیست_تصاویر_genereded = image_generation (user_prompt,negative_prompt)

#نمایش یکی از تصاویر تولید شده

generated_images_list[0].show()

خروجی -

db04a6bfdd78693b.jpeg

4. برنامه Gradio را مستقر کنید

Gradio برای frontend استفاده می شود که در آن کاربران می توانند کلمات کلیدی را وارد کرده و اعلان های ساختاریافته تولید کنند و این اعلان ها را می توان مستقیماً استفاده کرد یا می تواند توسط کاربر ویرایش شود و سپس برای تولید تصاویر مطابق ورودی ها به Imagen وارد شود. Gradio یک کتابخانه پایتون است که می تواند برای ایجاد رابط کاربری برای مدل های یادگیری ماشین استفاده شود. برای این برنامه از بلوک ها برای افزودن انعطاف پذیری و جریان های پیچیده داده به این برنامه استفاده می شود. 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، inputs=[شخصیت، سیگنال ها، تم، photo_modifiers، quality_modifiers، other_desc]، outputs = returned_prompts)

برای مدیریت ورودی ها و خروجی های کاربر، Gradio مؤلفه های متعددی مانند Image، Video، Slider، Dropdown، Textbox، Radio و گزینه های دیگر را ارائه می دهد. این مولفه‌ها به توسعه‌دهندگان انعطاف‌پذیری و کنترل در مورد نحوه پذیرش ورودی‌های کاربران و تغذیه آن‌ها به Test-bison، imagen یا هر مدل 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، کافی است یک پیام متنی را تایپ کرده و روی دکمه Generate کلیک کنید. Imagen بر اساس درخواست شما یک تصویر تولید می کند. می توانید اعلان های مختلف را امتحان کنید تا ببینید Imagen چه نوع تصاویری را می تواند ایجاد کند.

در زیر اسکرین شات از Prompt Generation در اپلیکیشن Gradio آمده است.

70331c9645b1e91b.png

در زیر اسکرین شات از Image Generation در اپلیکیشن Gradio آمده است.

a7261e8fafab7073.png

چند نمونه -

مثال 1 -

[تصویر سمت چپ] اعلان (استفاده از کلمات کلیدی ساده به عنوان اعلان): چند دوست در حال قایق سواری.

[تصویر سمت راست] اعلان (با استفاده از اعلان‌های تولید شده توسط Text-Bison): عکسی از 2 مرد جوان در حال ماهیگیری در قایق احاطه شده توسط درختان تیره در جنگل. مردان پیراهن پوشیده اند و روی قایق ایستاده اند. نور طبیعی، با کیفیت بالا، عکس 4K عکاسی شده توسط عکاس حرفه ای.

c2f5fabd10baf42.jpegabc9b8204a9fdf7f.jpeg

مثال 2 -

[تصویر سمت چپ] Prompt ((استفاده از کلمات کلیدی ساده به عنوان درخواست)): یک درخت کریسمس

[تصویر سمت راست] اعلان (با استفاده از اعلان‌های تولید شده توسط Text-Bison): درخت کریسمس در اتاقی با لامپ و مبلمان. درخت با چراغ ها و تزئینات تزئین شده است. در نزدیکی یک پنجره قرار می گیرد و در پس زمینه دیواری قابل مشاهده است. نور گرم، با کیفیت بالا، عکس HDR که توسط عکاس حرفه ای گرفته شده است.

f10cf9f52ffd92c7.jpegcce36df7a439b309.jpeg

5. تمیز کردن

برای پاکسازی منابع خود،

  • برنامه gradio را متوقف کنید.
  • نوت بوک Workbench را متوقف/حذف کنید.

6. تبریک می گویم

تبریک می‌گوییم، شما با موفقیت یک برنامه Gradio را برای ایجاد اعلان‌ها و تصاویر با Google Text-Bison API و Imagen API اجرا کردید.