Компьютерное зрение

Image Generation: GANs

2014 год: Ян Гудфеллоу объясняет идею в баре. Два игрока: фальшивомонетчик (генератор) и следователь (дискриминатор). Следователь учится распознавать подделки - фальшивомонетчик учится их совершенствовать. В теории игр это называется минимакс. В результате этой «игры» рождаются изображения, неотличимые от реальных. За 10 лет GAN эволюционировали от размытых 28×28 цифр до 1024×1024 фотореалистичных лиц и text-to-image систем.

  • **NVIDIA StyleGAN** - thispersondoesnotexist.com: каждое лицо на сайте синтетическое
  • **Adobe Photoshop** - нейросетевое заполнение областей (Generative Fill) основано на conditional GAN
  • **Medical imaging** - CycleGAN для синтеза MRI из CT без парных данных (дорогостоящий сбор пар невозможен)
  • **Видеоигры** - upscaling текстур низкого разрешения через GAN (DLSS от NVIDIA)

Ян Гудфеллоу и идея состязательной игры

В 2014 году Ян Гудфеллоу с соавторами из Монреальского университета опубликовал Generative Adversarial Nets - схему, где генератор и дискриминатор обучаются в минимакс-игре друг против друга. Первые GAN рисовали размытые 28×28 цифры, но идея оказалась плодотворной. В 2015 году Radford, Metz и Chintala стабилизировали обучение в DCGAN, задав архитектурные правила для свёрточных GAN. В 2017 году Isola с коллегами предложил pix2pix для парной трансляции изображений, а Zhu с коллегами - CycleGAN для непарной. В 2018 году Karras и команда NVIDIA выпустили StyleGAN, синтезирующий фотореалистичные лица 1024×1024.

Предварительные знания

  • Свёрточные и транспонированные свёрточные слои
  • Backpropagation и функции потерь
  • Batch Normalization
  • Image Classification: CNNs
  • Modern Architectures

DCGAN: архитектура и обучение

В 2014 году Гудфеллоу описал идею: два игрока в игре - **генератор** придумывает поддельные банкноты, **дискриминатор** учится их распознавать. Со временем генератор становится настолько искусным, что дискриминатор больше не может отличить подделку от оригинала. Первые GAN работали на маленьких изображениях. **DCGAN** (2015) перевёл концепцию в глубокие свёрточные сети и задал архитектурные правила, которые работают до сих пор.

DCGAN генерирует изображение из случайного вектора z (обычно dim=100, из N(0,1)). Генератор - это обратная свёрточная сеть: начинает с маленького тензора и через transposed convolutions расширяет до финального изображения. Дискриминатор - обычная свёрточная сеть, классифицирующая «настоящее / поддельное».

**Mode collapse** - главная проблема GAN: генератор находит «читерское» решение, генерируя один-два паттерна, которые всегда обманывают дискриминатор. Симптом: все сгенерированные образцы похожи друг на друга. Решения: Wasserstein GAN (WGAN), minibatch discrimination, unrolled GAN.

В DCGAN используется LeakyReLU в дискриминаторе, а не обычный ReLU. Почему?

StyleGAN: пространство стилей

NVIDIA в 2018 году опубликовала faces, которые казались реальными фотографиями - StyleGAN. Но главное не качество, а **контроль**: можно взять лицо A и лицо B, смешать их стили - и получить лицо с причёской A, но формой носа B. Это стало возможным благодаря переосмыслению того, как шум управляет генерацией.

В DCGAN вектор z подаётся напрямую в сеть - плохой контроль над стилем. StyleGAN вводит **mapping network** (8 полносвязных слоёв): z → w (пространство стилей). Вектор w затем через **AdaIN (Adaptive Instance Normalization)** управляет каждым слоём генератора отдельно. Отдельный канал - **stochastic noise** - добавляется к каждому слою и отвечает за мелкие случайные детали (поры кожи, отдельные волоски).

**FID (Frechet Inception Distance)** - метрика качества GAN. StyleGAN (2019) достиг FID=4.4 на FFHQ (70k лиц). StyleGAN2 (2020) улучшил до FID=2.84, убрав артефакты «капли воды» через weight demodulation вместо AdaIN.

Для чего в StyleGAN нужен отдельный канал stochastic noise (добавляется к фичмэпам каждого слоя)?

Pix2Pix: conditional GAN

Архитектор рисует планировку здания - чёрные линии на белом фоне. Pix2Pix (Isola et al., 2017) превращает этот чертёж в фотореалистичный фасад. Та же архитектура: ночные улицы → дневные, спутниковые снимки → карты, чёрно-белые фото → цветные. Одна модель, разные пары данных.

Pix2Pix - это **conditional GAN**: и генератор, и дискриминатор принимают исходное изображение как дополнительный вход. Генератор строится по архитектуре **U-Net**: encoder сжимает вход, decoder восстанавливает, skip connections передают детали напрямую из encoder в decoder. Дискриминатор - **PatchGAN**: классифицирует не всё изображение, а перекрывающиеся патчи 70×70. Это выгоднее: патчи-классификатор имеет меньше параметров и лучше улавливает локальные текстуры.

**PatchGAN работает лучше глобального дискриминатора для текстур:** классифицируя 70×70 патчи, модель учится судить о локальной реалистичности - правильные края, текстура кирпича, зернистость асфальта. Полный изображение-дискриминатор часто игнорирует такие детали.

Pix2Pix добавляет L1 loss (|G(x) - y|) к adversarial loss. Зачем, если adversarial loss уже обеспечивает реализм?

CycleGAN: unpaired translation

Собрать 100 000 парных снимков «лето - зима одного и того же места» практически невозможно. Pix2Pix требует именно таких пар. **CycleGAN** (Zhu et al., 2017) работает с непарными коллекциями: просто 1000 фото лета и 1000 фото зимы - без соответствия. Картины Моне → фотографии, лошади → зебры, яблоки → апельсины - всё без пар.

Ключевая идея: **cycle consistency loss**. Если перевести изображение из домена A в домен B, а затем обратно из B в A - должно получиться исходное изображение. Это ограничение вместе с двумя adversarial loss-ами тренирует две пары моделей: G_AB, G_BA (генераторы), D_A, D_B (дискриминаторы).

**InstanceNorm вместо BatchNorm в CycleGAN:** при image-to-image translation важно нормализовать каждое изображение независимо от батча - стиль одного изображения не должен влиять на другое. InstanceNorm нормализует по H×W для каждого изображения отдельно.

CycleGAN - это улучшенный Pix2Pix, просто без парных данных, результат хуже

CycleGAN решает другую задачу. Для задач, где пары доступны, Pix2Pix лучше. Но CycleGAN открывает класс задач, где пары физически недостижимы - перевод художественного стиля, сезонные изменения, медицинские MRI→CT без одновременного сканирования.

Cycle consistency ограничивает пространство решений иначе, чем L1 к паре. Это не хуже/лучше - это другой режим работы.

Что произошло бы с CycleGAN без cycle consistency loss - только с adversarial losses?

GANs: от DCGAN до CycleGAN

  • GAN = минимакс игра генератора и дискриминатора; DCGAN задал архитектурные правила (strided conv, BN, LeakyReLU)
  • Mode collapse - главная проблема: G генерирует один паттерн; решения: WGAN, minibatch discrimination
  • StyleGAN: z → mapping network → w; AdaIN управляет стилем каждого слоя; noise отвечает за мелкие детали
  • Pix2Pix: conditional GAN с U-Net генератором и PatchGAN дискриминатором; требует парных данных
  • CycleGAN: unpaired translation через cycle consistency loss; две пары G и D; InstanceNorm вместо BatchNorm
  • Identity loss в CycleGAN предотвращает ненужные изменения изображений из целевого домена

Связанные темы

GANs заложили основу для современных диффузионных моделей. Понимание adversarial training помогает в работе с современными генеративными системами.

  • Object Detection: Faster R-CNN и YOLO — Свёрточные backbone из детекции используются как дискриминаторы
  • Feature Pyramid Networks — Multi-scale подход из FPN применяется в прогрессивном обучении StyleGAN

Вопросы для размышления

  • Почему Wasserstein GAN (WGAN) решает проблему mode collapse лучше, чем стандартный adversarial loss на основе BCELoss?
  • В каком сценарии лучше использовать Pix2Pix, а в каком CycleGAN - и где граница?
  • StyleGAN2 заменил AdaIN на weight demodulation. Какую проблему AdaIN создавал в генерируемых изображениях?

Связанные уроки

  • cv-04 — Генератор и дискриминатор GAN это свёрточные сети
  • cv-11 — Диффузия вытеснила GAN как основной генератор изображений
  • dl-14 — То же состязательное обучение в курсе deep learning
  • ml-33-gan — Основы GAN также есть в классическом ML-курсе
  • prob-11-normal — Латентные векторы сэмплируются из гауссова приора
  • ml-01
Image Generation: GANs

0

1

Войти