Исходная публикация с описаниеим метода [Mar 2023] — DreamBooth: Fine Tuning Text‑to‑Image Diffusion Models for Subject‑Driven Generation

Что такое stable-diffusion

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

В основеStable Diffusion лежит архитектура autoencoder. Сначала модель «кодирует» текстовое описание в вектор признаков. Затем декодер поэтапно создает изображение, уточняя его с каждым шагом. Этот процесс напоминает диффузию — плавное распространение частиц.

Что такое дообучение

Нейронные сети «получают информацию» об окружающем мире при обучении. Создатели модели генерируют огромный датасет картинок с их описанием, и загоняют их в модель. Однако если вы хотите генерировать какой то конкретный обьект — например лично вас, вашего питомца, родной дом, картины любимого автора в особом стиле итп.
Вы можете загнать ваши новые изображения в модель, придумав для них описание, содержащие названия вашего объекта (или лучше какой‑то специальный токен, условно [V]), и скоректировав веса градиентным спуском, так что бы модель понимала, что скрывается за этим токеном. Однако такое дообучение дифузионных моделей имеет свои недостатки

Проблемы

Как мы видим на данном изображении из-за наличия в дообучающем датасете только фотографий сидячих собак, модель не может сгенерить ее в другом ракурсе, потому что забыла что собаки могут находиться и в других позах.
Как мы видим на данном изображении из-за наличия в дообучающем датасете только фотографий сидячих собак, модель не может сгенерить ее в другом ракурсе, потому что забыла что собаки могут находиться и в других позах.
  1. Language drift — модель предварительно обученная на большом корпусе текста и позже точно настроенная для конкретной задачи, постепенно теряет синтаксические и семантические знания языка.

  2. Уменьшения разнообразия выходных данных. Модели преобразования текста в изображение естественным образом обеспечивают большое разнообразие выходных данных. При точной настройке мы хотели бы иметь возможность создавать объект в новых ракурсах, позах. Однако из за переобучения вариативность выходных поз объекта сокращается.

Основная идея решения

Авторы статьи решают эту задачу дополнительным лоссом — class‑specific prior preservation loss. Вначале обучаемая модель пытаться сгенерировать нашу собаку, и обучается по лоссу с фотографиями из выборки для дообучения. Затем она же генерирует произвольную собаку, и лосс считается с фотографиями, сгенерированными исходной моделью. Таким образом, мы наказываем модель, за то что она забывает абстрактные признаки собак, концентрируясь на обучающей выборке. Более лаконично на схеме:

Или более строго прибавку к лосу можно записать в виде:

\begin{aligned}& \mathbb{E}_{\mathbf{x}, \mathbf{c}, \boldsymbol{\epsilon}, \boldsymbol{\epsilon}^{\prime}, t}\left[\right.  \left.\lambda w_{t^{\prime}}\left\|\hat{\mathbf{x}}_\theta\left(\alpha_{t^{\prime}} \mathbf{x}_{\mathrm{pr}}+\sigma_{t^{\prime}} \boldsymbol{\epsilon}^{\prime}, \mathbf{c}_{\mathrm{pr}}\right)-\mathbf{x}_{\mathrm{pr}}\right\|_2^2\right]\end{aligned}

Насколько хорошо это работает?

Как видно из картинок ниже, добавление class‑specific prior preservation loss очень позитивно сказалось на возможности модели генерировать исходный объект в разнообразных вариациях

Просто сравните с тем что было выше!

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

При этом сама модель не потеряла возможности генерировать обычные объекты (произвольных собак, отличных от той, на которой происходило до обучение)

А так же такой подход очень хорошо сработал для задач style‑transfer конкретного объекта. Авторы смогли сгенерировать картинки в разных стилях, но с исходной собакой.

LoRA

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

Воспроизведение результатов

Я до обучил stable‑diffusion‑v1–5 на двух собственных датасетах — фотографии кошки (cloody‑cat) и декоративного гриба. Обучение проходило на видеокарте A100 (занимая примерно 1/8 видеопамяти) в течении 2х минут. Интерактивная демонстрация работы моей модели на Hugging Face — freQuensy23/diffusion‑cloody — там можно потыкать свои запросы бесплатно (за такое им огромный респект)! В таблице ниже показано как со временем обучения меняется результат генерации по промпту «A [V] cat», а более красочно вы можете посмотреть это в анимации в начале этой статьи или тут. Так же я проверил данную систему на генерации этого кота в очень разных условиях и стилях. Дальше будет просто фотогалерея

A [V] cat in the spacesuit drawing
A [V] cat in the spacesuit drawing
A [V] cat sad
A [V] cat sad
A [V] cat drawing
A [V] cat drawing
A [V] cat dancing
A [V] cat dancing
A [V] cat selfie in the ISS
A [V] cat selfie in the ISS
A [V] cat swim
A [V] cat swim

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

P. S. Если есть ошибка в правописании — сообщите мне через стандартную систему хабра — я исправлю. Мне бывает сложно писать на русском.

Комментарии (3)


  1. george3
    14.09.2023 15:46
    +1

    Респект!


  1. densss2
    14.09.2023 15:46

    Пробелемы

    Хьюстон, у нас пробелемы!


    1. crims0n_ru
      14.09.2023 15:46

      И туда же сгенерить, до обучение