14 / 33 · GAN
CycleGAN: перевод изображений без пар
Перевод изображений между двумя доменами без парных примеров: перевод по парам в pix2pix, почему одна лишь состязательная функция потерь не привязывает выход к входу, функции потерь цикловой согласованности и тождественного отображения, что цикл исключает и чего не исключает, генератор ResNet и PatchGAN 70×70, рецепт обучения и типичные сбои.
На этой странице 15
Предыдущая заметка добавила к GAN энкодер, чтобы изображение можно было отобразить в код и обратно. Многие практические задачи начинаются не с шума, а с изображения: превратить фотографию в картину, летний пейзаж в зимний, карту в аэрофотоснимок, лошадь в зебру. Это перевод изображения в изображение (image-to-image translation). Когда обучающие данные состоят из пар, условный GAN учится такому переводу напрямую. Для большинства подобных задач пар не существует: ни у кого нет фотографии той же лошади в виде зебры. CycleGAN (Zhu et al., 2017) обучается на двух непарных коллекциях, по одной на домен. Поверх GAN ему нужна одна идея: перевод изображения в другой домен и обратно должен возвращать оригинал.
Обозначения. Два домена и (лошади и зебры) с распределениями данных и ; изображения , . Два генератора, и , и два дискриминатора: отличает настоящие от переведённых , отличает настоящие от . — сумма модулей попиксельных разностей; реализации усредняют её по пикселям, что лишь меняет масштаб весов слагаемых.
Перевод по парам: pix2pix#
Если есть выровненные пары , например карта границ и фотография, по которой её получили, перевод становится обучением с учителем, и вопрос только в том, какую функцию потерь взять. Одна лишь попиксельная функция потерь, , даёт размытость: там, где правдоподобны несколько выходов, минимизатор функции потерь — их попиксельная медиана, а функции потерь — их среднее, и ни то ни другое не похоже ни на один из них. pix2pix (Isola et al., 2017) добавляет условную состязательную функцию потерь, в которой дискриминатор видит пару или и должен сказать, настоящая ли это фотография для этого входа:
Состязательное слагаемое делает выход чётким, а слагаемое держит его близко к настоящему целевому изображению. Генератор — U-Net, энкодер–декодер с обходными связями (skip connections) между зеркальными слоями, а дискриминатор — дискриминатор по фрагментам (PatchGAN): вместо одного вердикта на изображение он выдаёт сетку вердиктов, по одному на каждый перекрывающийся фрагмент , а функция потерь их усредняет. PatchGAN переходит в CycleGAN без изменений, а U-Net заменяется остаточным генератором (ниже).
Без пар состязательной функции потерь недостаточно#
Без пар для данного нет цели . Остаётся только состязательный сигнал: должно выглядеть как сэмпл из . Эта функция потерь зависит от только через распределение его выходов, поэтому оптимален любой , который переносит в , что бы он ни делал с отдельным изображением. При достаточной ёмкости сеть может отобразить множество фотографий лошадей в любую перестановку фотографий зебр. На практике одна лишь состязательная функция потерь к тому же склонна к коллапсу мод (mode collapse): все входы переходят в одни и те же несколько выходов (Zhu et al., 2017, раздел 1).
Одномерная модель делает проблему конкретной. Пусть «лошади» — это , а «зебры» — . Три отображения выдают выходы в точности с распределением зебр: два детерминированных генератора и, для сравнения, стохастический сэмплер со свежим шумом , не зависящим от :
Что исключает цикловая функция потерь, а что нет
Дискриминатор не может отличить (а), (б) и (в) друг от друга. Только (а) — нужный нам перевод; (в) отбросил всё, что относилось к входу. Отображение (в) лежит вне класса детерминированных генераторов CycleGAN : детерминированный генератор, игнорирующий , был бы константой, а константа не может совпасть с невырожденным распределением. Внутри этого класса отбросить информацию об значит взять отображение «многие в одно», и цикловая функция потерь ниже наказывает его точно так же.
Цикловая согласованность#
Если и переводят в противоположных направлениях, каждый должен отменять действие другого: (прямой цикл, forward cycle) и (обратный цикл, backward cycle). Функция потерь цикловой согласованности (cycle-consistency loss) измеряет оба:
Что она исключает. Нулевое значение функции потерь прямого цикла означает, что для каждого , поэтому инъективен: два разных входа никогда не переходят в один выход, иначе не смог бы восстановить оба. Перевод, который забывает свой вход, нельзя обратить. В игрушечной модели у отображения (в) вообще нет обратного: не зависит от , поэтому лучшее, что может сделать любой , — вернуть медиану , и цикловая ошибка равна . Отображения (а) и (б) обратимы, с и , и их цикловая ошибка равна нулю.
Чего она не исключает. Отображение (б) переворачивает порядок входов и удовлетворяет цикловой согласованности так же, как (а). Цикл требует, чтобы перевод сохранял достаточно информации для обращения; он не говорит, какое из обратимых соответствий правильное. Для изображений выбор делает архитектура. Свёрточный генератор из остаточных блоков (residual blocks; см. ниже) легко представляет тождественное отображение и меняет изображения локально, поэтому решение, которое он находит первым, сохраняет расположение объектов и меняет текстуру и цвет: полосы на лошади, а не другое животное в другой позе. Когда два домена допускают несколько таких соответствий, сеть может выбрать неверное: в задаче фото → карта сегментации CycleGAN иногда меняет местами метки деревьев и зданий (Zhu et al., 2017, раздел 6).
Функция потерь тождественного отображения#
Перевод картин в фотографии выявил ещё одну свободу: генераторы меняли оттенок изображения, когда в этом не было нужды. Дневной пейзаж Моне часто превращался в фотографию заката, и при этом удовлетворялись и состязательная, и цикловая функции потерь. Функция потерь тождественного отображения (identity loss; Taigman et al., 2017) требует, чтобы каждый генератор оставлял без изменений изображение своего целевого домена:
Зебра, поданная генератору «лошадь → зебра», уже зебра, поэтому генератор должен выдать её как есть. Это устраняет изменения общего цвета, которых не требует ни один из доменов. Статья использует эту функцию потерь в задачах с картинами и с улучшением фотографий; распространённые реализации используют её везде.
Полная целевая функция#
CycleGAN: два генератора, два дискриминатора и два цикла
Четыре вида функций потерь на рисунке объединяются в одну целевую функцию:
которую минимизируют по генераторам и максимизируют по дискриминаторам, с и .
- Состязательная, . создаёт ; сравнивает его с настоящими зебрами.
- Прямой цикл. переводит обратно; штрафуется .
- Обратное направление. То же с переставленными ролями: оценивает , а должно совпасть с .
- Тождественное отображение. и .
Нужны оба цикла. С состязательной функцией потерь и только одним циклом обучение часто было неустойчивым и приводило к коллапсу в том направлении, чей цикл убрали (Zhu et al., 2017, раздел 5.1.4).
Сети#
Генератор. Генератор повторяет сеть переноса стиля из работы Johnson et al. (2016). Для изображений :
- свёртка до 64 каналов;
- две свёртки с шагом (stride) 2 до и ;
- девять остаточных блоков размера ;
- две свёртки с шагом (транспонированные свёртки, transposed convolutions) обратно до ;
- свёртка до 3 каналов с .
Каждый остаточный блок вычисляет , где — две свёртки , поэтому блок, у которого близко к нулю, пропускает вход без изменений. В этом и состоит описанная выше склонность к малым локальным изменениям. За каждой свёрткой, кроме выходной, следует нормализация по экземпляру (instance normalization: статистики по каждому изображению и каналу; при одном изображении в батче это естественный выбор, см. заметку о нормализации), а за всеми, кроме выходного слоя и второй свёртки каждого остаточного блока, — ReLU. Дополнение отражением (reflection padding) вместо дополнения нулями (zero-padding) избавляет от тёмных краёв. У генератора 11.38 млн параметров, 93% из них — в остаточных блоках. Для изображений меньшего размера () берут шесть блоков.
Дискриминатор: PatchGAN . Четыре свёртки с 64, 128, 256 и 512 каналами (первые три с шагом 2, последняя с шагом 1; нормализация по экземпляру во всех, кроме первой; LeakyReLU с наклоном 0.2), затем свёртка до одного канала. На изображении он выдаёт карту значений . Каждое значение зависит от окна входа — своего рецептивного поля (receptive field):
где размеры ядер , а шаги . Дискриминатор по фрагментам судит о локальной текстуре, которую и меняет большинство переводов, имеет 2.76 млн параметров и работает на изображениях любого размера. Окно — номинальное рецептивное поле свёрток: состязательная функция потерь явно оценивает локальную текстуру, поэтому глобальная структура остаётся в основном на долю генератора и цикловой функции потерь. Это не предположение о независимости. 900 перекрывающихся оценок не являются независимыми вероятностными множителями, а слои нормализации по экземпляру связывают все позиции через статистики каналов по всему изображению, так что каждая оценка слабо зависит от всего изображения. С двумя генераторами и двумя дискриминаторами у модели 28.3 млн параметров.
Обучение#
- Состязательная функция потерь наименьших квадратов. Отрицательный логарифм правдоподобия стандартного GAN заменяется функцией потерь наименьших квадратов (least-squares loss) из GAN наименьших квадратов (least-squares GAN): минимизирует , а минимизирует . Она даёт генератору градиенты даже для выходов, которые дискриминатор уже считает настоящими, но которые лежат далеко от настоящих данных, и делает обучение устойчивее. Целевая функция дискриминатора делится на 2; статья описывает это как замедление дискриминатора относительно генераторов (раздел 7.1). С Adam это вдвое уменьшает выводимое значение потерь и сырой градиент, но Adam делит каждый шаг на скользящую оценку масштаба градиента, поэтому постоянный множитель в основном сокращается, если не считать малого в знаменателе; эффективный шаг вдвое не уменьшается.
- История сгенерированных изображений. Каждый дискриминатор обновляется на подделках из буфера истории (history buffer), где хранятся 50 ранее сгенерированных изображений, а не только на самой новой подделке (Shrivastava et al., 2017). Когда буфер заполнен, каждая новая подделка с вероятностью заменяет случайную сохранённую, и тогда вместо неё используется старое изображение. Дискриминатор, который видит только текущий генератор, может гоняться за ним по кругу; дискриминатор, который помнит и прежние генераторы, гасит эти колебания.
- Оптимизация. Adam с шагом обучения (learning rate) , размер батча 1, 100 эпох с постоянным шагом и ещё 100 с шагом, линейно убывающим до нуля. Веса инициализируются из .
Результаты#
Два эксперимента из статьи показывают, чего метод достигает и чего нет:
- Реалистичность. В исследовании восприятия на задаче карты ↔ аэрофотоснимки с разрешением участники принимали выходы CycleGAN за настоящие изображения в 26.8% испытаний (карта → фото) и в 23.2% (фото → карта). Более ранние методы без пар обманывали их не более чем в 2.6% испытаний.
- Соответствие входу. На Cityscapes, в задаче метки → фото, предобученная сеть сегментации восстанавливает входные метки по сгенерированным фотографиям. Попиксельная доля правильных ответов (per-pixel accuracy) равна 0.52, а IoU по классам — 0.11 у CycleGAN против 0.71 и 0.18 у pix2pix, обученного на парах. Одна лишь состязательная функция потерь даёт IoU по классам 0.08, одна лишь цикловая — 0.02.
Что изменилось#
| pix2pix | CycleGAN | |
|---|---|---|
| Обучающие данные | выровненные пары | две непарные коллекции |
| Сети | ; видит вход | , , , ; каждый видит один домен |
| Что связывает выход со входом | до истинной цели, | цикловая функция потерь, ; функция потерь тождественного отображения |
| Состязательная функция потерь | условная, логарифм правдоподобия | безусловная для каждого домена, наименьшие квадраты |
| Генератор | U-Net | ResNet с 9 остаточными блоками |
| Дискриминатор | PatchGAN | PatchGAN , буфер истории на 50 изображений |
Ограничения#
- Геометрия. Изменения цвета и текстуры удаются, изменения формы в основном нет. В задаче собака → кошка выученный перевод вырождается в минимальные изменения входа; авторы осторожно связывают это с архитектурой генератора, приспособленной к изменениям внешнего вида.
- Смещение набора данных (dataset bias). Модель лошадь → зебра обучена на диких лошадях и зебрах из ImageNet, среди которых нет всадников, и поэтому покрывает полосами и всадника.
- Разрыв с обучением на парах. Показатели соответствия входу выше остаются намного ниже, чем у pix2pix, а некоторые неоднозначности, например перепутанные метки деревьев и зданий, нельзя разрешить без хотя бы частичной разметки.
- Скрытая информация. Генератор может удовлетворить цикловую функцию потерь, спрятав нужную ему информацию в почти невидимом высокочастотном сигнале на своём выходе, который затем декодирует другой генератор (Chu, Zhmoginov and Sandler, 2017). Тогда цикл согласован, хотя видимый перевод потерял содержание, а малые возмущения могут сильно менять .
- Один выход на вход. Оба генератора детерминированы, поэтому у лошади ровно один вариант в виде зебры, тогда как многие переводы устроены по принципу «один ко многим» (у наброска много вариантов раскраски).
- Одна модель на пару доменов. Для всех пар из доменов нужно CycleGAN с генераторами, и ни один генератор не учится на данных других доменов.
Итоги#
- Без пар состязательная функция потерь ограничивает только распределение выходов; оптимально любое отображение в целевое распределение, включая то, которое игнорирует вход.
- Цикловая функция потерь делает каждый перевод обратимым, так что он сохраняет информацию о входе; выбора среди обратимых соответствий она не делает — его делает склонность архитектуры к малым локальным изменениям.
- Функция потерь тождественного отображения оставляет изображения целевого домена без изменений и предотвращает беспричинные сдвиги цвета; , .
- Сети: генератор ResNet с девятью остаточными блоками и нормализацией по экземпляру; PatchGAN , выдающий значения для сетки фрагментов.
- Обучение: функции потерь GAN наименьших квадратов, буфер истории на 50 подделок, Adam , батч 1, 200 эпох с линейным убыванием шага на последних 100.
- Типичные сбои: геометрические изменения, смещение набора данных, скрытая информация, детерминированные выходы «один к одному» и одна модель на пару доменов.
Ноутбук#
Ноутбук о CycleGAN из репозитория HSE-LAMBDA Deep Generative Models обучает и запускает CycleGAN на horse2zebra (ячейки нумеруются с 1, считая все ячейки подряд, включая текстовые). Сети, набор данных, буфер воспроизведения (replay buffer) и расписание шага обучения взяты из пакета CycleGAN-PyTorch автора Lornatang, закреплённого на одном коммите.
- Ячейки 1–2: метод. Перевод без пар, состязательная и цикловая функции потерь, функция потерь тождественного отображения и полная целевая функция. Текстовые ячейки записывают состязательную функцию потерь через и дискриминатор с выходами в ; код обучения использует форму наименьших квадратов, как и статья на практике.
- Ячейки 3–7: подготовка. Shell-скрипты скачивают набор данных horse2zebra и предобученные веса для всех четырёх сетей. Аргументы: 200 эпох, убывание шага на последних 100, размер батча 1, шаг обучения , размер изображения 256,
args.cuda = False. Начальное значение генератора случайных чисел (seed) выбирается случайно и не печатается. - Ячейки 8–11: данные. Изображения масштабируются до пикселей (бикубической интерполяцией), случайно обрезаются до 256, случайно отражаются и масштабируются в . При
unaligned=Trueкаждой лошади в пару ставится случайная зебра, так что батчи не несут никакого соответствия. Ячейка 11 показывает пять случайных пар. - Ячейки 12–13: модели.
GeneratorиDiscriminatorустроены так, как описано выше: генератор —c7s1-64, d128, d256, 9 × R256, u128, u64, c7s1-3с дополнением отражением и нормализацией по экземпляру. Веса свёрток инициализируются из , а затем во все четыре сети загружаются предобученные веса. - Ячейки 14–18: инференс. Пять зебр, переведённых в лошадей (ячейка 16), и пять лошадей, переведённых в зебр (ячейка 18), предобученными генераторами.
- Ячейки 19–20: функции потерь и оптимизаторы.
- Цикловая функция потерь с весом 10, функция потерь тождественного отображения с весом 5,
MSELossдля состязательных слагаемых. - Один оптимизатор Adam для обоих генераторов и по одному на каждый дискриминатор, все с betas .
LambdaLRс множителем на эпохе : 1 до эпохи 100, 0.5 на эпохе 150, 0.01 на эпохе 199.- Два
ReplayBufferна 50 изображений, которые работают так, как описано в разделе «Обучение».
- Цикловая функция потерь с весом 10, функция потерь тождественного отображения с весом 5,
- Ячейки 21–22: цикл обучения.
- Каждый шаг сначала обновляет генераторы по сумме двух функций потерь тождественного отображения, двух состязательных (целевая метка 1) и двух цикловых.
- Затем он обновляет и на настоящем изображении (метка 1) и подделке из буфера (метка 0), причём каждая функция потерь делится пополам.
- Индикатор прогресса печатает функцию потерь дискриминатора, общую, тождественного отображения, GAN и цикловую. Планировщики шага обучения делают шаг раз в эпоху.
Сохранённые выходы. Выход сохранён только у ячейки 16: пять переводов зебра → лошадь предобученным генератором. Цикл обучения не запускался, поэтому значений функций потерь и сэмплов из обучения нет.
Проблемы ноутбука.
- Усреднённые значения по фрагментам.
Discriminator.forwardусредняет карту значений в одно число до вычисления функции потерь, поэтому состязательная функция потерь равна , где — среднее значение по фрагментам, а не среднему по фрагментам , как в эталонной реализации. Они различаются на дисперсию значений: . Усреднённая функция потерь требует, чтобы настоящим выглядел не каждый фрагмент, а только их среднее, и это ослабляет PatchGAN. - Устройство.
args.cuda = Falseдержит всё на CPU, даже когда есть GPU (ячейка 9 лишь печатает предупреждение), и 200 эпох становятся непрактичными. На машине с GPU значение нужно заменить наTrue. - Обучение начинается с предобученных весов. Ячейка 13 загружает их до цикла обучения, поэтому ячейка 22 дообучает предобученную модель, хотя ячейка 21 говорит об обучении с нуля. Чтобы обучать с нуля, пути к весам нужно оставить пустыми.
- Неиспользуемые списки потерь.
g_losses,d_lossesи другие списки в ячейке 22 создаются, но не заполняются, поэтому для графиков ничего не записывается.
Дальше#
CycleGAN переводит между двумя доменами с помощью двух генераторов. Для десяти доменов, например десяти цветов волос или выражений лица, понадобилось бы 45 CycleGAN и 90 генераторов, каждый из которых обучен только на данных двух доменов. Следующая заметка заменяет их одним генератором, который получает целевой домен на вход.
Где посмотреть изображения#
Эти модели лучше всего судить по их сэмплам. В каждой строке указано, где их найти; номера рисунков относятся к указанной версии arXiv.
- pix2pix (Isola et al., 2017; arXiv v3): одна модель на многих задачах с парами — на рисунке 1; влияние слагаемых L1 и cGAN — на рисунке 4; Cityscapes, фасады, день → ночь, границы → сумки и границы → обувь — на рисунках 13–17; неудачные случаи — на рисунке 21; страница проекта.
- CycleGAN (Zhu et al., 2017; arXiv v7): Моне ↔ фотография, зебра ↔ лошадь и лето ↔ зима — на рисунке 1; сравнения на Cityscapes и Google Maps — на рисунках 5 и 6; перенос стиля коллекции — на рисунках 10 и 11; лошадь ↔ зебра и другие задачи — на рисунке 13; неудачные случаи, в том числе собака → кошка, — на рисунке 17; страница проекта.
Литература#
- J.-Y. Zhu, T. Park, P. Isola, A. A. Efros. Unpaired image-to-image translation using cycle-consistent adversarial networks. ICCV, 2017. Номера разделов относятся к расширенной версии arXiv (v7): функции потерь — в разделе 3, реализация — в разделе 4 и приложении 7, абляционное исследование — в разделе 5.1.4, ограничения — в разделе 6.
- P. Isola, J.-Y. Zhu, T. Zhou, A. A. Efros. Image-to-image translation with conditional adversarial networks. CVPR, 2017. pix2pix: условная целевая функция с (раздел 3.1), U-Net и PatchGAN (раздел 3.2).
- J. Johnson, A. Alahi, L. Fei-Fei. Perceptual losses for real-time style transfer and super-resolution. ECCV, 2016. Остаточный генератор.
- Y. Taigman, A. Polyak, L. Wolf. Unsupervised cross-domain image generation. ICLR, 2017. Регуляризатор тождественного отображения.
- X. Mao, Q. Li, H. Xie, R. Y. K. Lau, Z. Wang, S. P. Smolley. Least squares generative adversarial networks. ICCV, 2017.
- A. Shrivastava, T. Pfister, O. Tuzel, J. Susskind, W. Wang, R. Webb. Learning from simulated and unsupervised images through adversarial training. CVPR, 2017. История сгенерированных изображений.
- D. Ulyanov, A. Vedaldi, V. Lempitsky. Instance normalization: the missing ingredient for fast stylization. arXiv:1607.08022, 2016.
- C. Chu, A. Zhmoginov, M. Sandler. CycleGAN, a master of steganography. NIPS Workshop on Machine Deception, 2017.
- Lornatang. CycleGAN-PyTorch, реализация, которую использует ноутбук.
- HSE-LAMBDA, репозиторий курса Deep Generative Models:
CycleGAN.ipynb.