Изучение трансформации img2img стабильной диффузии с помощью блокнота Colab

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

В этом посте вы найдете:

  • Введение в преобразования изображений и диффузоры, в частности img2img Stable Diffusion.
  • Учебное пособие по изучению стабильной диффузии с примером блокнота Colab с использованием библиотеки диффузоров Hugging Face.
  • Удивительный рисунок моего племянника и множество морских существ, которые мы создали с его помощью

Я люблю рисовать и делать плохие рисунки. Это своего рода освобождение. Плохой рисунок не обязательно должен быть отличным, он может быть любым, и это прекрасно. Я люблю упражнение в воображении и гибкость с концепциями. Я могу комбинировать вещи, трансформировать свое тело, извлекать эмоции. Обо всем этом я рассказываю в Как нарисовать свое бесконечное Я. Теперь давайте посмотрим, что произойдет, если я объединю это с искусственным интеллектом изображений.

Диффузоры и генерация изображения

Как компьютер может увидеть рисунок и преобразовать его? Я нашел методы выделения объектов из дудла, но это скорее дудл-изображение в текст (вместо создания изображения). Также есть инструменты для получения текста из изображения… так что я мог получить подпись к изображению, а затем использовать этот текст для создания другого изображения. Я попробовал это, и изображение не кажется связанным с оригиналом. Самое близкое, что я нашел, это сделать грубый набросок, а затем использовать рассеиватель с входным изображением и текстовой подсказкой, чтобы создать что-то более реалистичное. Этот конкретный процесс называется распространение img2img.

Как работает img2img Diffusion предлагает отличный общий обзор:

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

Итак, используя текстовую подсказку в качестве источника «подсказок» о том, как выглядел (предполагаемый) оригинал, он делает все возможное, чтобы восстановить изображение из статики. Он делает это за несколько шагов (например, 50), постепенно удаляя немного больше шума с каждым разом.

С помощью img2img мы действительно прячем реальное изображение (которое вы предоставляете) под кучей шума. И это приводит к тому, что Stable Diffusion «восстанавливает» что-то, что выглядит намного ближе к тому, что вы предоставили.

Начало работы с диффузорами

Диффузионные модели в последнее время стали очень популярными для генерации изображений, например, DALL-E и Stable Diffusion. В Hugging Face есть библиотека, которая упрощает начало работы с диффузорами и опробование различных моделей. Я рекомендую это введение в диффузоры и библиотеку Hugging Face для начала, оно охватывает технику, а также пример.

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

Мы собираемся использовать библиотеку диффузоров, чтобы использовать img2img Stable Diffusion для создания изображения с учетом входного изображения (каракули) и текстовой подсказки. Если есть один блокнот, который я рекомендую просмотреть в этом посте, это «Конвейер Image2Image для стабильной диффузии с использованием 🧨 диффузоров». В этом руководстве рассматривается пример загрузки изображения, а затем запуска img2img с различными возможностями, что я и искал.

Если я могу запускать преобразования изображений через существующее приложение, какой смысл перестраивать его в colab? Частично это помогает лучше понять, как они работают. А также возможность программной настройки параметров. А затем интегрируйте эту функцию с чем-то другим или создайте собственное приложение! Следующее генерирует одно изображение:

with autocast("cuda"):
    image = pipe(prompt=prompt, init_image=init_img, strength=0.9, guidance_scale=7.5, generator=generator).images[0]

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

  • приглашение: ввод текста, который будет использоваться для создания изображений. Этот метод попытается вывести изображения на основе этого текста из начального шума.
  • init_image: исходное изображение.
  • сила: сила преобразования изображения. Если он низкий, вы в значительной степени получите исходное изображение. По мере того, как он становится выше, он смещается больше, пока не игнорирует большую часть входных данных.

Давайте рисовать и распространять!

Итак, теперь вы можете представить всевозможные возможности, перебирая подсказки, изображения и сильные стороны и наблюдая, что происходит! Давайте сделаем именно это. Вы можете следить за этим постом, а затем заглянуть в блокнот для подробностей. ⚠️ Примечание. Если вы попробуете это, всегда проверяйте результат, прежде чем делиться им, а не делитесь им в прямом эфире. Некоторые существа были слишком жуткими!

Мой 5-летний племянник — удивительный художник и обожает монстров. Вот тот, что он нарисовал, это невероятно:

Обычно ввод изображений работает лучше, если вы добавляете фон. Так что под руководством моего племянника мы добавили градиентный фон и еще несколько подводных элементов.

Что было бы, если бы мы представили себе других существ с этим? Для этого мы будем использовать img2img.

Теперь мы используем пайплайн из библиотеки Hugging Face для использования Stable Diffusion (docs):

device = "cuda"
model_path = "CompVis/stable-diffusion-v1-4"

pipe = StableDiffusionImg2ImgPipeline.from_pretrained(
    model_path,
    revision="fp16", 
    torch_dtype=torch.float16,
    use_auth_token=True
)
pipe = pipe.to(device)

Я описываю эту сцену в своей подсказке: «сюрреалистичный подводный мир, большая разноцветная счастливая рыба и летящий над ней птеродактиль, другие морские существа и кораллы в воде, тренды на artstation». Часто подсказки включают неинтуитивную фразу, например «тренды на artstation». Как будто я бы не подумал добавить это при описании того, что я ищу. Так как же найти полезные фразы для подсказок?

Пространство быстрого дизайна все еще свежо, разрабатываются новые инструменты и методы. Подробнее об этом в следующем посте, а сейчас вы можете попробовать что-нибудь описательное, посмотреть, что получится, а затем вернуться позже, чтобы настроить. Пространство оперативного дизайна — богатая область для изучения!

Здесь я генерирую изображение на основе силы, создавая функцию, которая принимает входное изображение и силу:

def generate_image_by_strength(_strength, _img):
  with autocast("cuda"):
    image = pipe(prompt=prompt, init_image=_img, strength=_strength, guidance_scale=7.5, generator=generator).images[0]
  display(f"Image at strength {_strength}")
  display(image)

Использование силы 0,5 создает:

Использование силы 0,7 создает. Вы можете увидеть разницу, которую имеет увеличение силы.

И если я поднимусь выше до 0,9, вы увидите, что исходное изображение кажется менее представленным:

Теперь давайте создадим изображения, где мы будем медленно увеличивать силу от 0 до 1. Вот как это выглядит:

interval = 1/30
strength=0
while strength<=1: 
  display({strength})
  generate_image_by_strength(strength, img)
  strength += interval
  strength = round(strength,2)

С помощью ffmpeg мы создаем ролик, сила которого невелика и со временем постепенно увеличивается. Вы можете видеть, как вариация резко возрастает по мере увеличения силы. Некоторые из них выглядят довольно причудливо, так что имейте в виду:

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

index = 0
strength=0.60
while index<30: 
  generate_image_by_strength(strength, img)
  index += 1

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

Что дальше: возвращаясь к первоначальному вдохновению, я хотел бы интегрировать его в инструмент для рисования. Как настройка подсказки и сильных сторон может повлиять на входное изображение? Какие существуют способы представить интерфейсы для этого? А затем также сохранить подсказку и силу и настроить входное изображение. Много направлений для изучения!

Дополнительные ссылки: Эскиз генеративных моделей, рассеивание остальных и S таблица Diffusion Web UI.

Спасибо за чтение! Вы можете следить за последними моими новостями на среднем и твиттере. Вы можете получать ежемесячные отчеты о том, чем я занимаюсь в этом списке рассылки. Мне интересно начинать разговоры, выслушивать идеи и находить возможности, связанные с тем, над чем я работаю. Если вы знаете людей, которые были бы в этом заинтересованы, я был бы рад, если бы вы поделились этим с ними! И если вы хотите больше поболтать об этом, я буду рад поболтать здесь или в твиттере.