Винни Пух и тонкая настройка нейронных сетей в домашних условиях

Здесь в Кракове выходные прошли не зря. По просьбам читающих, рассказал, как тренировать свои стили в FLUX.1 Dev. Replicate для этого — идеальная платформа, ничего сверхсложного не понадобится.

Задача: как научить нейронную сеть генерировать картинки в моём, каком надо уникальном стиле?

Что вообще значит «научить»? Как вообще получаются картинки в нейронной сети?

То, как я понимаю процесс в целом: начинается всё с шумного изображения, в котором буквально ничего нет, нет ни одной явной, выделяющейся характеристики. Потом в зависимости от текстового запроса (промпта) пикселы перекрашиваются, чтобы больше подходить под «образ», собранный на основе параметров нейронной сети. Язык, исходный запрос — определяют эти параметры. В модели зашито то, как она представляет текст в изображениях. Через пару десятков итераций пикселы приобретают форму и становятся похожи на что-то осознанное.

Файн-тюнин, точная подстройка — это по сути изобретение нового символа, нового слова, создание триггера, чтобы в выдаче появилось что-то похожее на желаемое. Вы буквально добавляете в лексикон нейроннной сети новый образ. Легко визуализировать этот процесс так: вы показываете маленькому ребёнку, который ещё не умеет говорить, мол, это зебра, зеб-ра. И после спрашиваете: нарисуй зебру? Как умеет, ребёнок рисует полосатое нечто, по памяти, как понял. Если без вашего ведома кто-то показывал на улице дорожный переход и тоже называл это зеброй, то есть шанс, что дитя нарисует белые полосы на асфальте, а не африканское животное.

Текущее состояние мира нейронных сетей лишь имитирует работу невероятно сложного человеческого мозга. Компьютеры тратят кучу сил (буквально энергии в виде тепла), чтобы выдать что-то не ужас-ужас какое кошмарное.

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

Покажу, как это работает на примере. Например, мне нужен стиль, который по кодовому слову p00h стилизует изображение под старинные иллюстрации из книг о «Винни-Пухе».

Кодовое слово лучше всего выбирать уникальное: p00h, PREINSTA – хорошие примеры. GLITCH – плохой пример: это слово скорее всего уже завязано на какие-то стили в существующей модели. Наша цель, сбить её с толку и скормить свои понятия.

Как нейронная сеть учится? Механизмы гибридные и часто очень запутанные. Однако, если совсем просто описывать, то выйдет так, что с одной стороны язык разбирается на понятия, потом из этих понятий собирается картинка. В чём-то похоже на игру в «Категории» наоборот. Задача нейронной сети — угадать, что имел в виду пользователь, показав ему картинку.

Представьте, будто бы взрослый помогает ребёнку рисовать зебру: «Зебра это кто? Зверь, правильно. У неё сколько ног? Три? Не, подумай получше. Четыре! Верно. А хвост есть? Вот, молодец. Получается похоже».

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

Лучше всего отдавать набор изображений и текстовый файл с описаниями, что в них. Каждое описание должно содержать новый термин. Так с большой вероятностью, если вы не запутали нейрокомпьютерного ребёнка и не смешали понятия, он сможет нарисовать именно вашу «зебру» с копытами и хвостом, а не дорожный переход.

Опишу приблизительно, как шёл к успеху с идеей про «Винни-Пуха».

Подготовка изображений

Я написал скрипт, который «смотрит» на страницы PDF, находит там картинки и потом обычными средствами numpy / tesseract / tika вырезает изображения, и собирает их в отдельной папке.

Придумал, что мой стиль, мой новый термин будет называться p00h — как «Winnie-the-Pooh» с двумя нолями в середине слова для уникальности.

Я поленился, поторопился и не делал ручное описание каждой картинки. Ппонадеялся на автоматическое самоописание — его делает Replicate, ведь есть куча дешёвый нейросетей, способных «увидеть», что в картинки и описать по темплейту. Уверен, что в ручном режиме или с помощью умной сети вроде Claude Sonnet можно было сделать лучше. Это, кстати, буквально то, в чём сейчас скрыт секрет нейронных сетей, работающих, как магия.

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

Выбор модели

Replicate предоставляет инструмент для тренировки, там по сути нужно заполнить не очень длинную около-техническую форму.

Выберите существующую модель в качестве назначения или создайте новую, введя название в поле выбора модели. В нашем случае это FLUX.1 Dev и pooh, чтобы ссылка была красивая.

Загрузка данных

Это простая часть. Просто закиньте ZIP-файл с вашими картинками данными в поле input_images. Меньше 10 не рекомендуется, больше 1000 не обязательно. Говорят, достаточно 100-300, чтобы потом можно было стиль включать по желанию. Я использовал 551.

Настройка параметров

Установите параметры для обучения. Я начинающий, не разбираюсь — выбрал по-умолчанию. У всех параметров есть свои описания, в них что-то советуют, можно всегда копнуть глубже.

Теперь можно запускать тренировку и смотреть на подробное описание процесса.

Смотрю логи… С первого раза не получилось. Почему? Говно входит, говно выходит: в папке с картинками оказались какие-то слишком мелкие изображения, прочистил свой исходный набор, пришлось тренировать заново. Обращу внимание, что пропорции изображений тоже влияют на точность попадания в стиль. Если вы, например, тренируете людские портреты — отдавайте картинки 2×3 или 3×4, портретный формат.

Очистил исходные данные, запустил заново. На входе 551 картинка в стиле иллюстраций Винни Пуха. Жду приблизительно 20 минут пока replicate считает, смотрю на тонны служебной информации в логах: 

Видно, как искусственний интеллект пишет описания. Не идеально, без искры человеческого разума, но как-то пишет. Ещё раз напомню — это именно то место, где можно улучшить качество результатов: аккуратно проверить описания, выверить, чтобы не повторялись объекты, чтобы не было противоречий (Тигра полосатый не назывался котом, например).

Со второго раза получилось. Бежим скорее пробовать!

Я спросил p00h, two cats talking — вот они, мои милые кошечки, болтают (см. картинку в начале поста).

Я спросил: p00h, a European book illustration of a bear with bottle of lemonade

Я спросил p00h, rabbits playing with bricks in style of p00h

Можно стилизовать существующие картинки, но это отдельная песня. Изображение идёт в довесок к текстовому описанию. Похожесть по-умолчанию ниже, чем из текстов. Потому что сложнее склонить нейронную сеть к своему стилю, слишком много данных, мысли и понятия разбегаются.

В форме создания новых картинок можно подкручивать параметр lora_scale для усиления эффекта, но от него сетку чаще всего корёжит, будьте осторожны. Например, тигр и медведь играют в шахматы.

Примерно так получилось научить нейронную сеть слову p00h, которое означает стиль рисунков из книг о Винни Пухе. Стоило это удовольствие меньше $5 долларов. Они ушли на описание исходного набора изображений прежде всего.

Попробовать Pooh-генератор можно здесь: https://replicate.com/sliday/pooh

P.S.: Всякое такое и подобное — пишу в ИИзвестия пока регулярно, пока интересно.

Комментарии

 

Добавить комментарий прямо сейчас