Original size 1140x1600

Обучение генеративной модели Stable Diffusion на фотографиях неба

PROTECT STATUS: not protected
3

Рубрикатор

1. Концепция 2. Порядок выполнения работы 3. Результат 4. Выводы

Концепция

Я не хотела брать для создания нейросети чей-то стиль работ, поскольку это идет вразрез с моими моральными устоями. Поэтому предпочла делать «второй вариант» генерации, то есть тренировать нейросеть на фотографиях, как было сделано с собакой в примере из лекции. Вернее, там было упомянуто, что так тоже можно.

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

Поэтому я условно разделила исследование на два критерия: 1. Цветовая гамма генерируемых изображений 2. Генерация объектов, косвенно присутствующих на фотографиях

Базу данных — то бишь фотографии — я взяла из открытого источника (с сайта images.cv), отбраковав неподходящие: с надписями, вытянутые, с наложенными фильтрами. Для своих задач я выбрала фото заката — в оранжевой гамме; и фото гроз — в фиолетовой.

Пример картинок из использованного датасета. Гроза в фиолетовых тонах

Пример картинок из использованного датасета. Закат в оранжевых тонах

Пример картинок из использованного датасета. Несколько картинок с экспериментальными цветами. Таких было использовано мало

Порядок выполнения работы

Началось все со среды программирования. Изначально я хотела работать в Kaggle, как и советовали в лекции, чтобы не упираться в лимит работы с gpu в Google Colab. Регистрация прошла успешно, а вот библиотеки у меня на Kaggle не встали — буквально второй или третий шаг кода не работал ни в какую, с каким бы бубном я ни танцевала. Поэтому пришлось все-таки работать в Google Colab, в котором такой проблемы не возникло…

В целом о работе сказать нечего: я просто пошагово повторяла все, что было сказано в курсе, периодически еще обращаясь к комментариям в самом коде. Мне даже не пришлось ничего спрашивать у чата gpt.

Original size 1868x440

Создание папки/директории mypictures

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

По итогу сбора и отбраковки неподходящих фотографий получилось 140 файлов. Я решила оставить такое количество, не добирая до 200, поскольку код и так грузился почему-то очень долго… Возможно, это проблема работы с Google Colab — в лекции упоминалось, что у него мощность предоставляемая чуть меньше, чем в Kaggle.

Original size 1854x473

Предпросмотр картинок из загруженной в папку датабазы

Следующим шагом я на всякий случай запустила предпросмотр загруженных картинок, увеличив количество показываемых фото до 7. Показанная выборка меня устроила.

Original size 1864x422

Создание общей части промпта для генерации

Далее нужно было задать промпт, который будет использоваться для запуска генерации. Опять же, посмотрев на пример с собакой, я заменила предыдущий TOK на слово SKY, поскольку в моей генерации будет использовано небо.

Original size 1848x656

Основная подготовка перед запуском

Далее же я создала аккаунт на Hugging Face, создала на нем write access token, скопировала его в код и приступила к пункту с обучением нейросети.

В пункте с accelerate я изменила имя датасета, папки, в которую будет сохраняться результат, промпт и качество изображений. В лекции советовали делать квадратные изображения в формате 1024 на 1024 или 512 на 512. Я выбрала второй вариант, посчитав, что на интересующих меня деталях генерации меньший размер не отразится, а результат генерации я получу таким образом быстрее.

Original size 1862x566

Изменение названия конечной папки

Дальше же оставалось только сохранить модель в уже созданную и названную ранее папку, и запустить саму генерацию.

Original size 779x166

Ссылка на получившуюся нейросеть на сайте Hugging Face

Original size 1867x604

Проверка генерации в Google Colab

Результат

Начать я решила с генерации пейзажей. Поэтому в промптах помимо общего начала «a photo of the SKY» присутствовали такие слова, как: river, forest, lake, landscape и далее.

0

Река, сгенерированная в Google Colab и на сайте Hugging Face

Мне очень понравилась первая сгенерированная на сайте Hugging Face река — в основном из-за использованных нейросетью цветов. Поэтому я попробовала сгенерировать на сайте еще несколько вариаций, и… Все они почему-то оказались зелеными. Причем ярко-зелеными, хотя ни в промпте, ни в базе скормленных фотографий таких цветов не присутствовало.

Еще несколько вариантов рек, сгенерированных на сайте Hugging Face

А вот нейросеть в Colab зеленый в реке выдавать не хотела никак, даже если я напрямую в промпте цвет прописывала. Поэтому я решила сгенерировать лес.

Эксперимент частично удался: лес действительно имел в себе оттенки зеленого, пусть и не такого ядреного, как в реках с сайта. Но он зато генерировался исключительно с видом снизу вверх…

Сгенерированный в Google Colab лес

А вот просьба сгенерировать лес с видом «сбоку» или в пасмурную погоду успехом не увенчалась совсем… Хотя я была уверена, что на слово «storm» в промпте нейросеть отреагирует.

Лес сбоку (1) и лес в грозу (2), сгенерированные в Google Colab

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

И да, предположение оказалось относительно верным. Город генерировался точно так же: с ракурса снизу вверх. Большую часть изображения, ожидаемо, занимало небо.

Города, сгенерированные в Google Colab

Я даже попробовала сгенерировать Нью-Йорк по оставшемуся в изначальном коде промпту из лекции, заменив его начало «Cherkashin style» на указанное уже в моем коде «a photo of the SKY».

Original size 1024x1024

Нью-Йорк, созданный по измененному изначальному промпту в Google Colab

Он тоже был сгенерирован по такой же схеме: здания внизу, большая часть фото — небо. Логично, учитывая, что на референсах объекты всегда находились внизу изображения, если вообще на нем присутствовали.

Таким образом, с генерацией пейзажей было покончено. Эксперимента ради я попросила нейросеть создать закат в городе, чтобы получить другое цветовое сочетание, и… Опять наткнулась на розовый.

Закат в городе, сгенерированный в Google Colab

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

Мне нужны были промпты, не включающие в себя массивные дополнительные объекты. Я попросила нейросеть сгенерировать мне птиц в небе, без указания, какого цвета должна быть картинка, и какая на ней должна быть погода. Все птицы оказались похожи на кляксы — ожидаемо, хороших референсов на эту тему я модели не дала — но при этом они все оказались в розоватом небе.

0

Птицы в небе, Google Colab

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

Звезды сгенерировались, луна тоже, но на этом «ночное» небо закончилось. Оно получилось серым.

Ночь, Google Colab

Следующая попытка была сгенерировать НЛО, так как оно обычно изображается на фоне ночного неба, при этом указав, что картинка должна быть темно-синей — «dark blue».

НЛО — UFO — с указанием цвета генерируемой картинки, Google Colab

И оно тоже было изображено на фоне серого неба. Очевидно, что просто указания цвета недостаточно. Тогда я наугад решила добавить в промпт стиль — «fantasy».

Первый такой запрос выдал нечто ярко-розовое с вкраплениями фиолетового. В целом, оно отдаленно все еще напоминало облака, заслонившее все небо.

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

Небо в стиле «fantasy» (1), и тот же промпт, но уже с планетами (2), Google Colab

Выводы

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

А вот почему версия на Hugging Face так любит зеленый, и откуда она его берет — для меня осталось загадкой. Возможно, это связано с тем, что сайт подгружает еще и какую-то свою базу?.. Но это чисто предположение, я слишком плохо разбираюсь в программировании, чтобы утверждать точно.

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

Original size 2000x2000

Цветовой круг, фото взято из открытых Google изображений

По итогу можно убедиться, что качество генерации картинок нейросетью зависит не только от их количества, но и от их качества и разнообразия, в том числе и цветового. Думаю, если бы я изначально загрузила базу, содержащую в себе больше отличительных деталей — птиц в небе, ночь, луну, космос, конкретные части пейзажа — то нейросеть определенно лучше бы понимала, чего я от нее хочу, и на запрос со словами «dark blue» например брала бы в качестве референса именно ночное фото, а не пыталась бы подобрать цвет самостоятельно из наиболее подходящих картинок.

А вообще складывается ощущение, что не хватает шага, в котором при загрузке датабазы вручную можно было бы прописать, что на загружаемой фотографии присутствует, и что в случае генерации с нее нужно брать. Это сильно растянуло бы работу, но результат значительно улучшился бы. С другой стороны, такой подход сработал бы только если нейросеть обучается для какой-то конкретной цели, или для использования одним человеком. Поскольку предугадать, что из датабазы для генерации окажется важным в следующее использование нейросети случайным человеком — невозможно.

Обучение генеративной модели Stable Diffusion на фотографиях неба
3