Тренировка нейросети (textual inversion): первые попытки. Фуррятина, боди-хоррор и потому (18+)

Автор: wayerr

Так как не очень понятно что делать с этими всеми нейросетями (stable-diffusion) если надо сделать неописуемое сходство с персонажем. А персонаж неописуем цензурными словами. Ну например это какой зверолюд с хитрым оружием и всем прочим.

Т.к. у меня был референс, который я сам рисовал в 3d (потому он не идеален, мягко говоря). Вот:

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

Потом я чуть перекрасил модель, чтобы она выглядела так:

Первые попытки была просто списком картинок общего плана. Вторую я чуть поменял, решив дать каждой картинке описание (SD может это сделать автоматически, но в моём случае очевидно, бредит). Выглядит это примерно так:

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

Далее задал initializing text. Подозреваю в нём и ошибка, т.к. модель быстро решила что у меня 3d из конца 90х и натренировалась в эту сторону (придётся потом это переделывать, а пока приходится в negative prompt обильно вычищать всё что может быть с этим связано).

Вот неправильный пример, как создавался embedding (скрин из stable-diffusion-webui):

Initialization text по идее лучше сначала прогнать на той модель для которой делается embedding - и подобрать так чтобы он примерно соотвествовал тому что надо. Хотя в инете некоторые просто оставляют * - мол нейросеть догадайся сама, может она и догадается, а может и нет.

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

Потом перехожу на вкладку Train.

По идее картинки надо сначала подготовить, обрезать в квадраты 512 пикселей и всё такое, для этого есть вкладка "preprocess images", но она глючит на png  с прозрачностью, а прозрачность нужна чтобы нейросеть игнорировала фон. Потому я картинки заранее рендерил квадратными и потом отресайзил скриптом (рендерил размером побольше, чтобы избежать шумов).

Настройки Train простые:

Learning rate  я подглядел в сети, но чуть поднял, поскольку мне показалось что с малым значением оно не хочет толком сходиться, так что не факт что это хорошие значения.

Batch и Accumulation steps - ускоряют процесс, на реддите кто-то замерял даже. Но у меня отчего-то больше двух не влезает в 8гиг видяхи, скорее всего какой-то баг, так как должно влезать 4-6 штук судя по постам в сети.

Важно указать верный prompt template - т.к. я тренирую сеть не для стиля, а для объекта. Тут выбран тот что будет подставлять соотвествующие запросы при обучении и добавлять текст из имени файла. В файле, кстати, мелькало слово "render of" - возможно, оно мне тоже подгадило.

Галочка "use png alpha channel" - мне нужна т.к. рендеры именно с прозрачностью. 

Ну и настроил сброс картинок каждые 100 шагов - по ним видно как и чему учится сеть. 

Read parameters from txt2img - позволяет задать пример, который будет заведовать этими самыми картинками. Без него оно может использовать разные тексты и будет сложно оценить как меняется сеть.

Надо отметить, некоторые пишут, что надо учить на базовой модели (в данном случае stable-dffusion-v1.5) даже если планируется потом использовать иную (которая есессно на базе той построена). В данном случае я тренировал на базовой и в принципе вот на deliberate (надо будет ещё что-то поискать) оно работает.

Вот результат предпоследней тренировки (она же первая полная, перед ней кучу тренировок я прерывал заранее):

Верхняя строка - после 4500 шагов, нижняя после 20000 шагов. Результат ощутим, но кажется лишние шаги оказались лишними.

Суммарно двадцать тысяч шагов это заняли около 20часов, запускалось в docker под linux на amd rx6600m 8Gb (ноутбучная видяха в дискретном исполнении с алиэкспресса). Ночью шум компа почти не слышен, если что (хотя не всем владельцам этих видях так повезло).

Результат очень далёк от ожидаемого, поскольку embedding оказался совершенно не гибким, т.е. добавить иную одежду или фон оказалось практически невозможно. Кроме того оно слишком тридешное, как видно.

Потому я сделал ещё один заход, чуть подправив подозрительные места. В первую очередь я снизил "numbers of vectors per token" до 2х (и скорее всего это всё равно оказалось много, возможно потому что у меня много токенов в initilizing text - лень смотреть исходники). Изменил и текст на: "anthro wolf-husky wolf-woman furry, black hairs bob-cut, wears leather skirt and top, curled husky-tail, anthro-furry art, cinematic photorealistic character concept art, intricate details, professional photography" (это скорее всего неправильно, так что за пример не берите).

Запустил я это дело на 5тыс шагов (всё также на базовой модели) и потом проверил на deliberate:

Как видно, при тех же исходных данных (т.е. исходные изображения не менялись), но другом подходе результат значительно отличается. Оно менее тридешное, более реалистичное и как оказалось гибче. Хотя всё равно не так как хотелось бы.

Вот для примера один из результатов (там изрядный negative prompt потребовался):

<aska_anna_v2>-witch with blue-eyes with black bob-cut in mantle-cloak-robe of mage, (furry fluffy fuzzy skin),  winter forest background, head shot, anthro art, epic detailed cinematic fantasy concept art, intricate details, masterpiece art
Negative prompt: cartoon, animation, game, statue, faux_fur, artificial_fur, nipples, earrings, lowres, text, cropped, worst quality, low quality, jpeg artifacts, signature, watermark, username
Steps: 30, Sampler: DPM++ 2M Karras, CFG scale: 8, Seed: 258964787, Size: 512x512, Model hash: 10a699c0f3

Здесь "aska_anna_v2" - это какраз название embedding, так как у меня их уже не один, то оно отличается от того что на скриншоте выше.

На некоторых примерах оно понимает что winter forest не должен иметь зелени, но например сделать ночной лес уже крайне сложно - модель "впечатала" именно день, также как сложно сделать рисунок, а не рендер или что-то фотореалистичное. Т.е. embedding недостаточно гибкий получился. (И глаза не голубые, к слову.)

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

+45
694

0 комментариев, по

2 345 425 206
Наверх Вниз