/CycleGAN

Primary LanguagePureBasic

CycleGAN

О данных

Данные храняться в дириктории data, а именно monet и photo
monet - это разные картины, photos - это фотографии реального мира

Все изображения формата jpg и размером (256, 256, 3)

data/extract_data - храниться класс для работы с данными
data/data.csv информация, о файлах (их название, расположение) data/monet - изображения картин data/photo - изображения фотографий реального мира

Models

models.py находятся функции и классы нейронных сетей, а именно:

get_generator_on_vgg16

В данном генераторе я использовал свёрточные слои VGG16, заморозил их, чтобы обучать меньше параметров.

get_generator_on_vgg16

discriminator

discriminator

Математика и представления CycleGAN

telegram-cloud-photo-size-2-5361755576993958339-y

Схема

Screenshot 2023-08-01 at 12 22 07

Обучение, гипотезы, идеи

Обучение я проводил в Сolab. Обучал на GPU вышло примерно 170 минут на обучение 100 мини эпох. Мини эпоха - это 1/10 полной эпохи, было это создано ради более детального наблюдения, как обучается сеть.

Первое время генератор сводил любой результат к черному экрану. Проблема оказалось в discriminator, так как первый вариант сводил размерность к (batch, 1), потом я нашел решение, оказалось в том что надо сводить например к (batch, size, size, 1), где я сводил размерность к (16,16,1). Идея заключаться в том, что мы рассматриваем изображение кусочками. Такой подход решил проблему черного экрана. Вторая проблема описана в гипотезе 2.

Гипотеза 1.

Слои VGG16 позволили не только сходиться быстрее, но и находить более четки границы обектов.

Гипотеза 2.

Instance Normalization(IN) - позволяет избавиться от сетки, которая появлялась при обучении без IN. Пример с сеткой, это первый хороший результат, который выдала НС без Instance Normalization. Сходимость к более-менее хорошему результату была очень быстро. Правда клетка мешала. telegram-cloud-photo-size-2-5368758315011656341-y

Из-за ограничения в мощности Colab падал с ошибкой, если использовать Instance Normalization после concatenate. Ошибка связана с ограничением в оперативной памяти. Но в финальном варианте, когда я аккуратно подобрал параметры м расположение IN – это мне позволило мне обучать модель.

Результат после каждой мини эпохи.

dcgan.mp4

1df4ff0436 1e90517e22 1f006ed5eb 5bb7d3f1e2 6b47c83dad 6e9f6935ce 8af0546eb3 daf0f4bdc1 df571c611d

Графики обучения модели

acc losses

Большое результатов в data/result

Есть много очень хороших и есть много очень плохих. Во время обучения с IN - сразу стало заметно, что сетка почти пропала.

Гипотеза 2 - ПОДТВЕРДИЛАСЬ

При инициализации весов и при использовании обученных параметров VGG16 сразу стало понятно, что очертания объектов видны, а как только убрать обученные веста, то сразу появлялся хаус при инициализации. Пример на 0 эпохе(до обучения) при обученных VGG16 весах и без IN: image_at_epochNone

Гипотеза 1 - ПОДТВЕРДИЛАСЬ

Маштабирование.

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

Screenshot 2023-08-08 at 11 14 23