Идея проекта
Когда мне было 8 лет, мне подарили большую двухметровую голубую змею, мягкую игрушку. Я назвала его Кудав. С тех пор это моя любимая игрушка детства, и я решила, что его нужно увековечить в цифровом пространстве, чтобы он всегда был рядом. Для реализации этой идеи я решила использовать технологию обучения генеративной нейросети Stable Diffusion, чтобы она могла точно создавать различные изображения с Кудавом
Почему Кудав — уникальный и неповторимый объект для обучения нейросети
фото Кудава
Несмотря на то, что Кудав выглядит как обычная голубая игрушечная змея, у него есть несколько особенностей. Во-первых, у него на спинке темно-синие пятнышки, во-вторых, однажды после стирки его язык внезапно раздвоился, и теперь он живет с двумя языками. В третьих, когда-то, опять же после стирки, папа повесил его не бельевые веревки сушиться, но наполнитель внутри Кудава сбился, разделив тело змеи на части. Теперь он может неестественно выкручиваться
Процесс обучения модели
Для обучения нейросети нужен датасет с изображениями Кудава. Я провела ему небольшую фотосессию, и затем скадрировала все изображения до формата 1:1 и уменьшила вручную их все до размеров 1024×1024 пикселей. При создании фото я старалась показать Кудава в разных позах, но при этом сохранить акцент на его неповторимой мордочке. В итоге в датасете было собрано 76 фотографий змейки
Примеры фото Кудава в датасете
часть собранного датасета
[ Шаг 1 ]
Далее я перешла в среду программирования Kaggle, и импортировала туда исходный ноутбук с кодом для обучения Stable Diffusion XL по технологии LoRA. Затем подключила ускоритель GPU P100 и подключила ноутбук к сети интернет. Следующим шагом я установила все необходимые библиотеки — bitsandbytes и diffusers, а также специальный скрипт для обучения модели
Подготовка к обучению модели
[ Шаг 2 ]
На этом этапе я, во-первых, загружаю собранный датасет с Кудавом в Kaggle и проверяю, все ли правильно загружено. Во-вторых, я создаю директорию и копирую туда все файлы из датасета, и снова же перепроверяю, что все правильно работает
Создание директории
Работает!!!
[ Шаг 3 ]
Далее я генерирую промпты к картинкам, чтобы нейросеть могла прочитать, что находится на фото. Для этого загружаю модель BLIP и запускаю функцию caption_images, которая описывает каждую фотографию Кудава из датасета и создает к ним описания. Все записывается в переменную imgs_and_paths, где создается этот список изображений с подписями. Далее список собирается в файл, где к каждой подписи теперь добавляется префикс «a photo of KUDAV snake», который отвечает за то, чтобы модель впоследствии при генерации своих картинок ссылалась конкретно на Кудава. В конце удаляю эту модель из памяти, чтобы освободить место
Процесс создания промтов к фотографиям из датасета с помощью модели BLIP
Пример результата 3 шага
[ Шаг 4 ]
На этом этапе для начала нужно сконфигурировать скрипт accelerate, чтобы можно было в итоге сохранить модель на портал Hugging Face. Далее на этом портале я создала токен с правами записи и чтения, который ввела в ячейке кода в ноутбуке, и можно запускать обучение
Подключение к Hugging Face
[ Шаг 5 ]
Перед запуском обучения нужно установить библиотеку datasets, а затем настроить параметры в запуске команды accelerate: название датасета — kudav, директория с моделью — kudav_snake_LoRA, кодовый промт — a photo of KUDAV snake.
В первом варианте обучения я поставила разрешение 1024, как мои фото, с максимальным количеством шагов обучения — 1000 и чекпоинтом на 512 шаге. Всего процесс обучения должен был занимать около 7 часов, однако, к моему сожалению, после 5 часов работы модели случился сбой, и мне пришлось начинать обучение заново.
Второй раз я запустила обучение уже в разрешении 512, общим числом шагов также в 1000 и чекпоитами уже после каждого 125 шага, чтобы можно было посмотреть как обучается модель на разных этапах. Но в моем ноутбуке все постонно ломалось, так что я сделала очень много попыток обучить нейросеть.
В итоге у меня было разрешение 512 с количеством шагов 500 и обучение модели заняло около часа.
Установка библиотеки datasets
Параметры обучения модели
Первая (сорвавшаяся) попытка
Процесс обучения во время второй — n-ной попыток
Итоговые параметры
проверяем директорию с обученной моделью
загружаем модель на Hugging Face
загружаем нашу модель для генерации изображений
Результат
Обученная модель достаточно четко схватывает черты Кудава. Его мордочка, цвета, язык и тело можно явно распознать на изображениях.
В итоговых генерациях заметно, что модели не хватает 500 шагов, чтобы безошибочно улавливать черты Кудава. Однако применение негативного промта и более подробного описания все же позволяют нейросети понять запрос. У Кудава пропадают ненужные головы и листья становятся более похожими на листья
простая генерация
более подробная генерация с применением негативного промта
Также хочу добавить, что я доходила до этапа генераций изображений при обученной модели на 1000 шагов, к сожалению в череде бесконечных ошибок Kaggle у меня не сохранились результаты генераций. Но модель работала хорошо, Кудав был невероятно похож на себя, однако нейросеть очень искажала его тело, неестественно выгибая и добавляя его язык куда только может.
Как только я прописывала негативный промт, изображения становились гораздо лучше и все ненужные артефакты пропадали, показывая точный портрет Кудава
Следовательно стоить сделать вывод, что получившейся итоговая модель хуже промежуточного неудавшегося варианта, и для обучения следует ставить 1000 шагов
Описание применения генеративной модели
Stable Diffusion XL — обучаемая в проекте модель, используется для генерации итоговых изображений
BLIP — для написания промтов к фотографиям из датасета
Ghat GPT (https://openai.com/chatgpt/overview/) — помощь в решении сложностей и исправлении непонятных ошибок
Также прикрепляю по этой ссылке 2 ноутбука — первый с названиям проекта — это итоговый код. Второй — это мой многострадальный первый вариант, где было обучение на 1000 шагов, и там почему-то удалились все итоги запущенных ячеек




