Изображение, сгенерированное AI по промпту «photograph of a robot drawing in the wild, nature, jungle» («фотография робота, рисующего в природе, джунглях»)

22 августа 2022 года Stability.AI объявила о публичном релизе Stable Diffusion — мощной диффузионной модели text-to-image. Модель способна генерировать различные варианты изображений на основании текстового или графического ввода.

Стоит заметить, что «модель выпущена под лицензией Creative ML OpenRAIL-M. Лицензия допускает коммерческое и некоммерческое использование. Ответственность за этическое использование модели лежит на разработчиках. Это относится и к производным от неё моделям».

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

Посмотрите на показанное ниже сравнение реального объекта и изображения, сгенерированного при помощи модели Stable Diffusion и точно настроенного эмбеддинга:


Давайте приступим к подготовке и установке.

Установка


Следует учесть, что этот туториал основан на форкнутой версии Stable Diffusion, в которую интегрирована текстовая инверсия для персонализации генерации изображений. В официальном репозитории рекомендуют использовать для установки Anaconda.

Для установки всех необходимых зависимостей изучите следующее руководство:


Если вы намереваетесь устанавливать все зависимости через pip install, то воспользуйтесь следующим файлом требований:

pip install -r requirements.txt

Если у вас возникнут проблемы с установкой, изучите следующее руководство по устранению проблем.

Убедитесь, что у вас есть все требуемые модели и чекпоинты в рабочей папке или в папке .cache.

Или же можно протестировать это при помощи следующего ноутбука Stable Diffusion AI на Google Colab. Следуйте инструкциям по запуску Stable Diffusion в изолированном окружении.

Подготовка данных


Первым делом в корневом каталоге (stable-diffusion) создайте папку training_data. Мы поместим в неё все наши обучающие изображения. Можно дать им любые имена, но они должны иметь следующие свойства:

  • размер изображения: 512 x 512
  • объекты на изображениях должны быть правильно повёрнуты
  • для наилучших результатов используйте 3-5 изображений (если использовать слишком много изображений, модель может не сойтись)
  • изображения должны содержать схожую контекстуальную информацию. Для точной настройки под стиль нужно использовать согласованные цветовые схемы и стиль графики. Для точной настройки под объекты на изображениях должен присутствовать одинаковый объект под разными углами (рекомендуется сохранять одно направление для объектов, передняя и задняя части которых различаются).

Для демонстрации я воспользуюсь своим брелоком в качестве данных обучения для точной настройки под объект.


Показанные выше фото сделаны камерой моего телефона, поэтому мне нужно было уменьшить их до размера 512 x 512. Внутри папки training_data я создал ещё две папки:

  • raw — для сырых изображений, требующих изменения размера
  • key — подпапка для всех обучающих изображений (512 x 512)

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

from PIL import Image
import glob

size = (512, 512)

# получаем все файлы в папке, проверяем, что все они являются изображениями
files = glob.glob('./training_data/raw/*')

for fil in files:
    # при необходимости реализуем здесь проверку типа файла
    
    # получаем базовое имя, например "dragon.jpg" -> ("dragon", ".jpg")
    basename = os.path.splitext(os.path.basename(fil))[0]

    with Image.open(fil) as img:
        # изменяем размер до 512 x 512
        img = img.resize(size)
        
        # при необходимости поворачиваем изображение
        # img = img.rotate(90)
        
        # сохраняем изменённое изображение, при необходимости измените способ ресэмплинга и папку для вывода
        img.save(f"./training_data/key/{basename}.png", format="PNG", resample=Image.Resampling.NEAREST)

Конфигурация


Перейдите в папку <root>/configs/stable-diffusion/, в ней вы должны увидеть следующие файлы:

  • v1-finetune.yaml
  • v1-finetune_style.yaml
  • v1-inference.yaml

Файл v1-finetune.yaml предназначен для точной настройки под объекты. Для точной настройки под стиль нужно использовать в качестве файла конфигурации v1-finetune_style.yaml.

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

Стандартная конфигурация требует для обучения не менее 20 ГБ VRAM. Мы можем снизить требования к памяти, уменьшив размер батча и количество воркеров. Измените следующие строки:

data:
  target: main.DataModuleFromConfig
  params:
    batch_size: 2
    num_workers: 16
...
lightning:
  callbacks:
    image_logger:
      target: main.ImageLogger
      params:
        batch_frequency: 500
        max_images: 8

чтобы они выглядели так:

data:
  target: main.DataModuleFromConfig
  params:
    batch_size: 1
    num_workers: 8
...
lightning:
  callbacks:
    image_logger:
      target: main.ImageLogger
      params:
        batch_frequency: 500
        max_images: 1

  • batch_size с 2 до 1
  • num_workers с 16 до 8
  • max_images с 8 до 1

Я протестировал новую конфигурацию, она работает на GeForce RTX 2080.

Для уменьшения объёма памяти можно изменить разрешение обучающего изображения в first_state_config. Рекомендую использовать 256 или 512, в зависимости от устройств GPU.

first_stage_config:
      target: ldm.models.autoencoder.AutoencoderKL
      params:
        embed_dim: 4
        monitor: val/rec_loss
        ddconfig:
          double_z: true
          z_channels: 4
          resolution: 256

Кроме того, вам нужно будет изменить initializer_words как часть ввода для эмбеддинга. Он принимает список строк:

# точная настройка на изображение игрушки
initializer_words: ["toy"]
# точная настройка на стиль графики
initializer_words: ["futuristic", "painting"]

Обучение


Закончив с этим, выполните следующую команду:

python main.py --base ./configs/stable-diffusion/v1-finetune.yaml \
    -t \
    --actual_resume ./models/ldm/stable-diffusion-v1/model.ckpt \
    -n my_key \
    --gpus 0, \
    --data_root ./training_data/key/

Укажите --no-test в командной строке, чтобы игнорировать тестирование при точной настройке. Для изменения initializer_words можно использовать аргумент --init_word. Стоит заметить, что он работает только для одной строки. Если вы намереваетесь использовать несколько строк, то нужно изменить их в файле конфигурации.

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

Если всё настроено правильно, начнётся обучение и будет создана папка logs. Внутри неё будет находиться папка для каждого проведённого вами обучения, и в ней хранятся следующие папки:

  • checkpoints — содержит выходной эмбеддинг и чекпоинты обучения
  • configs — файлы конфигурации в формате YAML
  • images — пример текста промпта, изображение промпта и сгенерированные изображения
  • testtube — файлы, связанные с тестированием

Обучение будет продолжаться бесконечно или в зависимости от числа max_steps, заданного в файле конфигурации:

trainer:
  benchmark: True
  max_steps: 4000

Для справки см. v1-finetune.yaml, так как эта конфигурация не включена в v1-finetune_style.yaml. Пропустите её, чтобы обучение выполнялось бесконечно.
Чтобы понять качество результатов работы, проверьте папку images. Изображения с префиксом sample_scaled_ представляют собой сгенерированные сэмплы и если обучение происходит правильно, они должны иметь схожие черты с данными обучения. Можно остановить обучение, когда оно достигнет примерно 5000-7000 шагов.

Внутри папки checkpoints находится довольно большое количество файлов:

  • embeddings_gs-5699.pt — файл эмбеддинга на шаге 5699
  • epoch=000010.ckpt — чекпоинт обучения на 10 эпохах
  • last.ckpt — чекпоинт обучения последней эпохи
  • embeddings.pt — файл эмбеддинга последнего шага

Файлы ckpt используются для продолжения обучения. Файлы pt — это файлы эмбеддингов, которые должны использоваться совместно с моделью Stable Diffusion. Просто скопируйте нужный файл эмбеддинга и поместите его в удобное место для получения логического вывода (inference).

Логический вывод


▍ Интерактивный терминал


Для использования в командной строке просто задайте флаг embedding_path при запуске ./scripts/invoke.py.

python ./scripts/invoke.py --embedding_path /path/to/embeddings.pt

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

invokeai> "a photo of *"

Кроме того, можно выполнить и image2image, задав флаг init_img:

invokeai> "waterfall in the style of *" --init_img=./path/to/drawing.png --strength=0.7

▍ Упрощённый API


Также можно использовать модуль ldm.generate для создания логического вывода программным образом. Он имеет функцию prompt2image как единую точку входа для задач text2image и image2image.

Стоит заметить, что старая версия содержит следующие функции, которые устарели, но всё равно работают:

  • txt2img
  • img2img

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

Полный код логического вывода приведён в этом gist:

from ldm.generate import Generate

# конфигурация модели
gr = Generate(
    'stable-diffusion-1.4',
    embedding_path='./models/embeddings.pt'  # измените путь к эмбеддингам
)

# загрузка модели
gr.load_model()

# инициализация переменной
text = "a photo of *"

# логический вывод возвращает список кортежей
results = gr.prompt2image(
    prompt   = text,
    outdir   = "./outputs/",
    iterations=1,
    steps=50
)

# сохраняем изображение в папку outputs
for row in results:
    im   = row[0]
    seed = row[1]
    im.save(f'./outputs/image-{seed}.png')

Результаты


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

Изображение, сгенерированное AI по промпту «watercolor painting of * with trees» («акварельный рисунок * с деревьями»)

image
Изображение, сгенерированное AI по промпту «a bagpack in the style of *» («рюкзак в стиле *»)

Изображение, сгенерированное AI по промпту «a shirt with * logo» («футболка с логотипом *»

Кроме того, я протестировал задачи image2image и получил следующие результаты:

Изображение справа сгенерировано по промпту «three * on a beach» («три * на пляже»)

Заключение


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

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

Я надеюсь увидеть новые прекрасные инструменты и современные модели, созданные опенсорсными сообществами.

Ссылки


  1. Stability.AI — Stable Diffusion public release
  2. Github — Stable Diffusion in a dream bot style interface
  3. Github — Textual Inversion

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


  1. Kwent
    19.12.2022 17:14
    +1

    Вы если делаете перевод, то оформляйте его соответствующе (не только тэгом, который еще и не ищется из-за приписки ruvds), я ссылку на оригинал так и не нашел в вашей статье.
    https://towardsdatascience.com/how-to-fine-tune-stable-diffusion-using-textual-inversion-b995d7ecc095