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

Разве это не удивительно, когда кто-то просто заменяет свое лицо лицом каких-то известных личностей в реальном времени? Или вы становитесь чрезвычайно любопытными и взволнованными, когда видите, что стильный портрет создается с помощью компьютеров, только предоставляя ему небольшой макет? Что ж, это то, что мы собираемся раскрыть в этой статье. Все эти крутые идеи в основном реализуются с помощью современной идеи машинного обучения, то есть GAN.

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

GAN или генерирующие состязательные сети - это класс сетей, которые могут генерировать изображения, похожие на настоящие. Если вы знакомы с концепцией переноса стилей, идея GAN не будет для вас новой. Однако вы можете получить хорошее представление о переносе стиля по ссылке в разделе «Справочная информация». GAN имеют различные приложения, такие как перевод изображения-изображения, перевод текста-изображения, моделирование видео в реальном времени с маской для лица, создание персонажей мультфильмов и многое другое. Одна идея, которая, как мне кажется, может оказаться полезной, - это повышающая дискретизация данных (подумайте над этим!).

Недавно я участвовал в конкурсе технических писателей, организованном IEEE, цель которого заключалась в том, чтобы написать о потенциальном и выгодном сценарии использования для будущего любой технологии, и поэтому я написал о GAN. Вы можете найти PDF-файл статьи в разделе «Справочная информация»!

Оглавление:

  1. "Определение"
  2. Существующие варианты использования GAN
  3. Типы GAN
  4. "Вывод"
  5. "Использованная литература"

1. Определение:

В основном, как указано выше, GAN или Generative Adversarial Networks - это сети, в которых мы генерируем изображения, похожие на изображения реального мира. Но ждать! Кто именно генерирует изображения? Как вообще возможно создание изображений? Как обучается модель? Как модель изучает сопоставления для создания изображений? Разве мы не используем сверточные сети?
Вы получите ответы на все эти вопросы в статье, поэтому внимательно прочтите.

Конкретный GAN содержит две разные сети. Одна из них называется сетью генераторов, а другая - сетью дискриминаторов. Модель Генератора (будучи Художником) пытается генерировать изображения, которые напоминают сходство с реальными изображениями, а модель Дискриминатора (будучи Арт-критиком) различает реальное изображение и сгенерированное изображение.

Обратите внимание, что сеть Discriminator также называется Adversarial Network, отсюда и название Generative Adversarial Network.

Идеальное состояние для сети GAN - это когда сеть Дискриминатора не может отличить реальные изображения от изображений, генерируемых сетью Генератора.

На самом базовом уровне работу сетей генератора и дискриминатора можно резюмировать следующим образом:

Модель генератора не видит реальное изображение напрямую и работает только с наблюдаемым изображением (или вектором в случае DCGAN). После создания изображения это изображение отправляется в сеть Дискриминатора, которая классифицирует его как настоящее или поддельное. Сеть Discriminator также видит реальное изображение и, следовательно, получает из него некоторую информацию. Выход, который мы получаем из сети Дискриминатора для входа сгенерированного изображения, содержит некоторую информацию о реальном изображении. Затем мы рассчитываем потери для сети генератора на основе этих выходных данных. Благодаря этому сеть Generator получает информацию о реальном изображении, а затем при следующей попытке пытается сгенерировать изображение, более похожее на реальное изображение. Благодаря постоянной практике модель Генератора становится способной генерировать изображение, сильно напоминающее реальное изображение, которое Дискриминатор не может классифицировать.

2. Представьте примеры использования GAN:

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

а) DeepFake:

DeepFake - это потрясающая реализация GAN, в которой человека на изображении или видео заменяют человеком с похожей внешностью. Здесь меняют не только изображение, но и голос говорящего иногда.

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

б) Создание портретов:

Очень выгодная реализация GAN позволяет создавать красивые и креативные портреты с нуля. Мы можем предоставить обучающие образцы для этих моделей как в парной (где есть прямое отображение ч / б наблюдаемых и реальных изображений), так и в непарном (где нет прямого ч / б сопоставления наблюдаемых и реальных изображений).

в) ExGAN:

ExGAN или Exemplar Generative Adversarial Networks - это подход, реализуемый Facebook. ExGAN - это тип условных GAN, которые используют информацию об образце для получения высококачественных, персонализированных результатов в отрисовке. Этот подход, в частности, использует ExGAN для преобразования изображения людей с закрытыми глазами в такое же изображение с открытыми глазами.

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

3. Типы GAN:

Хотя существуют различные варианты GAN, сегодня мы рассмотрим три общих типа GAN, а именно DCGAN, Pix2Pix GAN и CyclicGAN. Реализации для этих сетей GAN публикуются в качестве официальных руководств компанией Tensorflow, так что не забудьте проверить это. Итак, приступим:

а) DCGAN:

DCGAN или Deep Convolutional Generative Adversarial Networks - это некоторые из основных форм GAN, которые изучают отображение вектора шума на изображение. Теперь вы можете подумать, как мы могли бы преобразовать вектор в изображение? Ответ на этот вопрос очень прост. Он использует транспонированные сверточные слои для выполнения деконволюции ввода. Это прямо противоположно тому, что делает сверточный слой. Сверточный слой извлекает элементы из входного изображения, так что количество каналов увеличивается, но в транспонированных сверточных слоях новые функции добавляются к входным векторам, которые преобразуют их в изображения.

Сеть генератора построена на серии [транспонированных сверточных + BatchNorm + LeakyReLU слоев]. Сеть Discriminator - это обычный классификатор, который использует сверточные слои для классификации, является ли входное изображение реальным или сгенерированным.

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

def discriminator_loss(real_op, gen_op):
    loss = tf.keras.losses.BinaryCrossentropy(from_logits=True)
    real_loss = loss(tf.ones_like(real_op), real_op)
    gen_loss = loss(tf.zeros_like(gen_op), gen_op)
    return real_loss + gen_loss
def generator_loss(gen_op):
   loss = tf.keras.losses.BinaryCrossentropy(from_logits=True)
   return loss(tf.ones_like(gen_op), gen_op)

б) Pix2Pix GAN:

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

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

Теперь конкретная Pix2Pix GAN также имеет модель генератора и дискриминатора. Но здесь они оба не такие, как те, что используются в DCGAN. Сеть Generator использует архитектуру U-Net , а сеть Discriminator - архитектуру PatchGAN.

Архитектура U-Net, по сути, представляет собой обычную сеть кодировщик-декодер с улучшенной функцией пропуска соединений между уровнями. Аргументом в пользу добавления пропускаемых соединений может быть то, что тогда модель будет одинаково изучать как закодированные, так и декодированные функции на каждом уровне. Архитектура U-Net, используемая в сети Pix2Pix (в частности, в руководстве по тензорному потоку по набору данных cityscapes), может быть визуализирована как:

А теперь перейдем к описанию сети Дискриминатора! Сеть Discriminator - это сеть PatchGAN. Но что такое сеть PatchGAN в первую очередь? Сеть PatchGAN относится к классу классификаторов машинного обучения, которые учатся классифицировать высокочастотную структуру входных данных. Они штрафуют структуру в размере заплаток. Эти модели используют заплатки, извлекаемые из изображений, для задач классификации. Дискриминатор использует патч N x N, чтобы определить, является ли изображение настоящим или поддельным. Обычно для классификации используется часть изображения размером 70x70, поскольку это дает лучшие результаты. Это видно из пояснения в оригинальной статье.

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

def discriminator_loss(disc_real_op, disc_gen_op):
    loss = tf.keras.losses.BinaryCrossentropy(from_logits=True)
    real_loss = loss(tf.ones_like(disc_real_op), disc_real_op)
    gen_loss = loss(tf.zeros_like(disc_gen_op), disc_gen_op)
    return real_loss + gen_loss
def generator_loss(disc_gen_op, generated_op, target, lambda=10):
    loss = tf.keras.losses.BinaryCrossentropy(from_logits=True)
    gan_loss = loss(tf.ones_like(disc_gen_op), disc_gen_op)
    l1_loss = tf.reduce_mean(tf.abs(target - generated_op))
    gen_loss = gan_loss + (lambda*l1_loss)
    return gen_loss

в) Циклические GAN:

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

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

Теперь вы можете спросить-

Только для обучения непарным данным вы внедряете новую архитектуру? Разве мы не можем узнать непарные данные, используя предыдущие подходы?

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

Давайте теперь рассмотрим некоторые из причин использования CyclicGANs-

Мы рассматриваем два набора изображений, а именно X и Y, как две области, между которыми мы хотим переводить изображения.

  1. Предположим, мы научились генерировать изображение «b» в наборе Y из изображения «a» в наборе X. Теперь мы запускаем модель генератора на изображении «b». Вы гарантируете, что мы вернем изображение «а»? Нет, мы не можем гарантировать этого при использовании вышеупомянутых вариантов GAN.
  2. Можем ли мы с уверенностью сказать, что все изображения в наборе X будут сопоставлены со всеми изображениями в наборе Y (биективно)?

Обе эти проблемы были решены CyclicGAN. Давайте теперь разберемся с архитектурой CyclicGAN.

Конкретный CyclicGAN состоит из двух сетей генераторов и двух сетей дискриминаторов.

Две сети генератора, а именно G и F, противоположны друг другу. G изучает сопоставление изображений в наборах X на Y, G: X → Y и F изучает сопоставление изображений из набора Y в X, F: Y → X.

Чтобы классифицировать выходные данные двух сетей генераторов как настоящие или поддельные, у нас есть две сети дискриминаторов, то есть Dx и Dy. Dx в основном классифицирует изображение, созданное F, как настоящее или поддельное, а Dy классифицирует изображение, созданное G. как настоящие или фальшивые.

Потеря Дискриминатора (Состязательная потеря) и Потеря Генератора реализованы как:

def discriminator_loss(real_op, gen_op):
    loss = tf.keras.layers.BinaryCrossentropy(from_logits=True)
    real_loss = loss(tf.ones_like(real_op), real_op)
    gen_loss = loss(tf.zeros_like(gen_op), gen_op)
    return real_loss + gen_loss
def generator_loss(gen_op):
    loss = tf.keras.layers.BinaryCrossentropy(from_logits=True)
    return loss(tf.ones_like(gen_op), gen_op)

Обратите внимание, что мы обычно умножаем потерю дискриминатора на 1/2, из-за чего он учится медленно по сравнению с сетью генератора.

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

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

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

Рассматривая левую часть изображения, мы видим, что оно генерирует изображение y_hat из изображения x с использованием G, и мы снова передали это сгенерированное image, чтобы получить изображение x_hat с помощью F. В правой части изображения происходит прямо противоположное.
Теперь потеря согласованности в основном измеряет сходство между x и x_hat (для левой стороны), которое мы также называем это прямой циклической потерей согласованности, а потеря, рассчитанная на основе сходства между y и y_hat (для правой стороны), также называется потеря обратной циклической согласованности. Эта потеря в основном представляет собой L1 (или Манхэттенскую) норму между расстоянием между реальным ({x, y}) и сгенерированным ({x_hat, y_hat}) изображениями.

Потеря циклической согласованности может быть реализована как:

def cyclic_consistency_loss(generator, cycled_image, real_image, lambda=10):
    loss = tf.reduce_mean(tf.abs(cycled_image - real_image))
    return loss*lambda

Итак, [состязательные потери + лямбда * (потеря циклической согласованности в прямом направлении + потеря циклической согласованности в обратном направлении) + потеря генератора] вместе составляют полную целевую функцию для CyclicGAN. лямбда - настраиваемый гиперпараметр.

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

4. Вывод:

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

5. Ссылки:

Я надеюсь, что мне довольно успешно удается разъяснить вам мою точку зрения. Я изо всех сил старался объяснить идеи из оригинальной статьи. Однако, если вы все еще сомневаетесь в каком-либо из разделов или чувствуете, что я описал что-то неправильно, не стесняйтесь писать об этом в комментариях.
~ Happy Coding ~