Тренировка датасета под хохлому - Apkawa/stable-diffusion-wiki-awesome GitHub Wiki

Дневникогайд. Все операции производятся на Debian/Ubuntu

Подготовка датасета

Собираем картинки

Смотрим чтобы изображения не были меньше 512х512

Затем удаляем дубликаты

findimagedupes -R -i 'VIEW(){ for f in "$@";do echo $f;done }' -- /path/to/dataset/ | grep .txt -v | xargs -r -n 1 -I {} rm {}

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

Подготавливаю структуру папок датасета в формате {dataset_name}/{repeats}_{instance_prompt} {class_prompt}.

В датасете есть еще и изображения с прозрачным фоном, поэтому проверю варианты с белым фоном и черным

khokhloma
|_ 10_khokhloma black_pattern
|_ 10_khokhloma white_pattern

Далее конвертируем изображения

Для белого фона

mogrify -resize 512x512 -format jpg -background white -alpha remove -alpha off -path "khokhloma/10_khokhloma white_pattern" /path/to/raw dataset/

Для черного фона

mogrify -resize 512x512 -format jpg -background black -alpha remove -alpha off -path "khokhloma/10_khokhloma black_pattern" /path/to/raw dataset/

Визуально проверяем что сконвертировалось без особых артефактов, неудачные удаляем

Разметка датасета

Есть несколько утилит которые помогут подготовить датасет

  • BooruDatasetTagManager - к сожалению она работает только в винде, под вайном и mono выдает ошибки. (в планах мб запилить кроссплатформенный аналог на расте, как раз нужная тулза будет)
  • stable-diffusion-webui-dataset-tag-editor - аддон для автоматика, им и воспользуемся

Для начала мы для всех изображений в датасете назначим:

khokhloma, traditional russian pattern

Далее либо заполняем вручную, либо воспользуемся автоматическим заполнением. Например, BLIP выдает a red and yellow floral pattern on a black background with a red background and yellow flowers on the bottom что пока что устраивает для первых экспериментов

В итоге для каждого изображения создается одноименный txt файл с содержимым вида

khokhloma, traditional russian pattern, a black and yellow floral pattern with red flowers on it's side and green leaves on the top

Обучаем LoRa

Для начала пробуем обучить LoRa как самый быстрый способ. Используем bmaltais/kohya_ss

  • Базовая модель - sd-v15-pruned-emaonly
  • Lora Type - Standard
  • Epoch - 20, сохраняем каждые 5 эпох
  • network rank (dim) - 32
  • network alpha - 16
  • train batch size - 1 (больше не получается для 6Гб ноутбучной видеокарты, сваливается в ООМ)
  • save_precision, mixed_precision - fp16
  • learning rate - 0.0001
  • LR scheduler - cosine
  • Optimizer - AdamW

Обозначения

Для введем сокращенную запись основных параметров в тексте: n{network rank}a{network alpha}e{epoch}

Например: n32a16e3

Общий шаблон именования модели:

{subj}_{base_model}_n{network rank}a{network alpha}

(хорошо было бы если оно само бы автоматом подставлялось, а то постоянно забываешь переименовать и возникает путаница)

Тестирование

Вручную

Выбираем подходящий промпт, например:

(masterpiece), (high detail),(ultra-detailed), featuring flowers and circles, blue background, multiple scattered and arranged flowers, blue and red and yellow and green color scheme, with square symmetrical composition,(1girl,white hair), khokhloma, traditional russian pattern
Negative prompt: ng_deepnegative_v1_75t, EasyNegative
Steps: 20, Sampler: Euler a, CFG scale: 7, Seed: 793734237, Size: 512x512, Model hash: 61e23e57ea, Model: mixProV4_v4

Тыкаем в нужную lora, устанавливаем силу в 0.7 и смотрим что вышло.

Делаем матрицу

Делаем матрицу для оценки работы lora и выбора подходящей модели

  • Нужно иметь расширение sd-webui-additional-networks
  • В настройках расширения не забудьте указать путь к Lora

Открываем Additional Network и указываем все наши lora, в том числе и промежуточные, но не включаем

Включаем скрипт X/Y/Z plot, выбираем AddNet Model 1, нажимаем кнопку рефреш и дописываем None AddNet Weight 1 пишем 0.3-1.1 [5] --- перебор от первого числа до второго, 5 чисел.

SPOILER

image

Получаем вот такую матрицу:

SPOILER

photo_2023-04-11_16-26-55


Можно еще проверить на multiple scattered and arranged flowers, featuring flowers and circles, black background, black and red and yellow and green color scheme, (masterpiece), (high detail),(ultra-detailed), (khokhloma:1.1), traditional russian pattern и включеным tiling

SPOILER

photo_2023-04-11_16-27-42

Тут мы видим что самая оптимальная лора оказалась на 5 эпохе, 5 эпох*10 проходов*89 изображений=4450 шагов оптимизации. Выше уже оказались перетренированы. Удаляем остальные лоры кроме 5, остальные плохие получились.

Ищем оптимальные параметры LoRa


Следующий вариант пробуем сохранить от 1 до 7 эпох, возьмем другие значения сети, остальные значения не трогаем

  • network rank (dim) - 32
  • network alpha - 32
SPOILER

image

multiple scattered and arranged flowers,  featuring flowers and circles, black background, black and red and yellow and green color scheme, (masterpiece), (high detail),(ultra-detailed), (khokhloma:1.1), traditional russian pattern
Negative prompt: ng_deepnegative_v1_75t,  EasyNegative
Steps: 20, Sampler: DPM++ 2M Karras, CFG scale: 7, Seed: 2806774085, Size: 512x512, Model hash: 9aba26abdf, Model: deliberate_v2
SPOILER

image

(masterpiece), (high detail),(ultra-detailed), featuring flowers and circles, white background, multiple scattered and arranged flowers, black and red and yellow and green color scheme,  with square symmetrical composition,(1girl,white hair), (khokhloma:1.1), traditional russian pattern
Negative prompt: ng_deepnegative_v1_75t,  EasyNegative
Steps: 10, Sampler: DPM++ 2M Karras, CFG scale: 7, Seed: 2006828274, Size: 512x512, Model hash: 61e23e57ea, Model: mixProV4_v4
SPOILER

image

(masterpiece), (high detail),(ultra-detailed), featuring flowers and circles, white background, multiple scattered and arranged flowers, black and red and yellow and green color scheme, with square symmetrical composition,(1girl,white hair), (khokhloma:1.1), traditional russian pattern
Negative prompt: ng_deepnegative_v1_75t, EasyNegative
Steps: 20, Sampler: DPM++ 2M Karras, CFG scale: 7, Seed: 2534330414, Size: 512x512, Model hash: 6ce0161689, Model: v1-5-pruned-emaonly

Делаю вывод что 2 эпоха наиболее оптимальная

При повышении силы выше 1 картинка не разваливается и все еще остается нормальной. В данном примере использовалась сила 1.7

image

1girl, reading book under tree, flowers  and berries, black background, full body portrait , (khokhloma:1.5), traditional russian pattern,    <lora:khokhloma_sd15_s64_v1.1-000002:1.7>
Negative prompt: EasyNegative,Doge comics,blush,doge,Doge comics

Steps: 30, Sampler: DPM++ 2M Karras, CFG scale: 7, Seed: 677295882, Size: 512x512, Model hash: 61e23e57ea, Model: mixProV4_v4

  • network rank (dim) - 64
  • network alpha - 32
  • Optimizer - Adafactor - без этого параметра модель получается битой с loss > 1

Вывод - оптимальная модель - вторая эпоха, выше смотреть нет смысла.

SPOILER

xyz_grid-0008-677295882

1girl, white hair, reading book under tree, flowers and berries, black background, full body portrait , (khokhloma:1.5), traditional russian pattern
Negative prompt: EasyNegative,Doge comics,blush,doge,Doge comics

Steps: 20, Sampler: DPM++ 2M Karras, CFG scale: 7, Seed: 677295882, Size: 512x512, Model hash: 61e23e57ea, Model: mixProV4_v4

  • network rank (dim) - 64
  • network alpha - 64
  • Optimizer - Adafactor - без этого параметра модель получается битой с loss > 1. + OOM

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

SPOILER

image

1girl, white hair, reading book under tree, flowers and berries, black background, full body portrait , (khokhloma:1.5), traditional russian pattern
Negative prompt: EasyNegative,Doge comics,blush,doge,Doge comics

Steps: 20, Sampler: DPM++ 2M Karras, CFG scale: 7, Seed: 677295882, Size: 512x512, Model hash: 61e23e57ea, Model: mixProV4_v4

  • network rank (dim) - 128
  • network alpha - 128
  • Optimizer - Adafactor - без этого параметра модель получается битой с loss > 1. + OOM

Натренировать не удалось, не хватает VRAM

Пробуем другие типы LoRa

LoCon

  • network rank (dim) - 32
  • network alpha - 1

Остальные параметры те же

SPOILER

image

2 и 3 выглядит интересно и трудно отдать предпочтение каждой из них.


  • network rank (dim) - 16
  • network alpha - 0.3

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

SPOILER

image

LoHa

Запустить не удалось, все время упирается в нехватку vram

  • network rank (dim) - 4
  • network alpha - 1
  • Learning rate - 0.005

Остальные параметры те же

Финальная битва

Полуфинал

SPOILER

image

Выводы следующие:

  1. Наиболее предпочтительная модель - SD1.5 pruned. Остальные не очень. Большие надежды возлагал на anyLora.
  2. Обычная LoRa лучше всего получается с параметром n32a32 (в названии закралась ошибка). С понижением network alpha до 16 теряются детали. Попробую еще n64a32 и n64a64
  3. LoCon в основном сохраняет стилистику но не сам узор, трудно отдать предпочтение, но наиболее близкая по духу получается n32a1e2

Выкидываем все попытки с другими моделями, оставляем SD15 и обучаем еще с другими параметрами выше dim 32


SPOILER

xyz_grid-0010-677295882

Textual Inversion (TI)

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

  • Token string - khokhloma
  • Init world - khokhloma, traditional russian pattern, russian folk pattern
  • Vectors - 42 (на самом деле хз как правильно считать вектор)
  • Template - style template
  • Epoch - 20

Остальные параметры такие же

Ссылки

⚠️ **GitHub.com Fallback** ⚠️