Это новый подход, который позволяет генерировать изображения объектов в различных контекстах.
Оглавление
Это уникальное решение.
Уже существуют нейронные сети, которые позволяют генерировать изображения по текстовому описанию, но это всегда будут разные объекты. Например, если попросить изобразить собаку конкретной породы, в конкретной позе на фоне эйфелевой башни - это всегда будут разные собаки. Представленное решение способно на основе 3-5 фотографий одной собаки генерировать изображения с ней в разных контекстов с сохранением отличительных черт и естественности.
Современные модели не могут точно реконструировать внешний вид заданных предметов, а лишь создают вариации содержания изображения.
Оглавление
Необходимо создать модель, которая по входящим 3-5 изображениям одного и того же объекта будет генерировать его в различных контекстах, связать изображение и текст так, чтобы сохранить уникальные черты объекта и не потерять естественность.
Оглавление
В данной работе исследователи представляют новый подход к "персонализации" диффузионных моделей "текст-изображение" (их адаптации к потребностям пользователя при генерации изображений). Цель - расширить языковой словарь модели таким образом, чтобы она связывала новые слова с конкретными темами, которые пользователь хочет генерировать. Для этого предлагается методика представления заданного субъекта с помощью редких токенов-идентификаторов и тонкуая настройка предварительно обученного фреймворка преобразования текста в изображение на основе диффузии. Тонкая настройка модели преобразования текста в изображение осуществляется с помощью входных изображений и текстовых подсказок, содержащих уникальный идентификатор, за которым следует название класса предмета (например, "A [V] dog").
Оглавление
Это иновационное решение, которое позволяет решить новую сложную задачу генерации изображений на основе субъекта. Для предотвращения явления, при котором модель ассоциирует название класса с конкретным экземпляром, предлагается использовать автогенную функцию потерь. Также данный подход позволяет решать множество новых задач: реконтекстуализацию, художественную рендеризацию, синтез новых представлений, модификацию свойств.
Авторы представили пример генерации изображения с несколькими входными изображениями на дополнительном контексте, получилось очень точно все воспроизвести. Был создан датасет, состоящий из 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,
)
Готово! °˖✧◝(⁰▿⁰)◜✧˖°
Оглавление