GenAI — Генерация изображений по ключевым словам

1. Введение

Последнее обновление: 12.10.2023

Генерация изображений Imagegen

Google Imagen — это мощная языковая модель Google, способная генерировать реалистичные и креативные изображения на основе текстовых описаний. Imagen на платформе Vertex AI позволяет пользователям создавать продукты нового поколения на основе ИИ, которые за считанные секунды преобразуют воображение пользователей в высококачественные визуальные материалы. Помимо генерации изображений из текста, она также поддерживает редактирование изображений с помощью текстовых подсказок, добавление подписей к изображениям, визуальные вопросы и ответы, а также настройку модели изображений на основе тематики и стиля.

Генерация подсказок

Для создания изображения с помощью Imagen необходимо предоставить текстовое описание изображения, известное как подсказка, на основе которой генерируется изображение. Однако для создания высококачественного фотореалистичного изображения требуются специальные навыки в создании подсказок. Это также может зависеть от предметной области, если вы хотите создать изображение, связанное с конкретными бизнес-сферами, такими как розничная торговля, производство и т. д. Более простой подход к созданию подсказки — это предоставление набора ключевых слов модели Text Bison.

Общий подход заключается в следующем:

fbb3826592b2816d.png

Gradio UI

Gradio — это библиотека Python с открытым исходным кодом, которая позволяет быстро создавать простые в использовании, настраиваемые компоненты пользовательского интерфейса для вашей модели машинного обучения, любого API или даже произвольной функции Python, используя всего несколько строк кода. Вы можете интегрировать графический интерфейс Gradio непосредственно в свой блокнот Jupyter или поделиться им в виде ссылки с кем угодно. Gradio поддерживает широкий спектр типов мультимедиа, включая текст, изображения, видео и аудио. Она также предоставляет ряд готовых компонентов пользовательского интерфейса, таких как поля ввода, кнопки, ползунки и выпадающие меню.

Что вы построите

В этом практическом задании вы развернете приложение Gradio, которое будет выполнять следующие действия:

  • Создайте текстовую подсказку, используя ключевые слова или фразы. Сгенерированную подсказку также можно редактировать вручную.
  • Сгенерируйте изображения на основе сгенерированного запроса в пользовательском интерфейсе.

Что вы узнаете

  • Как программно использовать обучение с нулевым и малым количеством примеров с моделью TextBison для генерации подсказок, специфичных для изображений, при создании изображений.
  • Как генерировать изображения с помощью модели Imagen через API и Prompt.
  • Как создать, развернуть и протестировать приложение Gradio из блокнота Vertex AI Workbench.

Что вам понадобится

  • Доступ к проекту GCP, например, 'Cloud-llm-preview4'.
  • Доступ к созданию рабочей среды Vertex AI.
  • API Vertex AI включен.
  • Требования к сети для Gradio: доступ к экземпляру ноутбука по общедоступному URL-адресу.

2. Настройка

Создайте блокнот

  • Войдите в проект
  • Перейдите в раздел «Рабочий стол» через левое навигационное меню.
  • В разделе « Управляемые пользователем блокноты » создайте новый блокнот с параметрами по умолчанию.
  • После завершения создания экземпляра нажмите кнопку " ОТКРЫТЬ JUPYTERLAB ".

Примечание: Если ноутбук находится в остановленном состоянии, для его запуска может потребоваться несколько минут.

Получите код

Здесь находится файл с кодом. Этот блокнот можно импортировать в вашу среду и запустить как есть (за исключением изменения параметров вашего проекта).

3. Запустите код

Установите/импортируйте необходимые зависимости и библиотеки.

  • Установите приложение Gradio.
  • Импортируйте API-интерфейсы Vertex AI для 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 prompting) — это техника, при которой модели не предоставляется контекст или примеры для генерации текста. Это может быть непросто, поскольку модели приходится полагаться на собственные знания для создания связного и информативного текста.

Однако, использование подсказок без предварительного обучения также может быть очень креативным, поскольку модель не ограничена какими-либо уже существующими примерами.

Метод генерации текста с малым количеством примеров (few-shot prompting) предполагает, что модели предоставляется небольшое количество примеров для генерации текста. Это может быть проще, чем метод с нулевым количеством примеров (zero-shot prompting), поскольку модель получает некоторые указания относительно того, что нужно сгенерировать. Однако метод с малым количеством примеров может быть и ограниченным, поскольку модель может генерировать только текст, похожий на предоставленные ей примеры.

Ниже приведён пример кода для запросов с малым и нулевым количеством попыток.

**# В коде использовано несколько подсказок для коротких видеороликов**

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 = " Задание : Молодая женщина демонстрирует и продает неукрашенную свежую рождественскую елку из букета деревьев. Холодное освещение, высококачественное и детальное изображение, сделанное профессиональным фотографом издалека."

negative_prompt = "Искаженные и непривлекательные лица"

generated_images_list = image_generation(user_prompt,negative_prompt)

#показать одно из сгенерированных изображений

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

с помощью gr.Row():

    btn = gr.Button("Submit")

с помощью 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 или любую другую модель машинного обучения.

В рамках этого проекта приложение создано с использованием блоков для обеспечения гибкости и усложнения.

Данные поступают в приложение. Помимо блоков, используются многочисленные компоненты 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 -

[Изображение слева] Подсказка (с использованием простых ключевых слов): Пара друзей катается на лодке.

[Изображение справа] Подсказка (с использованием подсказок, сгенерированных Text-Bison): Фотография двух молодых людей, ловящих рыбу в лодке в окружении темных деревьев в лесу. Мужчины в рубашках стоят в лодке. Естественное освещение, высокое качество, 4K. Фотография сделана профессиональным фотографом.

c2f5fabd10baf42.jpegabc9b8204a9fdf7f.jpeg

Пример 2 -

[Изображение слева] Подсказка ((Используя простые ключевые слова в качестве подсказок)): Рождественская елка

[Изображение справа] Подсказка (с использованием подсказок, сгенерированных Text-Bison): Рождественская елка в комнате с лампой и мебелью. Елка украшена гирляндами и игрушками. Она стоит у окна, на заднем плане видна стена. Теплое освещение, высокое качество, HDR. Фотография сделана профессиональным фотографом издалека.

f10cf9f52ffd92c7.jpegcce36df7a439b309.jpeg

5. Уборка

Чтобы очистить ваши ресурсы,

  • Остановите приложение Gradio.
  • Остановить/удалить блокнот Workbench.

6. Поздравляем!

Поздравляем, вы успешно развернули приложение Gradio для создания подсказок и изображений с использованием API Google Text-Bison и API Imagen.