1. Введение
Последнее обновление: 12.10.2023
Генерация изображений Imagegen
Google Imagen — это мощная языковая модель Google, способная генерировать реалистичные и креативные изображения на основе текстовых описаний. Imagen на платформе Vertex AI позволяет пользователям создавать продукты нового поколения на основе ИИ, которые за считанные секунды преобразуют воображение пользователей в высококачественные визуальные материалы. Помимо генерации изображений из текста, она также поддерживает редактирование изображений с помощью текстовых подсказок, добавление подписей к изображениям, визуальные вопросы и ответы, а также настройку модели изображений на основе тематики и стиля.
Генерация подсказок
Для создания изображения с помощью Imagen необходимо предоставить текстовое описание изображения, известное как подсказка, на основе которой генерируется изображение. Однако для создания высококачественного фотореалистичного изображения требуются специальные навыки в создании подсказок. Это также может зависеть от предметной области, если вы хотите создать изображение, связанное с конкретными бизнес-сферами, такими как розничная торговля, производство и т. д. Более простой подход к созданию подсказки — это предоставление набора ключевых слов модели Text Bison.
Общий подход заключается в следующем:

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()
Выход -

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.
используется, в том числе:
- Строки и столбцы для правильной компоновки.
- Кнопка , текстовое поле , выпадающий список и ползунок обеспечивают необходимую функциональность и удобство использования.
- Компонент изображения для отображения результатов.
- Другие вспомогательные функции, такие как EventData , обновляются для поддержки динамических изменений в пользовательском интерфейсе.
Ниже приведён фрагмент кода, используемый для генерации изображений на основе входных данных и отрицательного запроса:
Часть #Генерация изображений
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 -
[Изображение слева] Подсказка (с использованием простых ключевых слов): Пара друзей катается на лодке.
[Изображение справа] Подсказка (с использованием подсказок, сгенерированных Text-Bison): Фотография двух молодых людей, ловящих рыбу в лодке в окружении темных деревьев в лесу. Мужчины в рубашках стоят в лодке. Естественное освещение, высокое качество, 4K. Фотография сделана профессиональным фотографом.


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


5. Уборка
Чтобы очистить ваши ресурсы,
- Остановите приложение Gradio.
- Остановить/удалить блокнот Workbench.
6. Поздравляем!
Поздравляем, вы успешно развернули приложение Gradio для создания подсказок и изображений с использованием API Google Text-Bison и API Imagen.