Исходный размер 1142x1602

Сказка про будни

Идея проекта

Иван Билибин придумал, как выглядит русская сказка в книге: узорные рамки, четкий черный контур, плоская акварельная заливка, ели, терема, сарафаны. Его иллюстрации к «Царевне-лягушке» многие помнят с детстваМне стало интересно, можно ли этим, используя этот стиль, рассказать про обычный день. Я дообучила Stable Diffusion XL на иллюстрациях Билибина и сделала серию «Сказка про будни»: Иван-царевич развозит заказы на самокате, Василиса работает ночью за ноутбуком, богатыри ждут автобус под дождём, Царевна-лягушка делает селфи на кувшинке

big
Исходный размер 1000x1200

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

Ноутбук основан на учебном примере DreamBooth LoRA и официальном скрипте Diffusers— Учебный ноутбук курса
— Официальный скрипт SDXL DreamBooth LoRA
— Документация Diffusers по DreamBooth

Исходный размер 3046x1060

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

Билибин никогда не рисовал самокаты, ноутбуки и автобусные остановки. Поэтому по таким сценам хорошо видно, выучила ли модель саму манеру. Если курьер на самокате похож на иллюстрацию из книжки, значит, получилось

Датасет

Для обучения я взяла 28 иллюстраций Билибина к сказкам «Царевна-лягушка», «Марья Моревна», «Пёрышко Финиста Ясна Сокола», «Белая уточка», «Сестрица Алёнушка и братец Иванушка», «Сказка о золотом петушке», «Сказка о рыбаке и рыбке» и «Иван-царевич, жар-птица и серый волк»Билибин умер в 1942 году, его работы перешли в общественное достояние. Все файлы я скачала с Wikimedia Commons, ссылка и лицензия каждого записаны в таблицу dataset_sources.csv

Обучающая выборка: 54 кадра из 28 иллюстраций Билибина

С каждого скана я срезала поля и разрезала лист на два квадрата: высокий лист на верхнюю и нижнюю половины, широкий на левую и правую. Так сохраняется больше композиции, чем при обрезке по центру, и кадров становится в два раза больше. Почти квадратные листы я обрезала по центру. Из 28 листов получилось 54 кадра 768×768

Исходный размер 1294x960

Схема нарезки

Подписи к кадрам сделала модель BLIP. В начало каждой подписи я добавила слово-триггер bilibinstyle, в конец описание манеры. Пример: «bilibinstyle, an illustration of a man riding a horse through a forest, Russian fairy tale book illustration, ornamental border, crisp black ink outlines, flat watercolor colors». Описание манеры повторяется во всех подписях, поэтому модель связывает её со словом bilibinstyle

Исходный размер 1500x900

Вся выборка

Описание процесса обучения

Модель: Stable Diffusion XL base 1.0 + LoRA (метод DreamBooth), официальный скрипт train_dreambooth_lora_sdxl.py из библиотеки Diffusers, Google Colab, GPU Tesla T4

Исходный размер 726x826

Параметры: размер 768 px, батч 1, 600 шагов, learning rate 1e-4, fp16, 8-битный Adam и gradient checkpointing, чтобы уложиться в память бесплатной видеокарты. Обучение заняло 24 минуты, loss к концу опустился до 0,01

0
1/4

Что пошло не так. Первый запуск упал: старая библиотека torchao в Colab конфликтовала со свежей версией peft, её пришлось удалить. Wikimedia не отдавала картинки при частых запросах, поэтому я добавила паузы и повторные попытки. Первые генерации я делала в 1024 px, и модель повторяла сюжет по нескольку раз в кадре, картинка превращалась в узор. Модель училась на 768 px, поэтому и серию я генерировала в этом размере

Результирующие изображения и их анализ

Сила LoRA: 0, 0.5, 0.9
Сначала я проверила, что даёт обучение. Промпт про курьера на самокате в берёзовом лесу и seed одинаковые, меняется только сила LoRA. При 0 рисует обычная SDXL, картинка похожа на комикс. При 0.5 линия становится графичнее. При 0.9 картинка ближе всего к Билибину: приглушённая охра и зелень, ритм стволов, графичная трава. Разница заметна не сразу, потому что слова про книжную иллюстрацию в промпте уже стилизуют базовую модель. Характерная линия и палитра появляются только с LoRA. Для серии я взяла силу 0.9.

Исходный размер 1536x568

Сравнение результатов

Исходный размер 3152x1584

Результат

В серии «Сказка про будни» восемь сцен. Герои взяты из тех же сказок, что и в датасете, и заняты современными делами. Иван-царевич развозит заказы на электросамокате через еловый лес, Василиса Премудрая работает ночью за ноутбуком, Избушка Бабы-яги стала пунктом выдачи посылок, Жар-птица светится над ночным ларьком, Царевна-лягушка делает селфи, Золотой петушок сидит на вышке сотовой связи, три богатыря ждут автобус под дождём, а Серый волк везёт Ивана с царевной через ночной городВсе промпты устроены одинаково: слово-триггер bilibinstyle, сюжет и та же фраза про манеру, что и в подписях датасета. В негативный промпт я поставила фото, 3D и размытость, чтобы картинка оставалась рисованной

Исходный размер 768x768

Что получилось. Манера считывается во всех кадрах: чёрный контур, плоская заливка, приглушённая охра с зеленью, ритмичные стволы деревьев, узорные ткани. Лучше всего вышли сцены, где современный предмет крупный и простой по форме: ноутбук у Василисы, самокат у курьера. Они нарисованы тем же контуром и теми же цветами, что и окружение, и хорошо вписываются в сцену

Что не получилось. Модель тянет сюжет обратно в сказку (хотя, в то же время это и плюс). Пункт выдачи посылок превратился в деревенскую ярмарку у избушки, Серый волк в одном кадре стал конем, так как в датасете много всадников, и модель выбрала привычное. Заметнее всего проблемы с анатомией: руки, пальцы и лица съезжают, особенно когда людей в кадре много. Орнаментальной рамки, главного приёма Билибина, нет ни в одном кадре. Скорее всего, дело в нарезке, так как лист делится на два квадрата, рамка разрезается, и модель почти не видит её целиком

Исходный размер 768x768