Textual inversion — это не то, что ты думаешь (stable diffusion)

Textual inversion — это не то, что ты думаешь (stable diffusion)

На ютубе задали вопрос в комментариях, решил ответить подробно.

Что ты думаешь про текстовые инверсии? Как их лучше использовать? Вместо моделей или только с ними?

Начнем с конца

У нас есть модель (checkpoint) — это основа без нее ничего работать не будет.
Есть всякие так называемые экстрасети:

  • гиперсети (hypernetwork)
  • лоры (всякие LoRA, LoHA, LoCon, LyCORIS)
  • эмбеддинги (это не сети просто удачно пристроились к остальным)

Нет модели — нет генерации, так что используем только с моделью.

Если вы пользуетесь автоматиком, то эмбеддинги должны лежать в папке папка_с_автоматиком/embeddings.

Что такое текстовая инверсия? Немного теоретической части (без матана и программирования)

Процесс, когда мы учим модель называется тренировка, обучение (train).
В результате этого процесса мы получаем файл с моделью — чекпоинт (checkpoint)

Аналогично, когда мы создаем эмбеддинг этот процесс/метод называется текстовая инверсия (textual inversion), а в результате мы получаем наш файл с эмбеддингом (embedding)

Иногда, когда говорят "текстовая инверсия" подразумевают эмбеддинг, поэтому чтобы нам не путаться дальше я буду писать именно "эмбеддинг" (если вы знаете, что London is the capital of Great Britan, то можете посмотреть этот англоязычный видос в котором подробнее рассказывается что такое эмбеддинги и зачем они нужны; в целом очень крутой канал, если интересно, также можете посмотреть у них плейлист по computer vision и по нейросетям вроде тоже в плейлист собрано)

Эта штука называется текстовой инверсией не просто так. Если обычно (txt2img) мы пишем промпт и получаем картинку, то тут мы даем картинки которые хотим получить и просим модель сказать нам, что это за промпт должен быть, а она нам отвечает нужными цифрами.

Лучше воспринимать эмбеддинги как очень точный промпт и не более.
При этом, "точный" совсем не значит "правильный/красивый", это именно в математическом смысле точный.

Например, вы собрали кучу картинок на которых плохие руки, акцентировали на этом внимание при тренировке эмбеддинга и получили файлик. Если упростить, то этот файлик по сути является точно таким же словом как и другие слова в промпте. Именно поэтому они так мало весят - потому что это набор нужных слов, только напрямую в цифрах. И вместо того чтобы писать в негативном промпте bad hands, extra fingers и т.д. мы пишем наш эмбеддинг, который для нейросети становиться еще одним словом, типа "очень плохие руки, не надо так рисовать" — только заключенное в одном.

Textual inversion — это не то, что ты думаешь (stable diffusion)

При этом эмбеддинг очень сильно привязан к модели (точно также как и обычный промпт), поэтому рекомендую брать и использовать эмбеддинги с теми моделями, на которых они были сделаны. Хотя экспериментировать никто не запрещает, может получиться что-то интересное. Если еще учитывать тот факт, что основой для многих моделей служит всего парочка, так скажем "первоначальных" моделей (типо sd 1.4, 1.5 или слитая от novelai), то использовать одинаковые эмбеддинги между ними может быть вполне ок.

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

Что я думаю про текстовые инверсии?
Я думаю, что это крутая штука для воспроизведения желаемого результата из раза в раз, вместо плясок с промптом и кучи генераций.

Самое важное

Если вы и должны что-то запомнить из этой статьи, то вот что:

Текстовая инверсия не учит модель новому визуалу

Когда мы используем метод текстовой инверсии мы не изменяем модель, мы работает только с текстом. Если то, что вы хотите уже есть в модели, тогда у вас получиться сделать хороший эмбеддинг, иначе — нет.

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

Тут можно возразить, что допустим есть модель которая видела кучу людей, разве она не сможет собрав все свои знания о тысячах лиц нарисовать мое?
Во-первых, не встречав до этого такой красоты как ваша, ее не сможет повторить никакая нейросеть *подмигнул*
Во-вторых, тут противоборство двух сторон: нашей нейросети в башке, которая десятки тысяч лет училась считывать лица и та, которая существует пару лет. Мы с вами очень хорошо чувствуем в людях отклонение от чего-то нормального (хотя и нас можно обмануть), поэтому существует такое явление как зловещая долина (uncanny valley) и так как текстовая инверсия не учит модель новому визуалу, модель будет пытаться нарисовать не вас (потому что не знает как выглядите именно вы), а что-то похожее на вас. Тут сильно от модели и вашей внешности зависит, может получиться удачно, может нет. Я рекомендую не тратить на это время и сразу учить ту же LoRA — с нормальными настройками результат будет сильно лучше, а времени потратите +- столько же.

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

Честно, хз почему была такая мода учить все подряд через textual inversion.

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

Да и вообще, берете бумагу, открываете и в ней во вступлении, английским по белому написано:

Textual inversion — это не то, что ты думаешь (stable diffusion)

Используя всего 3-5 изображений предоставленного пользователем понятия, например, предмета или стиля, мы учимся представлять его с помощью новых "слов" в пространстве эмбеддингов замороженной (неизменяемой) модели text-to-image. Эти "слова" могут быть составлены в предложения на естественном языке, интуитивно понятным образом направляя процесс создания персонализированных творений. (сорян, как получилось, так и перевел)

Поэтому если вы используете текстовую инверсию чтобы научить модель чему-то новому — остановитесь

Textual inversion — это не то, что ты думаешь (stable diffusion)

На этом у меня все, надеюсь помог лучше понять что такое textual inversion. У меня есть телеграм, так что если хотите можете подписаться: https://t.me/mrreplicart и на ютуб периодически видосы заливаю https://www.youtube.com/@mrreplicart

Тем еще очень много, так что если есть предложения/вопросы - пишите, постараюсь разобрать. Как пример, иногда встречаю, как люди пишут/говорят, что "выключил VAE", "сгенерировал без VAE" или что "VAE — постобработка" и она "улучшает изображение".

Textual inversion — это не то, что ты думаешь (stable diffusion)
2424
5 комментариев

Здесь был пример использования эмбеддинга только для negative prompt, но это в обе стороны должно работать, я правильно понял из остальной части?
Насколько это похоже на то, что делает unprompted? Из текста я понял, что эмбеддинг собирает "слова" из картинок (то есть txt2img, только в обратную сторону), но сохраняет это как-то иначе, чем просто текст? Потому что не совсем понятно, что значит "напрямую в цифрах".
Я для unprompted использую poma (https://github.com/ZealousMagician/Ponymaster), но он просто достраивает prompt'ы из текстовых файлов, что там есть.
Пробовал ещё вот это: https://github.com/Siberpone/ponyverse , но оно, почему-то, при любых настройках на любой из полутора десятков моделей выдавала фигню какую-то.

Ответить

"это в обе стороны должно работать, я правильно понял из остальной части?" - да, использовать точно также как обычный промпт. Можно например натренировать на определенную одежду или стиль и писать в основном промпте "a photo of girl wearing наш_эмбеддинг" или "a painting in style of наш_эмбеддинг"

А вот с unprompted не совсем понял. Я им не пользовался, но насколько я понял, это что-то типа dynamic prompts, только еще круче? (https://github.com/adieyal/sd-dynamic-prompts) Если да, то это другое - там просто текст меняется.
Текстовая инверсия сидит глубже чем текст. У всех моделей есть отдельная часть которая занимается сопоставлением текста и картинки. Именно так модель и "понимает" как должно выглядеть то, что мы написали.

Но визуальных образов много, а слов сильно меньше. Приложил картинку как пример. Наверное, это все можно назвать "аниме", но у них у всех рисовка отличается, разные особенности, разные детали и тд. Для того чтобы точнее описывать что мы хотим есть эмбеддинги.

Мы пишем в промпте слова -> слова переводятся в токены -> токены переводятся в эмбеддинги. И у модели есть огромное количество этих эмбеддингов (пространство эмбеддингов), почти для всего (если не для всего) что есть в модели. Вот используя текстовую инверсию мы шерудим внутри текстовой части нашей модели и ищем подходящие эмбеддинги для наших картинок. А эмбеддинг это буквально набор чисел, поэтому так и написал.
Надеюсь получилось понятно объяснить)

1
Ответить