Обои для панельки
Двенадцать бесшовных узоров в технике японских трафаретов катагами. Только вместо журавлей и хризантем здесь вороны на проводах, чугунные батареи, спутниковые тарелки и коты на подоконниках. Узоры нарисовала Stable Diffusion XL: её научили резать катагами на 188 фрагментах музейных трафаретов XIX века.
С чего всё началось
В коллекции Метрополитен-музея лежит почти полтысячи японских трафаретов для ткани. Они называются катагами. Это несколько слоёв бумаги из волокна шелковицы, склеенных соком незрелой хурмы. Бумага от этого становится твёрдой, коричневой и не боится воды. Мастер вырезает в ней узор маленьким ножом, иногда тысячи отверстий на лист. Потом трафарет кладут на ткань, наносят через прорези рисовую пасту, и после окраски там, где была паста, остаётся белый рисунок.
Меня в катагами цепляют две вещи. Первая: узор всегда раппорт. Трафарет сдвигают по отрезу ткани шаг за шагом, и рисунок должен сходиться на стыке без шва. Вторая: мотивы. Это не придворная живопись, а то, что художник видит каждый день. Волны, бамбук, плющ, стрекозы, птицы на ветке, веер, рыболовная сеть, дождь.
Отсюда идея. Если бы мастер катагами жил в спальном районе, что бы он вырезал? Вороны на проводах вместо журавлей. Решётки батарей вместо бамбуковых шпалер. Ряды балконов с бельём вместо волн. Одуванчики, которые лезут сквозь асфальт, вместо хризантем.
А раз это раппорт, его можно напечатать на обоях, ткани и плитке. Так получилась маленькая коллекция для типовой квартиры.
Откуда трафареты
Все трафареты взяты из открытой коллекции Метрополитен-музея (Open Access). Музей отдаёт фотографии предметов в общественном достоянии под лицензией CC0: их можно использовать как угодно, в том числе для обучения моделей.
Как отбирались:
по запросу «stencil» API музея находит 970 предметов;
из них оставлены японские трафареты в общественном достоянии с фотографией;
у 693 предметов получилось прочитать описание (сервер музея ограничивает частоту запросов), из них подходящих 498;
превью скачались для 384, их хватает с запасом;
по контактным листам вручную отобраны 106 трафаретов.
Что не попало в выборку:
трафареты с надписями и иероглифами в узоре;
очень мелкие узоры, похожие на серую ткань, на фото их не разобрать;
сюжетные картинки: пейзаж с лодками, большая птица на весь лист;
трафареты, сфотографированные на чёрном фоне: так фон меняет смысл, и чёрное становится прорезью.
Фрагменты, на которых училась модель, с подписями
Фрагменты. Трафарет сфотографирован целиком: белый фон, вокруг узора широкие коричневые поля, на полях бирки и номера. Учить модель на этом нельзя, иначе она начнёт рисовать бирки. Поэтому скрипт сам находит область узора в два шага:
1. отделяет лист от белого фона;
2. внутри листа отделяет узор от полей: в узоре сквозь прорези просвечивает белый фон, а на полях нет.
Из вытянутого трафарета режутся два квадрата, из почти квадратного один. Каждый квадрат уменьшается до 1024×1024. Всего 188 фрагментов.
Подписи. Подписывать каждый фрагмент вручную долго, поэтому подписи собраны автоматически. CLIP сравнивает фрагмент со словарём из 32 традиционных мотивов катагами (волны, бамбук, хризантемы, плющ, стрекозы, веер, ромбы, сетка и так далее) и берёт один или два самых похожих. Подпись выглядит так:
> TOK katagami stencil, pattern of wisteria and small birds
Подписи вышли неточными. CLIP слишком часто видит «бамбук» в любом узоре из тонких параллельных линий: бамбук оказался в 64 подписях из 188, хотя на самом деле его в выборке заметно меньше. Для этого метода это не страшно. Подпись нужна, чтобы модель отделила мотив от стиля, а стиль всё равно уходит в новые токены.
Как модель училась резать трафареты
Модель здесь Stable Diffusion XL 1.0. Метод называется pivotal tuning, это комбинация двух приёмов
Новое слово. В словарь модели добавляются два новых токена, и . Сначала они ничего не значат. Во время обучения модель подбирает для них смысл: такой, чтобы по фразе katagami stencil получалась именно эта бумага, этот срез ножа, эта коричневая тонировка. Это textual inversion.
LoRA. Одновременно в слои внимания UNet добавляются маленькие обучаемые матрицы, как обычно.
Зачем оба сразу? Слово «катагами» SDXL знает, но понимает его как «что-то японское» и рисует то гравюру, то кимоно. Новые токены дают стилю своё имя, а LoRA доводит рисование до нужной точности. Первую половину обучения учатся и токены, и LoRA. Потом токены замораживаются (это и есть «pivot», поворот), и дальше учится только LoRA. Так LoRA подстраивается под уже готовое слово, а не перетягивает стиль на себя.
Скрипт официальный, из примеров diffusers: train_dreambooth_lora_sdxl_advanced.py. Две правки в нём:
скрипт при каждом промежуточном сохранении затирал токены одним файлом, а правка сохраняет их рядом с весами каждого этапа;
после обучения скрипт переводил весь UNet в fp32 прямо на видеокарте, и на T4 это падало с нехваткой памяти после всех 1200 шагов. Правка переносит UNet в оперативную память.
Отражение здесь включено, в отличие от фотографий: у узора нет правой и левой стороны.
Prodigy вместо привычного AdamW: для pivotal tuning это стандартный выбор. Prodigy сам оценивает подходящую скорость обучения, поэтому одна настройка (скорость 1,0) работает сразу и для токенов, и для LoRA. А у них очень разный масштаб: токен это один вектор, LoRA миллионы чисел.
Функция потерь шумит около 0,1 весь процесс, заметного падения нет. Так обычно и бывает при дообучении диффузионной модели: ошибка зависит в основном от случайного уровня шума на шаге. Пунктир на графике стоит на 600-м шаге, ровно на середине. На самом деле токены замораживаются чуть раньше, на 564-м: скрипт считает долю от целых проходов по выборке.
Шов, которого нет
Обои, ткань и плитка печатаются раппортом: один квадрат повторяется встык во все стороны. Обычная диффузионная модель рисует картинку с краями, и при повторе на стыке виден шов.
Приём, который это лечит, очень простой. У каждого свёрточного слоя в UNet и VAE есть отступ по краям: чтобы обработать крайний пиксель, слой берёт соседей, которых за краем нет, и подставляет вместо них нули. Если заменить нули на круговой отступ (padding_mode="circular"), слой вместо пустоты возьмёт пиксели с противоположного края. Для модели картинка становится тором: правый край продолжает левый, нижний продолжает верхний. Модель рисует узор, замкнутый сам на себя.
Число под картинками показывает, во сколько раз скачок цвета на стыке больше, чем обычный скачок между соседними пикселями внутри узора. С обычным отступом 32,5: шов виден сразу. С круговым 1,1: стык почти ничем не отличается от любого другого места.
Три попытки
Попытка 1: всё превратилось в хризантемы
Первая коллекция сгенерирована на финальных весах, после 1200 шагов. Фактура вышла отличная: коричневая промасленная бумага, белые прорези, чуть неровный нож. Но мотивы пропали. Батареи стали облаками, спутниковые тарелки цветами, самокаты листьями. Модель выучила катагами слишком хорошо: на любое слово отвечала тем, что видела в музее.



