Фотография с Flickr от Ngangom Aomoa
Popinjay (Stibochiona nicea)
вид дневных бабочек из семейства нимфалид, обитающий в Азии (Индия, Таиланд, Гималаи). Отличается ярким окрасом: верхняя сторона крыльев темная (черная или темно-коричневая) с голубовато-зелеными, белыми пятнами и характерным металлическим отливом.Фотография с Wikipedia
датасет
Изучая материалы, которые я могла бы использовать в качестве базы данных для обучения нейросити, я наткнулась на большой архив фотографий различных бабочек и молей на сайте Kaggle.
Среди сотни видов я нашла такой окрас бабочки, что привлек мое внимание сразу же. Это была волшебная бабочка Popinjoy, что напомнила мне своими крыльями сказочное ночное озеро. Этот образ настолько сильно мне отозвался, что я решила взять именно его за основу.
Все материалы находятся в Public Domain (CC0), их можно использовать для обучения модели.
идея проекта
Этот проект представляет собой попытку воспроизвести уникальный и изумительный образ конкретной бабочки с помощью обучение генеративной нейросети Stable Diffusion методом DreamBooth LoRA.
подготовка среды
Этот блок подготавливает среду для работы.
Сначала удаляются все ранее установленные версии ключевых библиотек, чтобы избежать конфликтов между ними.
Затем устанавливаются строго зафиксированные совместимые версии:
diffusers—основная библиотека для работы со Stable Diffusion,
transformers—для работы с текстовыми энкодерами модели,
accelerate—для запуска обучения на GPU,
peft—реализует технику LoRA,
huggingface_hub—для загрузки моделей с платформы HuggingFace,
safetensors и datasets—для безопасного сохранения весов и работы с датасетом.
В конце выводятся установленные версии библиотек, чтобы убедиться что всё встало корректно. Версии зафиксированы намеренно, поскольку более новые версии этих библиотек несовместимы между собой и вызывают ошибки при обучении.
формирование датасета
Этот блок формирует датасет для обучения.
Сначала создаётся папка /content/my_dataset на диске Colab, куда будут сохраняться фотографии.
Затем открывается диалог выбора файлов с компьютера — загруженные фотографии проверяются на формат, принимаются только изображения JPG, JPEG, PNG и WEBP, всё остальное пропускается. Каждый принятый файл сохраняется в папку датасета.
В конце подсчитывается количество загруженных фотографий — если их меньше 10, выводится предупреждение, так как малое количество примеров негативно скажется на качестве обучения и модель не сможет достаточно точно усвоить визуальные характеристики объекта.
обучение модели
subprocess.Popen запускает скрипт обучения как отдельный процесс и открывает поток его вывода.
Далее в цикле построчно читается всё что скрипт выводит в консоль—если строка содержит Steps:, из неё с помощью регулярного выражения извлекаются процент выполнения, текущий шаг, общее количество шагов и значение loss.
На основе этих данных в одну строку выводится заполняющаяся полоса прогресса. Если в строке встречается слово Error, Saving или Traceback— она выводится отдельно как важное сообщение.
В конце process.wait () ждёт полного завершения обучения и сообщает об успехе или ошибке.
генерация новых изображений
Этот блок отвечает за генерацию новых изображений на основе обученной модели.
Сначала загружается базовая модель Stable Diffusion, поверх которой накладываются обученные LoRA, они содержат усвоенные визуальные характеристики объекта из датасета, после чего модель перемещается на GPU.
Затем задаются два промпта: основной со словом-триггером ppnjy указывает что нужно сгенерировать, негативный что генерировать не нужно, это улучшает качество результата.
После этого в цикле 6 раз запускается процесс диффузии. Модель за 30 шагов постепенно преобразует случайный шум в изображение, ориентируясь на промпт, каждый результат сохраняется на диск и выводится в ноутбук.
результат
В коде я указала генерацию 6 изображений. Большая их часть и правда может отобразить конкретный вид бабочки, однако другие примеры получаются отдаленными от примера.
Внизу я выбрала лучшие варианты из генераций.




