
Рубрикатор
1. Концепция 2. Порядок выполнения работы 3. Результат 4. Выводы
Концепция
Я не хотела брать для создания нейросети чей-то стиль работ, поскольку это идет вразрез с моими моральными устоями. Поэтому предпочла делать «второй вариант» генерации, то есть тренировать нейросеть на фотографиях, как было сделано с собакой в примере из лекции. Вернее, там было упомянуто, что так тоже можно.
Поэтому в качестве темы проекта я выбрала фотографии неба. Во-первых, мне очень нравится небо само по себе — оно наталкивает на философские мысли, а еще поражает воображение разнообразием цветов. Вспомните хотя бы закаты с их множественными цветовыми переливами. А во-вторых, я хотела проверить, как и что будет генерировать нейросеть, если дать ей достаточно ограниченную базу: на фотографиях неба зачастую кроме облаков, солнца и случайно попавших в кадр пейзажей ничего ведь нет.
Поэтому я условно разделила исследование на два критерия: 1. Цветовая гамма генерируемых изображений 2. Генерация объектов, косвенно присутствующих на фотографиях
Базу данных — то бишь фотографии — я взяла из открытого источника (с сайта images.cv), отбраковав неподходящие: с надписями, вытянутые, с наложенными фильтрами. Для своих задач я выбрала фото заката — в оранжевой гамме; и фото гроз — в фиолетовой.






Порядок выполнения работы
Началось все со среды программирования. Изначально я хотела работать в Kaggle, как и советовали в лекции, чтобы не упираться в лимит работы с gpu в Google Colab. Регистрация прошла успешно, а вот библиотеки у меня на Kaggle не встали — буквально второй или третий шаг кода не работал ни в какую, с каким бы бубном я ни танцевала. Поэтому пришлось все-таки работать в Google Colab, в котором такой проблемы не возникло…
В целом о работе сказать нечего: я просто пошагово повторяла все, что было сказано в курсе, периодически еще обращаясь к комментариям в самом коде. Мне даже не пришлось ничего спрашивать у чата gpt.
После установки всех библиотек я приступила к пункту загрузки датасета. Вручную запихивать картинки не хотелось, поэтому я создала папку mypictures и запустила код, в котором указала, какие локальные файлы с компьютера нужно загрузить.
По итогу сбора и отбраковки неподходящих фотографий получилось 140 файлов. Я решила оставить такое количество, не добирая до 200, поскольку код и так грузился почему-то очень долго… Возможно, это проблема работы с Google Colab — в лекции упоминалось, что у него мощность предоставляемая чуть меньше, чем в Kaggle.
Следующим шагом я на всякий случай запустила предпросмотр загруженных картинок, увеличив количество показываемых фото до 7. Показанная выборка меня устроила.
Далее нужно было задать промпт, который будет использоваться для запуска генерации. Опять же, посмотрев на пример с собакой, я заменила предыдущий TOK на слово SKY, поскольку в моей генерации будет использовано небо.
Далее же я создала аккаунт на Hugging Face, создала на нем write access token, скопировала его в код и приступила к пункту с обучением нейросети.
В пункте с accelerate я изменила имя датасета, папки, в которую будет сохраняться результат, промпт и качество изображений. В лекции советовали делать квадратные изображения в формате 1024 на 1024 или 512 на 512. Я выбрала второй вариант, посчитав, что на интересующих меня деталях генерации меньший размер не отразится, а результат генерации я получу таким образом быстрее.
Дальше же оставалось только сохранить модель в уже созданную и названную ранее папку, и запустить саму генерацию.
Результат
Начать я решила с генерации пейзажей. Поэтому в промптах помимо общего начала «a photo of the SKY» присутствовали такие слова, как: river, forest, lake, landscape и далее.
Мне очень понравилась первая сгенерированная на сайте Hugging Face река — в основном из-за использованных нейросетью цветов. Поэтому я попробовала сгенерировать на сайте еще несколько вариаций, и… Все они почему-то оказались зелеными. Причем ярко-зелеными, хотя ни в промпте, ни в базе скормленных фотографий таких цветов не присутствовало.


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


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


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


Я даже попробовала сгенерировать Нью-Йорк по оставшемуся в изначальном коде промпту из лекции, заменив его начало «Cherkashin style» на указанное уже в моем коде «a photo of the SKY».
Он тоже был сгенерирован по такой же схеме: здания внизу, большая часть фото — небо. Логично, учитывая, что на референсах объекты всегда находились внизу изображения, если вообще на нем присутствовали.
Таким образом, с генерацией пейзажей было покончено. Эксперимента ради я попросила нейросеть создать закат в городе, чтобы получить другое цветовое сочетание, и… Опять наткнулась на розовый.


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


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


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


Выводы
После данного эксперимента у меня сложилось впечатление, что созданная мной нейросеть сложила цвета со всех загруженных в нее фотографий. Если посмотреть на цветовой круг, то между оранжевым и фиолетовым располагается именно что розовый цвет, который в большинстве работ и фигурировал. Этим же можно объяснить и серый, образовывавшийся случайным смешением гамм нескольких фото.
А вот почему версия на Hugging Face так любит зеленый, и откуда она его берет — для меня осталось загадкой. Возможно, это связано с тем, что сайт подгружает еще и какую-то свою базу?.. Но это чисто предположение, я слишком плохо разбираюсь в программировании, чтобы утверждать точно.
С пейзажами же все оказалось куда логичнее. Не даешь в датабазе четких референсов ракурса — получаешь нечто, основанное на крупицах того, на что нейросеть хоть как-то смогла ориентироваться из данных ей фотографий.
По итогу можно убедиться, что качество генерации картинок нейросетью зависит не только от их количества, но и от их качества и разнообразия, в том числе и цветового. Думаю, если бы я изначально загрузила базу, содержащую в себе больше отличительных деталей — птиц в небе, ночь, луну, космос, конкретные части пейзажа — то нейросеть определенно лучше бы понимала, чего я от нее хочу, и на запрос со словами «dark blue» например брала бы в качестве референса именно ночное фото, а не пыталась бы подобрать цвет самостоятельно из наиболее подходящих картинок.
А вообще складывается ощущение, что не хватает шага, в котором при загрузке датабазы вручную можно было бы прописать, что на загружаемой фотографии присутствует, и что в случае генерации с нее нужно брать. Это сильно растянуло бы работу, но результат значительно улучшился бы. С другой стороны, такой подход сработал бы только если нейросеть обучается для какой-то конкретной цели, или для использования одним человеком. Поскольку предугадать, что из датабазы для генерации окажется важным в следующее использование нейросети случайным человеком — невозможно.