Skip to content

compfee/Domain-specific-content-generation

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

19 Commits
 
 
 
 

Repository files navigation

Domain-specific-content-generation

Оглавление

Изучение статьи

Что это такое?

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

Почему над этим работают?

Это уникальное решение.
Уже существуют нейронные сети, которые позволяют генерировать изображения по текстовому описанию, но это всегда будут разные объекты. Например, если попросить изобразить собаку конкретной породы, в конкретной позе на фоне эйфелевой башни - это всегда будут разные собаки. Представленное решение способно на основе 3-5 фотографий одной собаки генерировать изображения с ней в разных контекстов с сохранением отличительных черт и естественности.

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

Как формулируется задача?

Необходимо создать модель, которая по входящим 3-5 изображениям одного и того же объекта будет генерировать его в различных контекстах, связать изображение и текст так, чтобы сохранить уникальные черты объекта и не потерять естественность.
Оглавление

В чем ее основная идея?

В данной работе исследователи представляют новый подход к "персонализации" диффузионных моделей "текст-изображение" (их адаптации к потребностям пользователя при генерации изображений). Цель - расширить языковой словарь модели таким образом, чтобы она связывала новые слова с конкретными темами, которые пользователь хочет генерировать. Для этого предлагается методика представления заданного субъекта с помощью редких токенов-идентификаторов и тонкуая настройка предварительно обученного фреймворка преобразования текста в изображение на основе диффузии. Тонкая настройка модели преобразования текста в изображение осуществляется с помощью входных изображений и текстовых подсказок, содержащих уникальный идентификатор, за которым следует название класса предмета (например, "A [V] dog").
Оглавление

В чем ее новаторство?

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

Оглавление

Какие получились результаты?

Авторы представили пример генерации изображения с несколькими входными изображениями на дополнительном контексте, получилось очень точно все воспроизвести. Был создан датасет, состоящий из 30 различных классов из животных и неодушевленных объектов. Было проведено сравнение результатов с Textual Inversion (единственной сопоставимой работе, которая ориентирована на предмет и текст и генерирует изображения), DreamBooth (Imagen) и DreamBooth (Stable Diffusion). По всем метрикам (DINO, CLIP-I, CLIP-T) результаты DreamBooth (Imagen) оказались более приближены к реальным изображениям. Также авторы говорят об ограничениях данного метода, приводят несколько неудачных примеров генерации. Возможные причины - слабый приоритет для таких контекстов, сложность генерации как предмета, так и заданного понятия вместе из-за низкой вероятности совместного использования. Вторая причина - смешение контекста и внешнего вида, когда внешний вид субъекта изменяется под воздействием контекста подсказки, например с изменением цвета объекта. Третья - чрезмерную подгонка к реальным изображениям, которая происходит, когда подсказка похожа на исходную обстановку, в которой находится объект. Было замечено, что такие предметы, как рюкзак легче поддаются генерации, чем кошки и собаки.
Оглавление

Практическая часть

Промежуточные результаты с картинками

В процессе работы получилось дообучить модель на небольшом домене из 10 картинок с героем Cinnamonroll 512x512 пикселей. Примеры картинок:

Изначально было решено увеличить количество эпох до 500 и изменить batch size на 10, learning rate для энкодера = 5e-5, learning rate для unet = 3e-4, random seed = 40, FP_16 = True, при генерации изменялся только параметр guidance(от 9 до 13), LORA_SCALE_UNET=0.1, LORA_SCALE_TEXT_ENCODER=0.1. В качестве PROMPT использовалось имя персонажа "cinnamoroll". В качестве INFERENCE_PROMPT для тестирования использовалась фраза "cinnamoroll a toy". Получился следующий результат:

Для "cinnamoroll ridding a bycicle" получаются пугающие огромные зайцы на настоящих велосипедах, не как на картинке из обучающего набора:

Для "crochet toy cinnamoroll" получаются лунтики:

Для "cup with printed cinnamoroll" самые красивые изображения(я бы хотела такую кружку):

Для "art of cinnamoroll eating strawberry" тоже лунтики:

Для "art of cooking cinnamoroll" получается такой mood ▓▒░(°◡°)░▒▓:

При меньшем количестве эпох получались совсем невнятные изображения, например при epoch = 300, batch size = 1, learning rate для энкодера = 1e-5, learning rate для unet = 3e-4, random seed = 40, prompt = 'cinnamoroll a toy':

Или другой пример epoch = 300, batch size = 1, learning rate для энкодера = 1e-5, learning rate для unet = 3e-4, random seed = 40, prompt = 'crochet toy cinnamoroll':

Оглавление

Конечные результаты с картинками

При epoch = 500, batch size = 1 (т.к. картинок и так мало и если брать 10 то значения просто будут усредняться), learning rate для энкодера = 1e-5, learning rate для unet = 3e-4, seed = 123, FP_16 = False.
prompt = 'cinnamoroll a toy', guidance = 13, LORA_SCALE_UNET = 0.5, LORA_SCALE_TEXT_ENCODER = 0.1:

prompt = 'crochet toy cinnamoroll', guidance = 11, LORA_SCALE_UNET = 0.5, LORA_SCALE_TEXT_ENCODER = 0.1 (очень много неудачных вариантов):

prompt = 'cinnamoroll eat strawberry', guidance = 11.8, LORA_SCALE_UNET = 0.5, LORA_SCALE_TEXT_ENCODER = 0.1:

prompt = 'cup with printed cinnamoroll', guidance = 11.8, LORA_SCALE_UNET = 0.5, LORA_SCALE_TEXT_ENCODER = 0.1:

Решила проверить есть ли зависимость от порядка слов, prompt = 'cinnamoroll printed on cup', guidance = 11.8, LORA_SCALE_UNET = 0.5, LORA_SCALE_TEXT_ENCODER = 0.1, стали получаться стаканчики для кофе:

prompt = 'cinnamoroll ridding bicycle', guidance = 13.8, LORA_SCALE_UNET = 0.8, LORA_SCALE_TEXT_ENCODER = 0.2. Результаты получились намного лучше, чем были изначально.
Ожидание(из датасета):

Реальность:

prompt = 'black colored cinnamoroll', guidance = 9, LORA_SCALE_UNET = 0.9, LORA_SCALE_TEXT_ENCODER = 0.1:

prompt = 'black colored cinnamoroll', guidance = 13.2, LORA_SCALE_UNET = 0.9, LORA_SCALE_TEXT_ENCODER = 0.1:

Сколько бы я ни пыталась у меня не получилось изобразить prompt = 'cinnamoroll with a green frog shaped cap on head', guidance = 13.8, LORA_SCALE_UNET = 0.8, LORA_SCALE_TEXT_ENCODER = 0.5.
Ожидание(из датасета):

Реальность:

Если генерировать синнаморолла в профессии садовника получается неплохо.
prompt = 'cinnamoroll is a gardener', guidance = 11.8, LORA_SCALE_UNET = 0.7, LORA_SCALE_TEXT_ENCODER = 0.1:

И читать книгу у него тоже хорошо получается. prompt = 'cinnamoroll is reading a book', guidance = 11.8, LORA_SCALE_UNET = 0.7, LORA_SCALE_TEXT_ENCODER = 0.1:

Оглавление

Наблюдения

  • Самые лучшие изображения получаются с какими то простыми объектами, например с кружками или мягкими игрушками(т.е. 3d изображение персонажа).
  • Сеть выдает более правдивые(если так можно судить) результаты, если выкрутить GUIDANCE на 9-15.
  • При большем количестве эпох результаты не становятся сильно лучше, чем при 500, если увеличивать learning rate, то само собой результаты ухудшаются, будет труднее попасть в точку минимума.
  • Решила посмотреть, как дообучают модель LoRA другие люди, в случае добавления текстовых файлов с ключевыми словами результаты генерации оказываются лучше, но пока не разобралась в том как подавать на вход предложенной модели текстовые файлы.
    Оглавление

... и проблемы

В самом начале я столкнулась с ошибкой при запуске обучения:

TypeError: Accelerator.init() got an unexpected keyword argument 'logging_dir'

Оказалось что в файле train_lora_dreambooth.py необходимо заменить logging_dir на project_dir т. к. версия устарела

Оглавление

Запуск

  • С помощью Google Colab запустить ноутбук.
  • Создать папки input и output
  • Указать их в качестве OUTPUT_DIR и IMAGES_FOLDER_OPTIONAL, а также все learning rate
  • Загрузить в input изображения
  • Предварительно перед запуском обучения заменить 493 строчку в файле /content/lora/training_scripts/train_lora_dreambooth.py.

Было:

accelerator = Accelerator(
        gradient_accumulation_steps=args.gradient_accumulation_steps,
        mixed_precision=args.mixed_precision,
        log_with="tensorboard",
        logging_dir=logging_dir,
    )

Стало:

accelerator = Accelerator(
        gradient_accumulation_steps=args.gradient_accumulation_steps,
        mixed_precision=args.mixed_precision,
        log_with="tensorboard",
        project_dir=logging_dir,
    )

Готово! °˖✧◝(⁰▿⁰)◜✧˖°
Оглавление

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published