CoderCastrov logo
CoderCastrov
DCGAN

Парсинг Instagram для искусственного создания дизайнов кроссовок (DCGAN PyTorch)

Парсинг Instagram для искусственного создания дизайнов кроссовок (DCGAN PyTorch)
просмотров
6 мин чтение
#DCGAN

В этом блоге, который является третьей частью серии "Все о GAN", я расскажу о архитектуре и работе DCGAN (Deep Convolution Generated Adversarial Network) и его реализации.

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

Сгенерированное изображение с помощью DCGAN

Таким образом, эту статью можно разделить на три основные части:

  • Что такое DCGAN? Как работает DCGAN?
  • Парсинг изображений с Instagram для создания нашего набора данных
  • Фактическая реализация DCGAN с использованием PyTorch

Если вы уже знакомы с работой DCGAN, то можете сразу перейти к разделу с фактической реализацией.

Также, если вы не очень знакомы с работой GAN или вас интересует более подробное изучение других вариантов GAN и их работы, то вы можете обратиться к моим предыдущим блогам о GAN, которые указаны ниже.

Блог 1: Введение в GAN (Generative Adversarial Networks)

Блог 2: Все о GAN (Часть 1)

Блог 3: Все о GAN (Часть 2)

Я настоятельно рекомендую вам ознакомиться с ними, так как я подробно объяснил работу GAN. Итак, приступим!



DCGAN (Глубокая сверточная генеративно-состязательная сеть)

DCGAN Architecture

DCGAN - это еще один вариант GAN, который состоит из двух блоков: Генератор и Дискриминатор. Блок дискриминатора может состоять из любой архитектуры классификатора CNN, использующей сверточные слои с шагом, тогда как в случае блока генератора он принимает значения из шумового/латентного вектора, а затем преобразует его в выходное изображение размером 64x64x3 с помощью операции транспонированной свертки.

Генератор

Генератор состоит из слоев свертки-транспонирования. В генераторе вход берется из латентного вектора (нормальное распределение размером 100x1) и производится выходное изображение размером 64x64x3 путем выполнения операций транспонированной свертки.

Generator

Формула для транспонированной свертки:

Размер выхода = шаг * (размер входа - 1) + размер фильтра - 2 * заполнение

Из диаграммы видно, что преобразование размеров происходит следующим образом:

100x1 → 4x4x1024 → 8x8x512 → 16x16x256 → 32x32x128 → 64x64x3

4x4x1024 → 8x8x512

шаг = 2, заполнение = 1, размер фильтра = 4

Размер выхода (высота): 2 * (4-1) + 4-2*1 = 8

Размер выхода (ширина): 2 * (4-1) + 4-2*1 = 8

Есть 512 фильтров, поэтому выход составляет: 8x8x512

8x8x512 → 16x16x256

шаг = 2, заполнение = 1, размер фильтра = 4

Размер выхода (высота): 2 * (8-1) + 4-2*1 = 16

Размер выхода (ширина): 2 * (8-1) + 4-2*1 = 16

Есть 256 фильтров, поэтому выход составляет: 16x16x256

Вот как работает операция транспонированной свертки, которая также известна как дробно-ступенчатые свертки. Она также включает слои нормализации пакета, и используется активация ReLU.

Дискриминатор

Дискриминатор состоит из сверточных слоев с шагом. Он различает образцы 'x', взятые из реального распределения, и выходы генератора 'G(x)'.

Формула для операции свертки:

Размер выхода = (размер входа + 2 * заполнение - размер фильтра) / шаг + 1

Из диаграммы видно, что преобразование размеров происходит следующим образом:

64x64x3 → 32x32x64 → 16x16x128 → 8x8x256 → 4x4x512 → 1x1

64x64x3 → 32x32x64

Шаг = 2, заполнение = 1, размер фильтра = 4

Размер выхода (высота): (64 + 2*1-4)/2 + 1 = 32

Размер выхода (ширина): (64 + 2*1-4)/2 + 1 = 32

Имеется 64 фильтра, поэтому размер выхода составляет: 32x32x64

32x32x64 → 16x16x128

Размер выхода (высота): (64 + 2*1-4)/2 + 1 = 32

Размер выхода (ширина): (64 + 2*1-4)/2 + 1 = 32

Имеется 128 фильтров, поэтому размер выхода составляет: 32x32x128

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

Функции потерь и оптимизаторы

В случае DCGAN мы обычно используем функцию потерь Binary Cross Entropy, которая задается следующим образом:

Binary Cross-Entropy Loss

Потеря рассчитывается, и соответствующим образом обновляются веса и другие параметры с помощью нескольких эпох, пока мы не достигнем минимальной потери. В DCGAN мы обычно используем оптимизатор Adam для оптимизации с коэффициентом обучения 0.0002 и beta1 = 0.5.

Согласно статье, есть еще несколько важных вещей, которые следует учесть при реализации стабильного DCGAN:

  • Замените любые слои пулинга на сверточные слои с шагом (дискриминатор) и сверточные слои с дробным шагом (генератор).
  • Используйте нормализацию по батчу как в генераторе, так и в дискриминаторе.
  • Удалите полностью связанные скрытые слои для более глубоких архитектур.
  • Используйте активацию ReLU в генераторе для всех слоев, кроме выходного, который использует Tanh.
  • Используйте активацию LeakyReLU в дискриминаторе для всех слоев.

Парсинг данных с Instagram

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

Я использовал "instagram-scraper" для парсинга фотографий, загруженных пользователями, у которых открытые аккаунты. Я привел ссылку на их репозиторий, и парсер отлично справляется с задачей парсинга данных.

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

Для своего проекта я решил спарсить медиа-контент этих талантливых художников и страницу с кроссовками:

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



Реализация DCGAN с использованием PyTorch

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

Transform & Dataloader

Затем мы определяем блок генератора:

Generator Block

Затем мы определяем блок дискриминатора:

Discriminator Block

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

Модель была обучена на протяжении 100 эпох. Я также попробовал работать с фреймворком TensorFlow с использованием TPU и GPU отдельно, но это оказалось намного медленнее, чем PyTorch. В PyTorch 100 эпох выполнялись за 10 минут, в то время как в TensorFlow для выполнения той же операции мне потребовалось более 2 часов.

Training Model Images over epochs

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

Comparison between real & fake images

Заключение

DCGAN относительно легче понять по сравнению с другими вариантами GAN, и именно это делает его настолько популярным и эффективным. Он преодолевает несколько преград по сравнению с предыдущими вариантами GAN.

PyTorch особенно упрощает и делает интересным использование DCGAN!

АВТОР

Судип Дас_ : _https://www.linkedin.com/in/sudeepdas27/