Парсинг Instagram для искусственного создания дизайнов кроссовок (DCGAN PyTorch)
В этом блоге, который является третьей частью серии "Все о GAN", я расскажу о архитектуре и работе DCGAN (Deep Convolution Generated Adversarial Network) и его реализации.
Здесь мы будем реализовывать DCGAN с использованием фреймворка PyTorch для генерации изображений кроссовок на основе нашего собственного набора данных, полученного путем парсинга Instagram.
Таким образом, эту статью можно разделить на три основные части:
- Что такое DCGAN? Как работает DCGAN?
- Парсинг изображений с Instagram для создания нашего набора данных
- Фактическая реализация DCGAN с использованием PyTorch
Если вы уже знакомы с работой DCGAN, то можете сразу перейти к разделу с фактической реализацией.
Также, если вы не очень знакомы с работой GAN или вас интересует более подробное изучение других вариантов GAN и их работы, то вы можете обратиться к моим предыдущим блогам о GAN, которые указаны ниже.
Блог 1: Введение в GAN (Generative Adversarial Networks)
Блог 2: Все о GAN (Часть 1)
Блог 3: Все о GAN (Часть 2)
Я настоятельно рекомендую вам ознакомиться с ними, так как я подробно объяснил работу GAN. Итак, приступим!
DCGAN (Глубокая сверточная генеративно-состязательная сеть)
DCGAN - это еще один вариант GAN, который состоит из двух блоков: Генератор и Дискриминатор. Блок дискриминатора может состоять из любой архитектуры классификатора CNN, использующей сверточные слои с шагом, тогда как в случае блока генератора он принимает значения из шумового/латентного вектора, а затем преобразует его в выходное изображение размером 64x64x3 с помощью операции транспонированной свертки.
Генератор
Генератор состоит из слоев свертки-транспонирования. В генераторе вход берется из латентного вектора (нормальное распределение размером 100x1) и производится выходное изображение размером 64x64x3 путем выполнения операций транспонированной свертки.
Формула для транспонированной свертки:
Размер выхода = шаг * (размер входа - 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, которая задается следующим образом:
Потеря рассчитывается, и соответствующим образом обновляются веса и другие параметры с помощью нескольких эпох, пока мы не достигнем минимальной потери. В DCGAN мы обычно используем оптимизатор Adam для оптимизации с коэффициентом обучения 0.0002 и beta1 = 0.5.
Согласно статье, есть еще несколько важных вещей, которые следует учесть при реализации стабильного DCGAN:
- Замените любые слои пулинга на сверточные слои с шагом (дискриминатор) и сверточные слои с дробным шагом (генератор).
- Используйте нормализацию по батчу как в генераторе, так и в дискриминаторе.
- Удалите полностью связанные скрытые слои для более глубоких архитектур.
- Используйте активацию ReLU в генераторе для всех слоев, кроме выходного, который использует Tanh.
- Используйте активацию LeakyReLU в дискриминаторе для всех слоев.
Парсинг данных с Instagram
Для нашего проекта мы решили сгенерировать или, можно сказать, искусственно создать изображения кроссовок. И для этого нам нужно обучить нашу модель на различных изображениях кроссовок. В этом нам поможет Instagram, так как это платформа, где множество талантливых людей со всего мира выкладывают свой контент.
Я использовал "instagram-scraper" для парсинга фотографий, загруженных пользователями, у которых открытые аккаунты. Я привел ссылку на их репозиторий, и парсер отлично справляется с задачей парсинга данных.
После установки выполните команду в командной строке, как указано в их репозитории, и он загрузит все медиа-контент. Ниже приведен снимок экрана моей командной строки во время парсинга данных.
Для своего проекта я решил спарсить медиа-контент этих талантливых художников и страницу с кроссовками:
После загрузки всех файлов объедините их в одну папку и отфильтруйте подходящие изображения, которые будут использоваться для обучения нашей модели.
Реализация DCGAN с использованием PyTorch
Первый шаг - установить все зависимости, а затем импортировать все изображения и преобразовать их в одинаковый размер, который будет подаваться нашей модели с помощью загрузчика данных.
Затем мы определяем блок генератора:
Затем мы определяем блок дискриминатора:
После того, как мы определили блоки генератора и дискриминатора, следующим шагом будет обучение их на протяжении определенного числа эпох, определяя также другие параметры, такие как оптимизатор, скорость обучения, размер пакета и функция потерь (бинарная кросс-энтропия) или критерий.
Модель была обучена на протяжении 100 эпох. Я также попробовал работать с фреймворком TensorFlow с использованием TPU и GPU отдельно, но это оказалось намного медленнее, чем PyTorch. В PyTorch 100 эпох выполнялись за 10 минут, в то время как в TensorFlow для выполнения той же операции мне потребовалось более 2 часов.
На гиф-изображении выше показано, как модель генерирует реалистичные изображения кроссовок, которые очень похожи на реальные образцы из нашего набора данных. Ниже приведено сравнение между реальными и сгенерированными изображениями кроссовок.
Заключение
DCGAN относительно легче понять по сравнению с другими вариантами GAN, и именно это делает его настолько популярным и эффективным. Он преодолевает несколько преград по сравнению с предыдущими вариантами GAN.
PyTorch особенно упрощает и делает интересным использование DCGAN!
АВТОР
Судип Дас_ : _https://www.linkedin.com/in/sudeepdas27/