15 / 33 · GAN
StarGAN: один генератор для многих доменов
Многодоменный перевод изображений одной сетью: StarGAN подаёт генератору на вход целевую метку, добавляет к дискриминатору WGAN-GP классификатор доменов, возвращает изображение с исходной меткой для реконструкции и обучается сразу на нескольких наборах данных с помощью вектора-маски; StarGAN v2 заменяет метку кодом стиля из отображающей сети или энкодера стиля, встраиваемым через AdaIN, и даёт много выходов на один вход.
На этой странице 20
Заметка о CycleGAN закончилась двумя ограничениями перевода между двумя доменами. Чтобы охватить доменов, нужна отдельная модель для каждой пары, всего генераторов, и каждый из них учится на изображениях только двух доменов. Кроме того, каждый генератор детерминирован: у лошади ровно один вариант в виде зебры. StarGAN (Choi et al., 2018) снимает первое ограничение. Один генератор получает целевой домен на вход, один дискриминатор вдобавок говорит, к какому домену относится изображение, а цикловая функция потерь сохраняется: на обратном пути целевым доменом служит исходный. StarGAN v2 (Choi et al., 2020) снимает второе ограничение. Цель — уже не фиксированная метка, а код стиля (style code), взятый из выученного пространства стилей этого домена, поэтому у одного входного изображения много переводов.
Две модели, одна история. StarGAN отвечает на запрос «переведи в такую комбинацию меток» одним детерминированным генератором; StarGAN v2 — на запрос «переведи в этот домен, в таком стиле» с помощью отображающей сети, энкодера стиля и AdaIN. Обе сохраняют цикл назад к исходному изображению. Тому, кому нужны только метки нескольких доменов, достаточно дочитать до раздела «Один выход на изображение и домен» и перейти к ограничениям; разделы о StarGAN v2 — расширение для разнообразных переводов, управляемых стилем.
Обозначения. Домен (domain) — множество изображений с общим значением атрибута: светлые волосы, мужской пол, радостное выражение лица (Choi et al., 2018, раздел 1). — настоящее изображение, — его исходная метка домена; — целевая метка. Метки — векторы из элементов: бинарные для атрибутов, которые могут встречаться вместе (цвет волос, пол, возраст), и в виде one-hot-векторов для взаимоисключающих категорий (выражения лица). — генератор, — дискриминатор. Для StarGAN v2 — исходный домен , — целевой домен, — латентный код, — код стиля; — отображающая сеть (mapping network; это не обратный генератор из CycleGAN), — энкодер стиля (style encoder). Как и в заметке о CycleGAN, — сумма модулей попиксельных разностей, которую реализации усредняют по пикселям.
Почему не один CycleGAN на каждую пару?#
Модель перевода между доменами должна обслуживать каждую упорядоченную пару доменов , то есть направлений. CycleGAN обучает оба направления пары вместе, по генератору на каждое, поэтому нужно моделей с генераторами и столькими же дискриминаторами. Четырём доменам нужно 12 генераторов, восьми выражениям лица из набора данных RaFD — 56. Новый домен добавляет пар, то есть генераторов. Число моделей — не единственная цена. Каждый генератор учится на изображениях двух доменов, хотя большая часть того, что ему нужно, — форма лица или текстура кожи — общая для всех доменов (Choi et al., 2018, раздел 1 и рисунок 2).
StarGAN делает цель входом. Его генератор принимает изображение и целевую метку и возвращает перевод . При обучении выбирается случайно, поэтому одна и та же сеть учит все направления, а при тестировании можно запросить любую метку. Это условный GAN, в котором место шума занимает изображение. Дискриминатор тоже общий: помимо ответа «настоящее или подделка» он предсказывает домен своего входа, .
Как генератор читает метку#
На CelebA метка состоит из пяти бинарных элементов: чёрные, светлые и каштановые волосы, мужчина, молодой. На RaFD это one-hot-вектор по восьми выражениям лица. Генератор копирует каждый элемент в постоянную карту и конкатенирует эти карты с тремя цветовыми каналами, так что его первый слой видит тензор (Choi et al., 2018, рисунок 3 и таблица 4).
Остальное — по сути генератор CycleGAN для разрешения , но с ядрами при понижении и повышении разрешения: свёртка , две свёртки с шагом (stride) 2, шесть остаточных блоков (residual blocks), две транспонированные свёртки (transposed convolutions) с шагом 2 и свёртка с ; после каждого слоя, кроме последнего, стоит нормализация по экземпляру (instance normalization). У генератора 8.43 млн параметров. Каждый элемент метки добавляет к первой свёртке весов, и больше ничто в генераторе не зависит от числа доменов.
Дискриминатор: настоящее или подделка и какой домен#
Дискриминатор — это шесть свёрток с шагом 2 и LeakyReLU (наклон 0.01) без нормализации, а за ними две головы (heads) на одних и тех же признаках (Choi et al., 2018, таблица 5). , свёртка , оценивает реалистичность; для входа она выдаёт карту на манер PatchGAN, хотя каждое из четырёх значений зависит от всего изображения. — свёртка, ядро которой покрывает всю карту признаков , — выдаёт по одному логиту на каждый элемент метки. Дискриминатору принадлежат 44.76 млн из 53.19 млн параметров модели.
Вторая голова — вспомогательный классификатор (auxiliary classifier) из AC-GAN (Odena, Olah and Shlens, 2017). Он входит в две функции потерь (Choi et al., 2018, формулы 2–3):
Первую минимизирует : на настоящих изображениях он учится предсказывать их истинные метки. Вторую минимизирует : переведённое изображение должно классифицироваться как изображение целевого домена. На подделках классификатор не учится никогда. Он обучается только на настоящих изображениях, поэтому кодирует то, как домены выглядят в данных, и генератор получает награду за то, что воспроизводит именно это.
Что означает , зависит от метки. Для метки в виде one-hot-вектора это вероятность целевого класса после softmax, и от неё — кросс-энтропия. Элементы бинарного вектора атрибутов могут встречаться вместе, поэтому даёт каждому атрибуту собственную сигмоиду и считает атрибуты независимыми при данном изображении. Тогда для логитов , а — сумма бинарных кросс-энтропий (binary cross-entropy); именно её вычисляет для CelebA реализация авторов (Choi, 2018).
Разобранный пример: классификация подделки#
Возьмём игрушечные логиты, которые мог бы выдать для переведённого лица с целью : светлые волосы, мужчина, молодой. Каждый атрибут вносит слагаемое :
| чёрные | светлые | каштановые | мужчина | молодой | |
|---|---|---|---|---|---|
| цель | 0 | 1 | 0 | 1 | 1 |
| логит | −2.0 | 1.5 | −1.0 | 0.5 | 2.0 |
| 0.119 | 0.818 | 0.269 | 0.622 | 0.881 | |
| слагаемое функции потерь | 0.127 | 0.201 | 0.313 | 0.474 | 0.127 |
Сумма равна : классификатор приписывает полной целевой метке вероятность 0.289. Наибольшее слагаемое — пол, в котором классификатор уверен меньше всего. Если бы генератор проигнорировал элементы метки, отвечающие за волосы, и оставил волосы чёрными, логиты чёрных и светлых волос могли бы поменяться местами и стать и , и функция потерь выросла бы до . Градиент проходит через классификатор в и подталкивает волосы к светлому цвету.
Состязательная функция потерь и обратный путь#
Состязательную функцию потерь сначала записывают как стандартную функцию ценности (value function) GAN, , а затем для устойчивости обучения заменяют целевой функцией WGAN-GP (Choi et al., 2018, формула 8):
где берётся на отрезках между настоящими и переведёнными изображениями, а . — критик с вещественным выходом. Дискриминатор максимизирует , а генератор минимизирует, но в функцию потерь генератора входит только второе слагаемое: штраф вычисляется в интерполированных точках, зависящих от , и по нему обучается только дискриминатор.
Ни , ни не упоминают вход: обеим удовлетворяет любое реалистичное изображение домена , каким бы ни был . С этой проблемой CycleGAN столкнулся при одной лишь состязательной функции потерь, и StarGAN применяет то же средство — функцию потерь цикловой согласованности (cycle-consistency loss; Choi et al., 2018, формула 4):
Обратный путь — тот же генератор с исходной меткой . Второй сети, которая отменяла бы действие первой, нет: обратить перевод — значит просто выполнить ещё один перевод. Функции потерь тождественного отображения у StarGAN нет.
Полная целевая функция#
Два игрока минимизируют разные целевые функции (Choi et al., 2018, формулы 5–6):
с и во всех экспериментах. Это не одна минимаксная функция: у каждого игрока своё слагаемое классификации, и каждый его минимизирует. Обучение использует Adam с шагом обучения (learning rate) и betas , пять обновлений критика на одно обновление генератора, как в WGAN-GP, размер батча 16 и случайные горизонтальные отражения. На CelebA (202 599 лиц с 40 бинарными атрибутами, обрезанных с до и уменьшенных до ; 2000 отложены для теста) шаг обучения постоянен первые 10 эпох и линейно убывает до нуля за следующие 10 (разделы 5.2–5.3). Реализация авторов выбирает целевые метки, перемешивая метки батча, так что каждая запрошенная метка — комбинация, которая встречается в данных (Choi, 2018).
Один шаг обучения StarGAN: перевести, обмануть D, вернуться
- Перевести. Генератор получает настоящее изображение и случайную целевую метку , размноженную в постоянные карты и конкатенированную с цветовыми каналами, и выдаёт .
- Обмануть дискриминатор. Критик оценивает подделку, и генератор стремится к высокому значению. Классификатор должен отнести подделку к — это .
- Вернуться. Тот же генератор переводит подделку обратно с исходной меткой , и требует получить вход.
- Обучить дискриминатор. На настоящих изображениях и подделках критик учится ставить настоящим изображениям значения выше, чем подделкам, со штрафом на градиент (gradient penalty); только на настоящих изображениях классификатор учит исходную метку — это .
Обучение на нескольких наборах данных: вектор-маска#
В CelebA размечены цвет волос, пол и возраст; в RaFD (4824 изображения 67 человек, каждый из которых показывает восемь выражений) — выражения лица. Модель, обученная на обоих наборах, могла бы придавать лицам из CelebA выражения, выученные на RaFD. Препятствие — функция потерь реконструкции: ей нужна полная исходная метка , а каждый набор данных знает только свою её часть (Choi et al., 2018, раздел 3.2).
StarGAN дописывает к метке вектор-маску (mask vector) — one-hot-вектор по наборам данных, который указывает, какая часть метки известна, — и обнуляет неизвестные части (формула 7):
Для CelebA и RaFD объединённая метка состоит из элементов. Молодая блондинка из CelebA — это ; запрос «сделай её радостной» — one-hot-вектор радости . Генератор не меняется, кроме ширины входа. Классификатор предсказывает все меток, но на батче из одного набора данных в и входят только выходы для меток этого набора, а обучение чередует наборы данных.
Совместно обученная модель придаёт лицам из CelebA более чёткие выражения, чем модель, обученная только на RaFD, которая не видит ни одного изображения CelebA (раздел 5.6, рисунок 6). Маска используется так, как задумано. Если подать метку выражения с неверной маской , модель игнорирует выражение, читает нулевую часть CelebA как «не молодой» и старит лицо (рисунок 7).
Что даёт один генератор#
- Качество. В опросе пользователей на CelebA, где StarGAN сравнивали с DIAT, CycleGAN и IcGAN, StarGAN получил 66.2% голосов за лучший перевод цвета волос, 39.1% — за лучший перевод пола и 70.6% — возраста (Choi et al., 2018, таблица 1).
- Верные домены. На RaFD при переводе нейтральных лиц в семь других выражений классификатор выражений ResNet-18, который ошибается на 0.45% настоящих тестовых изображений, ошибается на 2.12% переводов StarGAN против 5.99% у CycleGAN, 4.10% у DIAT и 8.07% у IcGAN (таблица 3).
- Размер. Те же семь переводов требуют 53.2 млн параметров у StarGAN и у CycleGAN, примерно в 14 раз больше (таблица 3). Таблицы архитектуры дают 8.43 млн для генератора и 44.76 млн для дискриминатора, всего 53.19 млн.
Авторы объясняют качество многозадачным обучением (multi-task learning): модель, обученная на двух выражениях RaFD, видит около 1000 изображений, StarGAN — около 4000, и выученные им признаки служат всем направлениям (раздел 5.5).
Один выход на изображение и домен#
— функция: одно и то же изображение с одной и той же меткой всегда даёт один и тот же перевод. А домен вмещает много вариантов внешности. «Женщина» — это любая причёска и любой макияж, и StarGAN выбирает для каждого входа один из них. Авторы прямо говорят об этом в следующей статье: генератор получает фиксированную метку и поэтому «при данном исходном изображении неизбежно выдаёт один и тот же выход для каждого домена» (Choi et al., 2020, раздел 1). На CelebA-HQ StarGAN меняет пол лица лишь локально, нанося макияж (раздел 3.1, рисунок 3a).
Очевидное решение — дать генератору ещё и шум. Авторы StarGAN v2 попробовали это: подать в латентный код вместе с доменом и потребовать, чтобы энкодер восстанавливал его, . Выходы стали разнообразными, но коды никак не были привязаны к доменам, поэтому выучили вариации, общие для всех доменов, например цвет, а не присущие отдельному домену, например причёску (раздел 3.1). Сработало другое решение: сначала отобразить шум в стиль конкретного домена.
StarGAN v2: код стиля вместо метки#
Четыре сети#
В StarGAN v2 четыре сети (Choi et al., 2020, раздел 2.1 и приложение E):
- генератор переводит в изображение, отражающее код стиля . Метку домена он не получает: код стиля уже принадлежит домену;
- отображающая сеть превращает латентный код , , в код стиля выбранного домена, . Это MLP с четырьмя общими линейными слоями ширины 512 и, для каждого из доменов, ветвью ещё из четырёх слоёв;
- энкодер стиля извлекает код стиля изображения домена , : шесть общих остаточных блоков и по одной линейной выходной голове на домен;
- дискриминатор устроен так же — та же общая часть и по одному выходу на домен. говорит, является ли настоящим изображением домена .
Два источника стиля дают два способа перевода. По латентному коду (latent-guided): сэмплируем и берём ; каждый даёт другой выход. По образцу (reference-guided): берём настоящее изображение целевого домена и используем ; выход перенимает стиль образца. Новый домен стоит одной ветви (0.82 млн параметров), линейной головы (32 832) и головы (513).
Как входит стиль: AdaIN#
Для канала карты признаков пусть и — его среднее и дисперсия по пространственным позициям одного изображения, а — малая константа ( в InstanceNorm2d из PyTorch), которая не даёт делению обратиться в бесконечность для постоянного канала. Адаптивная нормализация по экземпляру (adaptive instance normalization, AdaIN) заменяет их значениями, вычисленными по стилю:
где и — выученные аффинные функции , свои в каждом слое AdaIN. Масштаб — выученное число, а не стандартное отклонение: ничто не держит его положительным, и отрицательное значение переворачивает канал, давая на выходе стандартное отклонение . Все их смещения инициализируются нулём, кроме смещения масштаба , которое начинается с единицы (Choi et al., 2020, приложения B и E); официальный код записывает масштаб как с нулевым смещением, что равносильно (Clova AI Research, 2020). AdaIN пришла из переноса стиля, где и были стандартным отклонением и средним признаков изображения-стиля (Huang and Belongie, 2017, формула 8); StyleGAN стал вычислять их по выученному вектору стиля (Karras, Laine and Aila, 2019). В генераторе StarGAN v2 блоки понижения разрешения и первые два блока узкого места (bottleneck) используют обычную нормализацию по экземпляру; последние два блока узкого места и все блоки повышения разрешения используют AdaIN, и код стиля входит в каждый из них.
Разобранный пример (игрушечные числа). Канал содержит в четырёх позициях. Его среднее равно , стандартное отклонение — , поэтому нормированные значения равны ; меняет их лишь в шестом знаке после точки. Стиль, дающий и , превращает их в , среднее которых ровно , а стандартное отклонение ровно . Вход дал бы те же нормированные значения: AdaIN отбрасывает входящие среднее и масштаб каждого канала и навязывает те, что выбрал стиль. Стиль действует после нормализации, поэтому, в отличие от конкатенированной метки StarGAN, нормализация не может его стереть.
Одна голова дискриминатора на домен#
Дискриминатор StarGAN отвечал двумя головами на два вопроса: настоящее ли изображение и к какому домену оно относится. Дискриминатор StarGAN v2 задаёт по одному вопросу на домен: настоящее ли это изображение домена ? Каждая голова — бинарный классификатор «настоящее или подделка», и функции потерь классификации нет. Такой многозадачный дискриминатор (multi-task discriminator; Mescheder, Geiger and Nowozin, 2018; Liu et al., 2019) позволяет генератору менять глобальную структуру изображения, а не только локальные детали (Choi et al., 2020, раздел 3.1).
Функции потерь#
Пусть — настоящее изображение домена ; выберем целевой домен и латентный код , а целевой стиль положим равным (Choi et al., 2020, раздел 2.2). Статья обозначает целевые величины тильдой, ; мы оставляем тильду только у домена.
Состязательная функция потерь. Перевод оценивает голова целевого домена (формула 1):
где здесь обозначает вероятность — сигмоиду от логита головы. На практике генератор использует ненасыщающуюся функцию потерь (non-saturating loss) (приложение B).
Восстановление стиля (style reconstruction). Генератор должен использовать код стиля, поэтому энкодер стиля должен уметь прочитать его обратно по выходу (формула 2):
Диверсификация стилей (style diversification). Второй латентный код даёт второй код стиля , и генератор получает награду за то, что два выхода различаются (формула 3):
Это слагаемое максимизируется. В более ранних работах его делили на расстояние между латентными кодами, ; когда два кода близки, отношение становится большим, а его градиенты — неустойчивыми, поэтому StarGAN v2 убирает знаменатель (раздел 2.2). Сверху слагаемое не ограничено, и его вес в ходе обучения линейно уменьшают до нуля (приложение B).
Цикловая согласованность. Выход должен вести обратно ко входу, если дать генератору собственный стиль входа (формула 4):
В StarGAN обратный путь использовал исходную метку , которая говорит только о том, в какой домен вернуться. Здесь он использует оценённый стиль самого , поэтому возврат должен восстановить конкретную внешность входа.
Полная целевая функция. Генератор, отображающая сеть и энкодер стиля играют против дискриминатора (формула 5):
с и на CelebA-HQ, на AFHQ (приложение B). Та же целевая функция обучается и со стилями по образцу, , вместо .
Один шаг обучения StarGAN v2: стиль, перевод и три проверки
- Стиль. Отображающая сеть превращает в код стиля для случайного целевого домена ; в шагах по образцу его вместо этого считывает с изображения-образца энкодер стиля.
- Перевод и проверка. Генератор встраивает через AdaIN и выдаёт ; голова решает, настоящее ли это изображение домена .
- Восстановление стиля. Энкодер стиля должен восстановить по выходу: .
- Цикл. Со стилем самого входа генератор должен перевести выход обратно в : .
- Разнообразие. Второй код даёт второй выход, и поощряет расстояние между двумя выходами.
R1: штраф только на настоящих изображениях#
StarGAN использовал WGAN-GP. StarGAN v2 использует ненасыщающуюся функцию потерь и добавляет к функции потерь дискриминатора штраф R1 (R1 penalty; Mescheder, Geiger and Nowozin, 2018, раздел 4.1, формула 9; Choi et al., 2020, приложение B):
где — логит дискриминатора (для StarGAN v2 — логит головы для настоящего изображения домена ). Штраф действует только на настоящих изображениях и тянет градиент к нулю, а не к норме 1 на интерполированных точках, как в WGAN-GP. Обоснование касается конца обучения. Когда генератор воспроизводит данные, а дискриминатор на них постоянен, дискриминатор с ненулевым градиентом поперёк данных всё ещё мог бы столкнуть генератор с данных; R1 делает такой градиент дорогим. Mescheder et al. доказывают, что обучение GAN со штрафами такого вида с центром в нуле (zero-centered) локально сходится там, где обучение без регуляризации может не сходиться.
Разобранный пример. У дискриминатора с линейным логитом и градиент равен , а . Штраф WGAN-GP равен : наклон в точности такой, какого требует WGAN-GP. R1 с равен : он требует, чтобы дискриминатор был плоским на данных.
Обучение. Размер батча 8, 100 000 итераций (около трёх суток на одной V100), изображения . Adam с betas ; шаг обучения для , и и для . линейно убывает до нуля за 100 000 итераций. При оценке качества используется экспоненциальное скользящее среднее (EMA) весов каждой сети, кроме (Choi et al., 2020, приложение B).
Что даёт каждая часть#
StarGAN v2 строили, добавляя к StarGAN по одному изменению и измеряя каждый шаг на CelebA-HQ, разбитом на домены «мужчины» и «женщины» (Choi et al., 2020, таблица 1). FID измеряет, насколько переводы далеки от настоящих изображений целевого домена (чем ниже, тем лучше); LPIPS здесь — среднее расстояние между выходами, сгенерированными для одного и того же входа (чем выше, тем разнообразнее).
| Конфигурация | FID | LPIPS |
|---|---|---|
| A. StarGAN: WGAN-GP, вспомогательный классификатор, конкатенированная метка | 98.4 | – |
| B. + многозадачный дискриминатор | 91.4 | – |
| C. + штраф R1, AdaIN вместо конкатенации | 80.5 | – |
| D. + латентный код на входе , восстановление латентного кода | 32.3 | 0.312 |
| E. + отображающая сеть и код стиля, восстановление стиля | 17.1 | 0.405 |
| F. + диверсификация стилей: StarGAN v2 | 13.7 | 0.452 |
Конфигурации A–C дают один выход на вход, поэтому значения метрики разнообразия у них нет. Падение от C к D — не признак лучшей модели: D выдаёт десять выходов на вход там, где C выдаёт один, FID по большему числу сгенерированных изображений ниже, и авторы объясняют весь разрыв между C и D числом сэмплов (раздел 3.1). Это смещение FID из-за размера выборки на практике. Среди конфигураций с одинаковым числом выходов и код стиля (от D к E), и слагаемое разнообразия (от E к F) снижают FID и повышают LPIPS. Для сравнения: FID между обучающими и тестовыми изображениями CelebA-HQ равен 14.8. Это не нижняя граница: тестовая выборка мала, и значение StarGAN v2, 13.7, лежит ниже (таблица 2).
По сравнению с моделями для двух доменов, которые уже давали разнообразные выходы, — MUNIT, DRIT и MSGAN, каждая из которых обучается отдельно для каждой пары доменов, — у StarGAN v2 самый низкий FID при переводе по латентному коду: 13.7 против 31.4–52.1 на CelebA-HQ и 16.2 против 41.5–95.6 на AFHQ, наборе из 15 000 морд кошек, собак и диких животных (таблица 2). Его LPIPS — наивысший на CelebA-HQ (0.452), но на AFHQ у MUNIT (0.511) и MSGAN (0.517) значения выше, чем у StarGAN v2 (0.450). Авторы объясняют это паразитными артефактами в выходах этих моделей: артефакты делают выходы разными, и метрика разнообразия засчитывает их как разнообразие.
Как измеряют модели перевода#
Сравнения выше следуют фиксированному протоколу (Choi et al., 2020, приложение C):
- FID для реалистичности. Каждое тестовое изображение исходного домена переводится в целевой домен с 10 случайными латентными кодами, и вычисляется FID между этими переводами и обучающими изображениями целевого домена. Это повторяется для каждой пары доменов, и результаты усредняются. При синтезе по образцу вместо латентных кодов берутся 10 случайных изображений-образцов целевого домена.
- LPIPS для разнообразия. Каждое тестовое изображение получает 10 выходов от 10 случайных латентных кодов. Расстояния LPIPS по всем парам выходов усредняются, и результат усредняется по тестовым изображениям.
Каждое число отвечает на один вопрос и упускает другие. FID никогда не смотрит на вход, поэтому генератор, который игнорирует и выдаёт хорошие лица, получает хорошее значение. Метрика разнообразия поощряет различия любого рода, включая артефакты. Две дополнительные проверки покрывают то, что эти метрики упускают. Первая — домен: узнаёт ли классификатор, обученный на настоящих изображениях, целевой домен в выходе, как в эксперименте StarGAN на RaFD? Вторая — верность входу (faithfulness): сохраняет ли выход то, что не должно меняться, например позу и личность человека на входе? Расстояние между выходом и его собственным входом, такое как LPIPS, измеряет, насколько перевод изменил изображение, а это не реалистичность и не разнообразие. Тождественное отображение получает 0 — идеальное значение, — ничего не переводя. Честный отчёт приводит реалистичность, разнообразие, долю правильно определённых доменов (domain accuracy) и верность входу вместе.
Что считать доменом#
StarGAN и StarGAN v2 понимают метки по-разному. StarGAN принимает вектор атрибутов и может запросить любую их комбинацию, например светлые волосы, мужской пол и пожилой возраст одновременно. StarGAN v2 требует, чтобы каждое изображение принадлежало ровно одному домену: обучающие пары — это с единственным , а , и — головы, индексированные им. Поэтому пересекающиеся атрибуты не являются доменами. В CelebA одно и то же лицо может быть одновременно мужским, молодым и улыбающимся, так что 40 атрибутов не могут служить 40 доменами StarGAN v2. Пригодное разбиение берёт один бинарный атрибут (мужчины и женщины, как для CelebA-HQ в статье), взаимоисключающие значения одного атрибута (чёрные, светлые и каштановые волосы, после удаления изображений, у которых нет ни одного из этих значений или их несколько) или произведения нескольких атрибутов (мужчина или женщина, молодой или пожилой — четыре домена).
Исследование пространства стилей#
Отображающая сеть, вслед за StyleGAN, делает пространство стилей каждого домена выученным преобразованием гауссовского распределения, а не самим гауссовским распределением, и авторы видят в этом одну из причин разнообразия выходов (Choi et al., 2020, раздел 4). Это пространство можно исследовать напрямую. Интерполяция между двумя кодами стиля и или между кодами двух изображений-образцов, с переводом одного и того же входа с каждым промежуточным кодом, показывает, плавно ли меняются выходы и какие атрибуты меняются; авторы показывают такие интерполяции в видео (приложение D). Интерполяция по и по даёт разные пути, потому что нелинейна. Коды стиля, извлечённые из многих настоящих изображений, можно спроецировать на плоскость, например методом главных компонент (PCA), и посмотреть, разделяются ли домены и соответствуют ли направления видимым атрибутам. Замена образцов внутри домена отделяет то, чем управляет код стиля (причёска, макияж, борода, возраст на CelebA-HQ), от того, что сохраняет вход (поза, личность).
Что изменилось#
| CycleGAN | StarGAN | StarGAN v2 | |
|---|---|---|---|
| Сети для доменов | генераторов и дискриминаторов | один , один | по одной сети , , , |
| Условие | нет: одно направление на генератор | целевая метка, размноженная и конкатенированная | код стиля через AdaIN, из или |
| Дискриминатор | по одному на домен, PatchGAN | общий: критик и классификатор | по одной голове «настоящее/подделка» на домен |
| Состязательная функция потерь | наименьшие квадраты | WGAN-GP, | ненасыщающаяся, R1 с |
| Связь со входом | два цикла и функция потерь тождественного отображения | один цикл с исходной меткой , | цикл со стилем входа , |
| Выходов на вход и цель | один | один | много |
| Метки | нет: две неразмеченные коллекции | любая комбинация атрибутов; несколько наборов данных через вектор-маску | один домен на изображение |
Ограничения#
- StarGAN детерминирован. Один выход на изображение и метку; к тому же метка, входящая через конкатенацию, склонна давать локальные правки, а не изменения структуры.
- StarGAN v2 нужно разбиение. Каждое изображение должно принадлежать одному домену, а комбинации атрибутов приходится перечислять как отдельные домены. У вектора-маски StarGAN, объединяющего наборы данных с разными наборами меток, аналога нет.
- Цикл проверяет восстановимость, а не смысл. Как и в CycleGAN, перевод может быть обратимым и всё же неверным или прятать то, что нужно для возврата, в сигналах, невидимых человеку.
- Разнообразием приходится управлять. Слагаемое разнообразия не ограничено сверху и постепенно отключается в ходе обучения. Метрики разнообразия к тому же поощряют артефакты, как показывают результаты на AFHQ.
- Стиль и содержание разделяют функции потерь, а не определение. Что попадёт в код стиля, зависит от данных: порода и шерсть на AFHQ; причёска, макияж, борода и даже возраст на CelebA-HQ.
- Числа зависят от протокола. FID зависит от числа сгенерированных изображений, а расстояние до входа поощряет бездействие; сравнения честны только при одинаковом протоколе.
Итоги#
- Один генератор , получающий на вход целевую метку, заменяет генераторов попарных моделей и учится на изображениях всех доменов.
- Дискриминатор StarGAN состоит из критика WGAN-GP и вспомогательного классификатора доменов . Классификатор обучается на настоящих изображениях (), а генератор должен создавать подделки, которые классификатор относит к цели (). Реконструкция с исходной меткой, , привязывает выход ко входу; , , .
- Вектор-маска отмечает, метки какого набора данных известны, так что одна модель обучается на CelebA и RaFD вместе.
- StarGAN детерминирован. StarGAN v2 заменяет метку кодом стиля из отображающей сети () или энкодера стиля (), встраивает его через AdaIN, судит выходы дискриминатором с одной головой на домен и обучается с восстановлением стиля, диверсификацией стилей, циклом со стилем самого входа и штрафом R1.
- Модели перевода измеряют FID для реалистичности и попарным LPIPS между выходами для разнообразия; доля правильно определённых доменов и верность входу требуют собственных проверок.
Ноутбук#
Этой заметке соответствуют два ноутбука из репозитория HSE-LAMBDA Deep Generative Models: ноутбук о StarGAN, излагающий теорию обеих версий, и ноутбук с заданием 02_hw_StarGAN.ipynb, который предлагает читателю реализовать, обучить и оценить StarGAN на CelebA (ячейки нумеруются с 1, считая все ячейки подряд, включая текстовые). README папки перечисляет статьи о StarGAN и StarGAN v2 рядом с материалами о CycleGAN.
Ноутбук о StarGAN не содержит кода; его единственная ячейка кода (ячейка 6) пуста.
- Ячейки 1–2: введение. Pix2Pix и CycleGAN переводят между двумя доменами; StarGAN обобщает это на много доменов, а StarGAN v2 добавляет разнообразные выходы.
- Ячейка 3: StarGAN. Подсчёт , , дискриминатор с двумя головами, , и , объединённая целевая функция, то, как StarGAN обобщает CycleGAN, и ограничение: один выход на вход и метку. Встроены рисунки 2 и 3 из статьи о StarGAN.
- Ячейка 4: StarGAN v2. , , и ; стили по латентному коду и по образцу; функции потерь — состязательная, восстановления стиля, разнообразия и цикловая — и полная целевая функция; улучшения по сравнению со StarGAN. Встроен рисунок 2 из статьи о StarGAN v2.
- Ячейка 5: заключение.
Проблемы ноутбука о StarGAN:
- Как входит метка. Ячейка 3 говорит, что метка подаётся «via channel-wise concatenation or AdaIN-like normalization in some variations». StarGAN размножает метку по пространству и конкатенирует её с входным изображением; AdaIN — механизм StarGAN v2.
- Состязательная функция потерь и веса. Ячейка 3 называет состязательную функцию потерь «WGAN-GP or similar» и не приводит весов. StarGAN использует WGAN-GP с , а также , .
- Одна целевая функция вместо двух. Ячейка 3 записывает . Дискриминатор минимизирует , а не максимизирует, поэтому статья записывает две целевые функции, и , как в разделе «Полная целевая функция».
- Дискриминатор StarGAN v2. Ячейка 4 описывает его как классифицирующий «real vs. fake and the domain label». У него по одному бинарному выходу «настоящее/подделка» на домен и нет функции потерь классификации; замена вспомогательного классификатора — конфигурация B абляционного исследования.
- Состязательная функция потерь StarGAN v2. Ячейка 4 вводит «the non-saturating GAN loss», но записывает минимаксную функцию ценности и использует и для домена настоящего изображения, и для цели. В статье слагаемое для настоящих изображений использует исходный домен , а слагаемое для подделок — целевой ; ненасыщающаяся версия меняет только слагаемое генератора, на .
- Функция потерь разнообразия. Ячейка 4 говорит, что она «possibly normalized by ». StarGAN v2 убирает этот знаменатель ради устойчивости и линейно уменьшает до нуля.
- Цикловая функция потерь. Ячейка 4 использует стиль «». Это тот же энкодер стиля, считанный на голове исходного домена: .
- Недостающие части. В ячейке 4 нет штрафа R1 и весов функций потерь (, или ).
Ноутбук с заданием состоит из трёх этапов: данные, модель и обучение, оценка и анализ. Он загружает CelebA через CelebADataset из файла репозитория seminars/utils/datasets/celeba.py.
- Ячейки 1–2: заголовок и цель — генерация лиц с заданными атрибутами из CelebA.
- Ячейка 3: подготовка. Устанавливает
lpips, добавляет../../seminars/utils/вsys.path, импортирует torch,LPIPS, преобразования torchvision,Munch,trange, matplotlib, numpy иCelebADatasetи выбирает устройство (CUDA, Apple MPS или CPU). - Ячейка 4: данные.
args.img_size = 256; изображения масштабируются так, чтобы короткая сторона стала равной 256, обрезаются по центру до и нормализуются средним и стандартным отклонением ImageNet. Корень набора данных —../../seminars/data/celeba; если данных нет, вспомогательный модуль заполняет его, скачивая CelebA и файл атрибутов с Google Drive. Размер батча 32, с перемешиванием;num_workersравен 0 на CUDA и 2 в остальных случаях,pin_memoryвключён только на CUDA. - Ячейка 5:
args.num_domains = len(dataset.header)— число названий атрибутов в файле аннотаций, 40. - Ячейки 6–7: сетка случайных изображений, каждое из которых для показа отмасштабировано по своим минимуму и максимуму.
- Ячейки 8–10: модель. Читатель выбирает StarGAN или StarGAN v2. Ячейка 10 готовит контейнер
Munchс закомментированными полямиgenerator,mapping_network,style_encoderиdiscriminator— четырьмя сетями StarGAN v2 под именами из реализации авторов. - Ячейки 11–12: обучение — пустая ячейка для кода читателя.
- Ячейки 13–16: оценка.
LPIPS()с базовой сетью (backbone) AlexNet по умолчанию. Ячейка 16 выполняет 100 итераций; на каждой она берёт три свежих батчаx_real,x_ref,x_ref2и равномерно случайныеy_trgиy_orgизnum_domains, оставляет переводx_fakeчитателю (заглушка сNotImplementedError), добавляет в список LPIPS междуx_fakeиx_real, печатает среднее и проверяет через assert, что оно меньше 1.3. - Ячейки 17–18: один выход. Под
no_gradвыполняется перевод по латентному коду: размераargs.latent_dim,s_trg = mapping_network(z_trg, y_trg),x_fake = generator(x_real, s_trg)(вариант по образцу,style_encoder(x_ref2, y_trg), закомментирован), и выводится изображение второго элемента батча. - Ячейка 19: анализ. Читателю предлагается проанализировать латентное пространство и написать обзор возможных улучшений; разделы «Исследование пространства стилей» и «Ограничения» покрывают и то и другое.
Ни у одного из ноутбуков нет сохранённых выходов, поэтому они документируют процедуры, а не результаты; у ячеек 4 и 12 ноутбука с заданием есть счётчики выполнения, но нет выходов.
Проблемы ноутбука с заданием и его вспомогательного модуля:
- Пути. Ноутбук лежит в
homeworks/, на один уровень ниже корня репозитория, но ячейки 3 и 4 поднимаются на два уровня, к../../seminars/utils/и../../seminars/data/celeba. Изhomeworks/правильные пути —../seminars/utils/и../seminars/data/celeba. - Импорты.
sys.path.appendставит папку вспомогательного модуля в конец списка, поэтому установленный пакет Hugging Facedatasetsзатеняет папкуdatasetsвспомогательного модуля, иfrom datasets.celeba import CelebADatasetзавершается ошибкой;sys.path.insert(0, ...)этого избегает. Вспомогательному модулю нужен ещёgdown, а ячейка 3 не устанавливает ни его, ниmunch. - 40 атрибутов — не 40 доменов. Атрибуты CelebA пересекаются, поэтому они не могут быть доменами StarGAN v2, которому нужен один домен на изображение (см. «Что считать доменом»); StarGAN вместо этого использовал бы бинарный вектор из нескольких атрибутов. Вспомогательный модуль возвращает для каждого изображения словарь, элемент
attributesкоторого содержит все 40 значений в виде — в кодировкеlist_attr_celeba.txt; перед обучением метки нужно перевести в или в индекс домена. Ячейка 16 их отбрасывает (x_real, _ = ...) и выбираетy_orgслучайно, так что «исходный домен» — не доменx_real. - Диапазон пикселей. Нормализация ImageNet переводит пиксели примерно в , а не в . LPIPS ожидает входы в ; генератор StarGAN заканчивается и не может выдать нормализованный диапазон; а ячейка 18 рисует выход генератора, не отменив нормализацию, поэтому
imshowего обрезает.Normalize([0.5] * 3, [0.5] * 3)даёт . - Разрешение. Выровненные изображения CelebA имеют размер , поэтому масштабирование короткой стороны до 256 увеличивает их примерно в 1.44 раза. StarGAN использовал обрезки , уменьшенные до ; StarGAN v2 обучается на CelebA-HQ при разрешении .
- Строка с LPIPS падает.
lpips(x_fake, x_real)возвращает по одному значению на изображение, форма ;.squeeze().item()вызывает ошибку при размере батча 32. Нужно.mean().item(). Кроме того, цикл выполняется безtorch.no_grad()иeval(). - Что измеряет метрика. LPIPS между переводом и его собственным входом измеряет, насколько перевод изменил изображение, а не реалистичность и не разнообразие; если вернуть вход без изменений, получится 0, и проверка будет пройдена. LPIPS в StarGAN v2 — среднее по парам выходов для одного и того же входа (см. «Как измеряют модели перевода»).
- Ячейка 18 зависит от ячейки 16. Она использует
batch_size,y_trgиx_realиз последней итерации ячейки 16 иargs.latent_dim, который не задаёт ни одна ячейка (в StarGAN v2 это 16). - Загрузка данных.
next(iter(dataloader))создаёт новый итератор трижды за шаг оценки, что медленно при работе с процессами-воркерами, а выбор 0 воркеров на CUDA и 2 в остальных случаях выглядит перепутанным.
Дальше#
StarGAN v2 даёт много стилей во многих доменах одним генератором, но это лишь один путь из нескольких. Следующая заметка проходит остальные: разделение каждого изображения на содержание и стиль (MUNIT), отказ от цикла в пользу контрастной функции потерь между фрагментами (CUT), генерация фотографии по карте меток (pix2pixHD, SPADE) и добавление правдоподобных деталей к маленькому изображению (SRGAN, ESRGAN).
Где посмотреть изображения#
Эти модели лучше всего судить по их сэмплам. В каждой строке указано, где их найти; номера рисунков относятся к указанной версии arXiv.
- StarGAN (Choi et al., 2018; arXiv v3): лица CelebA, которым один генератор придаёт выражения из RaFD, — на рисунке 1; перенос одного и нескольких атрибутов на CelebA — на рисунке 4, ещё примеры — на рисунках 9 и 10; выражения RaFD — на рисунках 5 и 11; репозиторий.
- StarGAN v2 (Choi et al., 2020; arXiv v2): разнообразные выходы на CelebA-HQ и AFHQ — на рисунке 1; синтез по образцу — на рисунке 4, ещё примеры — на рисунках 9 и 10; сравнения с базовыми моделями — на рисунках 5 и 6; видеоролик и репозиторий.
Литература#
- Y. Choi, M. Choi, M. Kim, J.-W. Ha, S. Kim, J. Choo. StarGAN: Unified generative adversarial networks for multi-domain image-to-image translation. CVPR, 2018. Номера разделов относятся к arXiv v3: функции потерь — в разделе 3.1 (формулы 1–6), вектор-маска — в разделе 3.2 (формула 7), WGAN-GP и сети — в разделе 4 (формула 8) и приложении 7.2 (таблицы 4–5), наборы данных и обучение — в разделах 5.2–5.3, результаты — в таблицах 1–3 и на рисунках 6–7.
- Y. Choi, Y. Uh, J. Yoo, J.-W. Ha. StarGAN v2: Diverse image synthesis for multiple domains. CVPR, 2020. Номера разделов относятся к arXiv v2: сети и функции потерь — в разделе 2 (формулы 1–5), абляционное исследование — в разделе 3.1 и таблице 1, сравнения — в таблицах 2–3, детали обучения — в приложении B, протокол оценки — в приложении C, архитектуры — в приложении E.
- A. Odena, C. Olah, J. Shlens. Conditional image synthesis with auxiliary classifier GANs. ICML, 2017. Вспомогательный классификатор.
- I. Gulrajani, F. Ahmed, M. Arjovsky, V. Dumoulin, A. Courville. Improved training of Wasserstein GANs. NeurIPS, 2017.
- L. Mescheder, A. Geiger, S. Nowozin. Which training methods for GANs do actually converge?. ICML, 2018. Штраф R1 — в разделе 4.1, формула 9; реализация авторов также стала источником многозадачного дискриминатора, который использует StarGAN v2.
- M.-Y. Liu, X. Huang, A. Mallya, T. Karras, T. Aila, J. Lehtinen, J. Kautz. Few-shot unsupervised image-to-image translation. ICCV, 2019. FUNIT; многозадачный состязательный дискриминатор — в разделе 3.2.
- X. Huang, S. Belongie. Arbitrary style transfer in real-time with adaptive instance normalization. ICCV, 2017. AdaIN, формула 8.
- T. Karras, S. Laine, T. Aila. A style-based generator architecture for generative adversarial networks. CVPR, 2019.
- J.-Y. Zhu, T. Park, P. Isola, A. A. Efros. Unpaired image-to-image translation using cycle-consistent adversarial networks. ICCV, 2017.
- Y. Choi. StarGAN, официальная реализация на PyTorch, 2018.
model.py: размножение метки и замечание о дополнении и нормализации по экземпляру;solver.py: бинарная кросс-энтропия для меток CelebA, выбор целевых меток перемешиванием батча, вектор-маска. - Clova AI Research. StarGAN v2, официальная реализация на PyTorch, 2020.
core/model.py: AdaIN с масштабом , отображающая сеть;core/solver.py: функции потерь и штраф R1. - HSE-LAMBDA, репозиторий курса Deep Generative Models:
StarGAN.ipynb,02_hw_StarGAN.ipynbи вспомогательный модуль набора данныхceleba.py.