im2im
November 5, 2021

SPADE: Semantic Image Synthesis with Spatially-Adaptive Normalization

🔗 Ссылки

https://arxiv.org/abs/1903.07291

https://github.com/NVlabs/imaginaire/tree/master/projects/spade

http://nvidia-research-mingyuliu.com/gaugan/ — демка

💎 Контрибьюшн

Наконец-то продакшн-качество в генерации картинок! Можно даже потыкаться в демку и нарисовать члены в ландшафте (спойлер: это непросто)

10 попыток скрестить разные материалы, и у меня получилось!

Ну а если серьёзно: авторы говорят, что пропускать семантические карты через InstanceNorm неправильно, потому что существенная часть информации "вымывается". Это справедливо для однородных карт, коими являются карты сегментации (много однородных областей). В разделе 🔎 Детали есть мотивационный пример, поясняющий этот эффект.

Вместо этого предлагается использовать слой SPatially-Adaptive (DE)normalization (SPADE):

  1. Семантические карты пропускаются через лёгкую CNN без нормализаций
  2. На выходе получаются параметры денормализации, разные для каждого канала и пространственной координаты пикселя (в отличие от BN и IN)
  3. Текущие фичемапы денормализуются с этими параметрами после BN

🛠 Задача

Авторы сосредоточились на генерации картинок по картам сегментации. Так что всё как обычно:

  • Вход: карта сегментации
  • Выход: реалистичное изображение, соответствующее карте сегментации

Основной целью было обеспечить хорошее соответствие GT-карте сегментации при достижении достаточного реализма.

🔎 Детали

SPADE-layer

Все нормализационные слои можно разделить на 2 типа: unconditional и conditional. К первому типу относятся, например:

  • (Sync-) BatchNorm
  • GroupNorm
  • InstanceNorm
  • LayerNorm
  • WeightNorm
  • SpectralNorm

То есть это слои, не зависящие от содержания картинок.

К conditional-нормализациям, когда параметры нормализации вычисляются по некоторой входной информации, относятся:

  • Conditional BatchNorm (на основе класса изображения)
  • AdaIN (на основе эмбеддинга изображения)

Утверждение: типичные нормализационные слои "вымывают" пространственную информацию

На входе однотонная карта с одним классом (sky / grass). pix2pixHD генерирует серую картинку,
т.к. InstanceNorm зануляет фичемапу; а предложенный SPADE хорошо отрисовывает текстуру.

Следовательно, использовать энкодер, на вход которому приходит карта сегментации, — как минимум неоптимально (цитата из статьи), т.к. она точно будет подвергаться нормализации.

Вместо этого предлагается прокидывать информацию об объектах через conditional-нормализацию:

SPADE-layer

Для генерации разнородных текстур помогают 2 фактора:

  • Карта сегментации не подвергается нормализации
  • Сохранение spatial-информации: теперь у каждого пикселя свои параметры денормализации

SPADE-генератор

В каждый SPADE-слой подаются ресайзнутые до нужного размера карты сегментации.

NB: в случае, когда число каналов на входе и выходе SPADE-ResBlk разные, внутри skip-connection также вставляется SPADE-слой.

Поскольку теперь нет нужды в энкодере, который бы извлекал семантику из карт сегментации, входом в генератор является случайный вектор (dim = 256, каждый элемент из стандартного нормального распределения — не как на картинке). Это значительно ускоряет время инференса.

Multi-modal synthesis

Совместно с генератором обучается энкодер, который генерирует случайный вектор по входному изображению. Таким образом, энкодер и генератор формируют VAE, и для обучения энкодера к общему лоссу добавляется KL-div.

Это позволяет синтезировать изображения с определённым стилем:

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

🔬 Эксперименты

Здесь происходит нечто интересное. Во-первых, только из Appendix A становится понятно, что сравнивались картинки маленького разрешения — 256x256 (или 512x256 для Cityscapes). Во-вторых, все сравнения сфокусированы на соответствии карте сегментации, а не на реалистичности. То есть из объективных метрик — mIoU и Accuracy (FID тоже есть, но по нему SPADE проигрывает).

Объективное сравнение (accu = pixel accuracy).

В субъективном сравнении авторы показывали карту сегментации + 2 синтезированные картинки и задавали вопрос: "Какое изображение лучше подходит карте сегментации".

В ячейках — human preference score.

Ещё у авторов можно поучиться тактично сливать компетиторов. Например, метод SIMS, который основан на склеивании картинок из базы, оказался ближе по FID на датасете Cityscapes. Авторы пишут, что это логично, т.к. по сути берутся куски из "реального" распределения. Но поскольку не всегда удаётся подобрать изображения в базе так, чтобы точно соответствовать карте сегментации, на субъективном сравнении этот метод оказывается сильно хуже предложенного.

Датасеты:

  • COCO-Stuff — 118 000 / 5 000 (train / val), 182 класса (подмножество COCO, содержит разнообразные сцены)
  • ADE20K — 20 210 / 2 000, 150 классов
  • ADE20K-outdoor — подмножество со сценами вне помещений
  • Cityscapes — 3 000 / 500
  • Flickr Landscapes — 41 000 / 1 000 (нет аннотаций, для этого использовался DeepLabV2)

Сравнение с pix2pixHD + ablation study

Для сравнений предложен бейзлайн pix2pixHD++ — это сеть pix2pixHD с улучшениями за 2017–2019 гг.:

  • hinge GAN-loss (вместо LSGAN)
  • SpectralNorm для свёрток
  • TTUR при обучении
  • Sync-BN (вместо BN)
  • больший batch size (32 вместо 8)
  • Glorot init (вместо нормального распределения)

И модификации:

  • w/ Concat — на каждом промежуточном слое подклеивается карта сегментации соответствующего размера
  • w/ SPADE — комбинация со SPADE-слоями

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

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

Наконец, авторы провели ablation study, в котором показали, что все компоненты архитектуры и лоссов важны.