Логотип Зефирнет

Масштабирование изображений с помощью Stable Diffusion в Amazon SageMaker JumpStart

Дата:

В ноябре 2022 года мы объявило что клиенты AWS могут создавать изображения из текста с помощью Стабильная диффузия модели в Amazon SageMaker JumpStart. Сегодня мы объявляем о новой функции, позволяющей масштабировать изображения (изменять размер изображений без потери качества) с помощью моделей Stable Diffusion в JumpStart. Изображение с низким разрешением, размытое и пикселизированное можно преобразовать в изображение с высоким разрешением, которое выглядит более плавным, четким и подробным. Этот процесс, называемый апскейлинг, может применяться как к реальным изображениям, так и к изображениям, созданным модели Stable Diffusion с преобразованием текста в изображение. Это можно использовать для повышения качества изображения в различных отраслях, таких как электронная коммерция и недвижимость, а также для художников и фотографов. Кроме того, масштабирование может улучшить визуальное качество изображений с низким разрешением при отображении на экранах с высоким разрешением.

Stable Diffusion использует алгоритм искусственного интеллекта для масштабирования изображений, устраняя необходимость в ручной работе, которая может потребовать ручного заполнения пробелов в изображении. Он был обучен на миллионах изображений и может точно прогнозировать изображения с высоким разрешением, что приводит к значительному увеличению детализации по сравнению с традиционными средствами масштабирования изображений. Кроме того, в отличие от методов без глубокого обучения, таких как ближайший сосед, стабильная диффузия учитывает контекст изображения, используя текстовые подсказки для управления процессом масштабирования.

В этом посте мы представляем обзор того, как развернуть и запустить вывод с помощью модели апскейлера Stable Diffusion двумя способами: через пользовательский интерфейс (UI) JumpStart в Студия Amazon SageMaker, а программно через API-интерфейсы JumpStart доступный в SDK для SageMaker Python.

Обзор решения

На следующих изображениях показаны примеры масштабирования, выполненного моделью. Слева исходное изображение с низким разрешением, увеличенное до размера изображения, созданного моделью. Справа — изображение, созданное моделью.

Первое сгенерированное изображение является результатом изображения кошки с низким разрешением и подсказки «белая кошка».

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

Запуск больших моделей, таких как Stable Diffusion, требует пользовательских сценариев логического вывода. Вы должны запустить сквозные тесты, чтобы убедиться, что скрипт, модель и нужный экземпляр работают вместе эффективно. JumpStart упрощает этот процесс, предоставляя готовые к использованию сценарии, которые были тщательно протестированы. Вы можете получить доступ к этим сценариям одним щелчком мыши через пользовательский интерфейс Studio или с помощью нескольких строк кода через API-интерфейсы JumpStart.

В следующих разделах представлен обзор того, как развернуть модель и выполнить вывод с помощью пользовательского интерфейса Studio или API JumpStart.

Обратите внимание, что, используя эту модель, вы соглашаетесь с Лицензия CreativeML Open RAIL++-M.

Доступ к JumpStart через пользовательский интерфейс Studio

В этом разделе мы покажем, как обучать и развертывать модели JumpStart с помощью пользовательского интерфейса Studio. В следующем видео показано, как найти предварительно обученную модель апскейлера Stable Diffusion в JumpStart и развернуть ее. Страница модели содержит ценную информацию о модели и о том, как ее использовать. Для вывода мы используем тип экземпляра ml.p3.2xlarge, поскольку он обеспечивает ускорение графического процессора, необходимое для малой задержки вывода по низкой цене. После настройки экземпляра хостинга SageMaker выберите Развертывание. Потребуется 5–10 минут, пока конечная точка не заработает и не будет готова отвечать на запросы логического вывода.

Чтобы ускорить вывод, JumpStart предоставляет образец записной книжки, в котором показано, как выполнять вывод на только что созданной конечной точке. Чтобы получить доступ к записной книжке в Studio, выберите Открыть блокнот в Использовать конечную точку из Studio раздел страницы конечной точки модели.

Программное использование JumpStart с SageMaker SDK

Пользовательский интерфейс JumpStart можно использовать для интерактивного развертывания предварительно обученной модели всего за несколько кликов. Однако вы также можете использовать модели JumpStart программно, используя API-интерфейсы, интегрированные в SageMaker Python SDK.

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

Разверните предварительно обученную модель

SageMaker использует контейнеры Docker для различных задач сборки и выполнения. JumpStart использует Контейнеры глубокого обучения SageMaker (DLC), которые зависят от платформы. Сначала мы получаем любые дополнительные пакеты, а также сценарии для обучения и логического вывода для выбранной задачи. Затем артефакты предварительно обученной модели извлекаются отдельно с помощью model_uris, что обеспечивает гибкость платформы. Это позволяет использовать несколько предварительно обученных моделей с одним скриптом вывода. Следующий код иллюстрирует этот процесс:

model_id, model_version = "model-upscaling-stabilityai-stable-diffusion-x4-upscaler-fp16", "*"
# Retrieve the inference docker container uri
deploy_image_uri = image_uris.retrieve( region=None, framework=None, # automatically inferred from model_id image_scope="inference", model_id=model_id, model_version=model_version, instance_type=inference_instance_type,
)
# Retrieve the inference script uri
deploy_source_uri = script_uris.retrieve(model_id=model_id, model_version=model_version, script_scope="inference") base_model_uri = model_uris.retrieve(model_id=model_id, model_version=model_version, model_scope="inference")

Затем мы предоставляем эти ресурсы в Модель SageMaker экземпляр и разверните конечную точку:

# Create the SageMaker model instance
model = Model( image_uri=deploy_image_uri, source_dir=deploy_source_uri, model_data=base_model_uri, entry_point="inference.py", # entry point file in source_dir and present in deploy_source_uri role=aws_role, predictor_cls=Predictor, name=endpoint_name,
) # deploy the Model - note that we need to pass the Predictor class when we deploy the model through the Model class,
# in order to run inference through the SageMaker API
base_model_predictor = model.deploy( initial_instance_count=1, instance_type=inference_instance_type, predictor_cls=Predictor, endpoint_name=endpoint_name,
)

После того, как наша модель будет развернута, мы сможем получать от нее прогнозы в режиме реального времени!

Формат ввода

Конечная точка принимает изображение с низким разрешением в виде необработанных значений RGB или изображения в кодировке base64. Обработчик вывода декодирует изображение на основе content_type:

  • Что касается content_type = “application/json”, входная полезная нагрузка должна быть словарем JSON с необработанными значениями RGB, текстовой подсказкой и другими необязательными параметрами.
  • Что касается content_type = “application/json;jpeg”, входная полезная нагрузка должна быть словарем JSON с изображением в кодировке base64, текстовой подсказкой и другими необязательными параметрами.

Выходной формат

Следующие примеры кода дают представление о том, как выглядят выходные данные. Как и в случае формата ввода, конечная точка может отвечать необработанными значениями RGB изображения или изображением в кодировке base64. Это можно указать, установив accept к одному из двух значений:

  • Что касается accept = “application/json”, конечная точка возвращает словарь JSON со значениями RGB для изображения.
  • Что касается accept = “application/json;jpeg”, конечная точка возвращает словарь JSON с изображением JPEG в виде байтов, закодированных с помощью кодировки base64.b64.

Обратите внимание, что отправка или получение полезной нагрузки с необработанными значениями RGB может превысить ограничения по умолчанию для входной полезной нагрузки и размера ответа. Поэтому мы рекомендуем использовать изображение в кодировке base64, установив content_type = “application/json;jpeg” и accept = “application/json;jpeg”.

Следующий код является примером запроса на вывод:

content_type = “application/json;jpeg” # We recommend rescaling the image of low_resolution_image such that both height and width are powers of 2.
# This can be achieved by original_image = Image.open('low_res_image.jpg'); rescaled_image = original_image.rescale((128,128)); rescaled_image.save('rescaled_image.jpg')
with open(low_res_img_file_name,'rb') as f: low_res_image_bytes = f.read() encoded_image = base64.b64encode(bytearray(low_res_image_bytes)).decode() payload = { "prompt": "a cat", "image": encoded_image, "num_inference_steps":50, "guidance_scale":7.5} accept = "application/json;jpeg" def query(model_predictor, payload, content_type, accept): """Query the model predictor.""" query_response = model_predictor.predict( payload, { "ContentType": content_type, "Accept": accept, }, ) return query_response

Ответ конечной точки — это объект JSON, содержащий сгенерированные изображения и приглашение:

def parse_response(query_response): """Parse response and return the generated images and prompt.""" response_dict = json.loads(query_response) return response_dict["generated_images"], response_dict["prompt"] query_response = query(model_predictor, json.dumps(payload).encode('utf-8'), content_type, accept)
generated_images, prompt = parse_response(query_response)

Поддерживаемые параметры

Модели масштабирования Stable Diffusion поддерживают множество параметров для генерации изображений:

  • изображение - Изображение низкого разрешения.
  • подсказка – Подсказка для руководства генерацией изображения. Это может быть строка или список строк.
  • num_inference_steps (необязательно) – Количество шагов шумоподавления при генерации изображения. Чем больше шагов, тем выше качество изображения. Если указано, оно должно быть положительным целым числом. Обратите внимание, что большее количество шагов вывода приведет к увеличению времени отклика.
  • guide_scale (необязательно) – Более высокая шкала навигации приводит к тому, что изображение больше соответствует подсказке за счет качества изображения. Если указано, это должно быть число с плавающей запятой. guidance_scale<=1 игнорируется
  • отрицательная_подсказка (необязательно) – Это направляет генерацию изображения в соответствии с этой подсказкой. Если он указан, он должен быть строкой или списком строк и использоваться с guidance_scale. Если guidance_scale отключен, это также отключено. Более того, если подсказка представляет собой список строк, то и отрицательная подсказка также должна быть списком строк.
  • семена (по желанию) – Это исправляет рандомизированное состояние для воспроизводимости. Если указано, оно должно быть целым числом. Всякий раз, когда вы используете одно и то же приглашение с одним и тем же начальным числом, результирующее изображение всегда будет одним и тем же.
  • уровень шума (необязательно) – Это добавляет шум к скрытым векторам перед масштабированием. Если указано, оно должно быть целым числом.

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

Размер изображения и типы экземпляров

Изображения, сгенерированные моделью, могут быть в четыре раза больше исходного изображения с низким разрешением. Кроме того, потребность модели в памяти (памяти графического процессора) растет с увеличением размера сгенерированного изображения. Поэтому, если вы масштабируете уже изображение с высоким разрешением или рекурсивно масштабируете изображения, выберите тип экземпляра с большим объемом памяти графического процессора. Например, тип экземпляра ml.g5.2xlarge имеет больше памяти графического процессора, чем экземпляр типа ml.p3.2xlarge, который мы использовали ранее. Дополнительные сведения о различных типах экземпляров см. Типы инстансов Amazon EC2.

Масштабирование изображений по частям

Чтобы уменьшить требования к памяти при масштабировании больших изображений, вы можете разбить изображение на более мелкие части, известные как плитка, и повышайте масштаб каждой плитки по отдельности. После масштабирования тайлов их можно смешать вместе для создания окончательного изображения. Этот метод требует адаптации подсказки для каждой плитки, чтобы модель могла понять содержимое плитки и избежать создания странных изображений. Часть стиля подсказки должна оставаться одинаковой для всех плиток, чтобы упростить смешивание. При использовании более высоких настроек шумоподавления важно быть более конкретным в подсказке, потому что модель имеет больше свободы для адаптации изображения. Это может быть непросто, если плитка содержит только фон или не имеет прямого отношения к основному содержимому изображения.

Ограничения и предвзятость

Несмотря на то, что Stable Diffusion обладает впечатляющей производительностью при апскейлинге, он имеет ряд ограничений и предубеждений. К ним относятся, но не ограничиваются:

  • Модель может не генерировать точные лица или конечности, поскольку обучающие данные не включают достаточно изображений с этими функциями.
  • Модель прошла обучение на Набор данных ЛАИОН-5Б, который содержит контент для взрослых и может быть непригоден для использования в продукте без дополнительных соображений.
  • Модель может плохо работать с языками, отличными от английского, поскольку модель была обучена тексту на английском языке.
  • Модель не может генерировать хороший текст на изображениях

Для получения дополнительной информации об ограничениях и предвзятости см. Карта модели стабильного апскейлера Diffusion.

Убирать

После завершения работы с блокнотом обязательно удалите все ресурсы, созданные в процессе, чтобы остановить выставление счетов. Код для очистки конечной точки доступен в связанном ноутбук.

Заключение

В этом посте мы показали, как развернуть предварительно обученную модель апскейлера Stable Diffusion с помощью JumpStart. Мы показали фрагменты кода в этом посте — полный код со всеми шагами в этой демонстрации доступен в Введение в JumpStart — повышение качества изображения с помощью подсказки пример блокнота. Попробуйте решение самостоятельно и пришлите нам свои комментарии.

Чтобы узнать больше о модели и о том, как она работает, см. следующие ресурсы:

Чтобы узнать больше о JumpStart, ознакомьтесь со следующими сообщениями в блоге:


Об авторах

Доктор Вивек Мадан — ученый-прикладник в команде Amazon SageMaker JumpStart. Он получил докторскую степень в Университете Иллинойса в Урбана-Шампейн и был постдокторантом в Технологическом институте Джорджии. Он является активным исследователем в области машинного обучения и разработки алгоритмов и публиковал статьи на конференциях EMNLP, ICLR, COLT, FOCS и SODA.

Хайко Хотц является старшим архитектором решений для искусственного интеллекта и машинного обучения, уделяя особое внимание обработке естественного языка (NLP), моделям больших языков (LLM) и генеративному искусственному интеллекту. До этой должности он был руководителем отдела обработки и анализа данных службы поддержки клиентов Amazon в ЕС. Heiko помогает нашим клиентам добиться успеха в их путешествии в области искусственного интеллекта и машинного обучения на AWS и сотрудничает с организациями во многих отраслях, включая страхование, финансовые услуги, СМИ и развлечения, здравоохранение, коммунальные услуги и производство. В свободное время Хайко как можно больше путешествует.

Spot_img

Последняя разведка

Spot_img