Задача трансляции изображений — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Добавлен пример в начало.)
м (rollbackEdits.php mass rollback)
 
(не показаны 183 промежуточные версии 10 участников)
Строка 1: Строка 1:
 +
{{В разработке}}
 +
 
{{Определение
 
{{Определение
 
|definition =
 
|definition =
'''Задача трансляции изображения (англ. Image-to-image translation)''' — это область задач компьютерного зрения, цель которой состоит в том, чтобы научиться строить соответствия между входным и выходным изображениями, используя тренировочные данные. <br>
+
'''Задача трансляции изображения (англ. Image-to-image translation)''' — это задача из области [[ Компьютерное зрение| компьютерного зрения]], цель которой состоит в том, чтобы научиться строить соответствия между входным и выходным изображениями, используя тренировочные данные.
 +
}}
 
Другими словами, задача состоит в том, чтобы научиться преобразовывать изображение из одной области в другую, получая в итоге изображение со стилем (характеристиками) последней.
 
Другими словами, задача состоит в том, чтобы научиться преобразовывать изображение из одной области в другую, получая в итоге изображение со стилем (характеристиками) последней.
}}
 
  
[[Файл:Horse2zebra.gif|600px|thumb|right|Пример работы задачи трансляции изображения (CycleGAN)<ref>[https://github.com/junyanz/CycleGAN CycleGAN {{---}} GitHub]</ref> : взять лошадь и превратить ее в зебру, и наоборот.]]
+
[[Файл:Horse2Zebra.png|thumb|right|Рис. 1. Пример трансляции изображения: превращение лошади в зебру.<ref name="cycle">[https://github.com/junyanz/CycleGAN CycleGAN {{---}} GitHub]</ref>]]
  
 
== Описание задачи ==
 
== Описание задачи ==
  
=== Обучение на парных изображениях ===
+
Задача разделяется на два типа в зависимости от тренировочных данных. <br>
 +
В одном случае, у нас есть четкое представление результата, который должен получиться, а в другом случае, его нет, но есть множество, определяющее стиль желаемого результата (Рис. 2).
 +
 
 +
[[File:Paired_vs_unpaired_training_data.png|400px|right|thumb|Рис. 2. Виды тренировочных данных для трансляции изображений. <ref name="towardsdatascience2">[https://towardsdatascience.com/cyclegan-how-machine-learning-learns-unpaired-image-to-image-translation-3fa8d9a6aa1d CycleGAN {{---}} Towardsdatascience]</ref>]]
 +
 +
=== Обучение на парах изображений ===
 +
 
 +
'''Алгоритм трансляции изображений, обученный на парах изображений''' — это алгоритм трансляции одного изображения в другое, где тренировочные данные состоят из множества, в котором каждому входному изображению соответствует выходное изображение, содержащее первое с другим стилем.
 +
 
 +
Примерами приложения этого алгоритма являются следующие трансляции изображений:
 +
* черно-белое изображение {{---}} цветное;
 +
* сегментация изображения (англ. segmentation map) {{---}} реальная картинка;
 +
* линии-края (англ. edges) {{---}} фотография;
 +
* генерация разных поз и одежды на человеке;
 +
* описывающий изображение текст {{---}} фотография.
 +
Некоторые примеры изображены на Рис. 3.
 +
[[File:Examples_paired_translation.jpg|700px|center|thumb|Рис. 3. Примеры применения алгоритма трансляции изображений, обученном на парных тренировочных данных. (Pix2Pix)<ref name="pix">[https://github.com/phillipi/pix2pix Pix2Pix {{---}} GitHub]</ref>]]
 +
 
 +
=== Обучение на независимых множествах ===
 +
 
 +
'''Алгоритм трансляции изображений, обученный на двух независимых множествах''' — это такой алгоритм трансляции изображений, тренировочные данные которого состоят из двух независимых групп, описывающих свой стиль, цель которого научиться отображать одну группу в другую так, чтобы содержание изображений (общее) сохранялось, а стиль (уникальные элементы изображений) переносился.
 +
 
 +
Пример:
 +
* тренировочные данные {{---}} два множества: <code>{реальные фотографии}, {картины К. Моне}</code>;
 +
* приложение {{---}} взяли любую фотографию, например, поле с цветами; получили поле с цветами в стиле К. Моне.
  
=== Обучение на непарных изображениях ===  
+
[[File:Examples_unpaired_translation.jpeg|700px|center|thumb|Рис. 4. Примеры применения алгоритма трансляции изображений, обученном на двух независимых множествах. (CycleGan)<ref name="cycle">[https://github.com/junyanz/CycleGAN CycleGAN {{---}} GitHub]</ref>]]
  
 
== Pix2Pix ==
 
== Pix2Pix ==
 +
 +
Pix2Pix<ref name="pix">[https://github.com/phillipi/pix2pix Pix2Pix {{---}} GitHub]</ref> {{---}} это подход для трансляции изображений с помощью глубоких [[:Сверточные нейронные сети|сверточных нейронных сетей]].
 +
 +
=== Архитектура ===
 +
 +
[[File:Training_CGAN_pix2pix.png|400px|right|thumb|Рис. 5. Пример процесса обучения генератора и дискриминатора для Pix2Pix. <ref name="towardsdatascience">[https://towardsdatascience.com/pix2pix-869c17900998 Pix2Pix {{---}} Towardsdatascience]</ref>]]
 +
 +
Pix2Pix реализует архитектуру [[Generative Adversarial Nets (GAN)#CGAN_.28Conditional_Generative_Adversarial_Nets.29| условных порождающих состязательных сетей ]](англ. CGAN), где для генератора взята архитектура, основанная на U-Net<ref name="unet">[https://sci-hub.do/10.1007/978-3-319-24574-4_28 U-Net: Convolutional Networks for Biomedical Image Segmentation]</ref>, а для дискриминатора используется сверточный классификатор PatchGAN<ref name="patch">[https://sci-hub.do/10.1007/978-3-319-46487-9_43 Precomputed Real-Time Texture Synthesis with Markovian Generative Adversarial Networks]</ref>, который штрафует алгоритм на уровне участков изображения.
 +
 +
Генератор CGAN'a работает следующим образом: на вход подается one-hot вектор класса x и вектор шума z, в результате прохода через условный генератор выдается сгенерированное изображение этого класса. Таким образом, генератор можно представить, как следующую функцию: <tex>G: \{x,z\} \to y</tex>. <br>
 +
Генератор Pix2Pix работает cхожим образом, но вместо вектора класса подается изображение, а вектор шума и вовсе убирается, потому что он не вносит достаточно стохастичности в результат работы генератора.
 +
 +
Генератор обучается создавать максимально правдоподобные выходные изображения, дискриминатор же учится как можно лучше отличать фальшивые изображения от реальных.
 +
==== Генератор ====
 +
 +
[[File:U-Net-Generator-Model.png|400px|right|thumb|Рис. 6. Архитектура Pix2Pix генератора. <ref name="machinelearningmastery">[https://machinelearningmastery.com/how-to-implement-pix2pix-gan-models-from-scratch-with-keras/ Pix2Pix GAN Models {{---}} Machine Learning Mastery]</ref>]]
 +
 +
Для генератора Pix2Pix используется U-net-генератор.<br>
 +
'''U-net-генератор'''<ref name="unet">[https://sci-hub.do/10.1007/978-3-319-24574-4_28 U-Net: Convolutional Networks for Biomedical Image Segmentation]</ref> {{---}} это модель encoder-decoder с добавлением пропускаемых соединений (англ. ''skip-connections'') между зеркальными слоями в стеках кодировщика и декодера.
 +
 +
Алгоритм работы генератора:
 +
* на вход подается изображение;
 +
* далее последовательно применяются свертка, [[Batch-normalization | батч-нормализация]] (англ. Batch Norm layer), функция активации LeakyReLU и пулинг, что, тем самым, уменьшает количество признаков;
 +
* при этом, следуя архитектуре U-net, добавляются пропускаемые соединения между каждым слоем <tex>i</tex> и слоем <tex>n - i</tex>, где <tex>n</tex> {{---}} общее количество слоев; каждое пропускаемое соединение просто объединяет все каналы на уровне <tex>i</tex> с другими на слое <tex>n - i</tex>; таким образом, информация, которая могла быть сильно сжата (потеряна), может доходить до некоторых более поздних слоев;
 +
* после того, как получен слой минимального размера, начинается работа декодера, который делает то же, что и кодировщик, с отличием в слое, обратном пулингу, который увеличивает количество признаков;
 +
* также в декодере добавляется dropout, чтобы достигнуть стохастичности на выходе генератора.
 +
 +
Генератор должен не только обмануть дискриминатор, но и приблизиться к истине, поэтому его '''функция ошибки''' выглядит следующим образом: <br>
 +
<tex>L(G) = BCE\,Loss</tex><ref>[https://towardsdatascience.com/understanding-binary-cross-entropy-log-loss-a-visual-explanation-a3ac6025181a BCE Loss {{---}} towardsdatascience]</ref> <tex>+\,\lambda*\sum_{i=1}^{n}|generated\_output - real\_output|</tex>,  где <tex>|generated\_output - real\_output|</tex> {{---}} попиксельная разница.
 +
 +
==== Дискриминатор ====
 +
 +
[[File:The-PatchGAN-structure-in-the-discriminator-architecture.png|400px|right|thumb|Рис. 7. Архитектура PatchGAN дискриминатора. <ref name="researchgate">[https://www.researchgate.net/figure/The-PatchGAN-structure-in-the-discriminator-architecture_fig5_339832261 The PatchGAN structure {{---}} ResearchGate]</ref>]]
 +
 +
Для дискриминатора данной сети используется сверточный дискриминатор PatchGAN.
 +
 +
'''PatchGAN дискриминатор'''<ref name="patch">[https://sci-hub.do/10.1007/978-3-319-46487-9_43 Precomputed Real-Time Texture Synthesis with Markovian Generative Adversarial Networks]</ref> {{---}} это тип дискриминатора для генеративных состязательных сетей, который штрафует алгоритм на уровне локальных фрагментов (патчей).<br>
 +
Дискриминатор PatchGAN пытается определить, является ли каждый фрагмент размера <tex>N\times N</tex> изображения настоящим или поддельным. Этот дискриминатор сверточно запускается по изображению, усредняя все ответы, чтобы посчитать окончательный результат <tex>D</tex>.<br>
 +
Проще говоря, для каждого фрагмента определяется матрица классификаций, где все значения находятся в промежутке <tex>[0,1]</tex>, где <tex>0</tex> {{---}} подделка. Проходясь сверткой, в итоге получаем конечную матрицу классификаций. Таким образом, для поддельного изображения от генератора PatchGan должен попытаться вывести матрицу нулей. <br>
 +
Интересно, что <tex>N</tex> может быть намного меньше полного размера изображения и при этом давать результаты высокого качества. Это выгодно, потому что меньший PatchGAN имеет меньше параметров, работает быстрее и может применяться к изображениям большого размера.<br>
 +
Такой дискриминатор эффективно моделирует изображение как Марковское случайное поле<ref>[https://en.wikipedia.org/wiki/Markov_random_field Markov random field {{---}} Wikipedia]</ref>, предполагая независимость между пикселями, разделенных диаметром более одного фрагмента.
 +
 +
==== Полное описание архитектуры ====
 +
 +
Для того, чтобы описать полный порядок работы Pix2Pix, обратимся к примеру:
 +
 +
Пусть у вас есть набор пар, состоящий из реальных фотографий и их сегментаций. Задача состоит в том, чтобы  научиться генерировать из сегментированных изображений реальные.
 +
* помещается сегментированное изображение в генератор U-Net, и он генерирует некоторый выход;
 +
* дальше сгенерированное изображение соединяется с исходным входным сегментированным изображением, и это все идет в PatchGan дискриминатор, который выводит матрицу классификации, состоящую из значений между 0 и 1, которая показывает, насколько реальны или поддельны разные части этого изображения;
 +
* затем для вычисления ошибки дискриминатора проводится 2 сравнения:
 +
** сравнение матрицы классификации от {объединения сгенерированного изображения с исходным входным сегментированным изображением} с матрицей из всех 0;
 +
** матрицы классификация от {объединения реального изображения с исходным входным сегментированным изображением} с матрицей из всех 1;
 +
* затем для вычисления ошибки генератора проводится сравнение матрицы классификации от {объединения сгенерированного изображения с исходным входным изображением} с матрицей из всех 1, которое считается с помощью BCE Loss, которое впоследствии суммируется с попиксельным сравнением реального изображения со сгенерированным, домноженным на <tex>\lambda</tex>;
 +
 +
[[File:Pix2pix-UNet-128-GAN-network-architecture.png|700px|center|thumb|Рис. 8. Архитектура Pix2Pix. <ref name="researchgate2">[https://www.researchgate.net/figure/Pix2pix-UNet-128-GAN-network-architecture_fig2_324962509 Pix2pix UNet_128 GAN network architecture {{---}} ResearchGate]</ref>]]
 +
 +
=== Примеры ===
 +
 +
Для тестирования решения были проведены следующие эксперименты:
 +
* сегментированные изображения <tex>\leftrightarrow</tex> фотографии;
 +
* нарисованная карта <tex>\leftrightarrow</tex> фотоснимок;
 +
* черно-белые фотографии <tex>\to</tex> цветные фотографии;
 +
* линии-края <tex>\to</tex> фотографии;
 +
* эскизы-рисунки <tex>\to</tex> фотографии;
 +
* день <tex>\to</tex> ночь;
 +
и так далее.
 +
 +
[[File:Pix2pix_examples.png|800px|center|thumb|Рис. 9. Примеры Pix2Pix. <ref>[https://sh-tsang.medium.com/review-pix2pix-image-to-image-translation-with-conditional-adversarial-networks-gan-ac85d8ecead2 Sik-Ho Tsang]</ref>]]
  
 
== Pix2PixHD ==
 
== Pix2PixHD ==
 +
 +
[[File:Generator_pix2pixhd.png|400px|right|thumb|Рис. 10. Генератор Pix2PixHD. <ref name="towardsdatascience">[https://towardsdatascience.com/pix2pix-869c17900998 Pix2Pix {{---}} Towardsdatascience]</ref>]]
 +
 +
Pix2PixHD<ref name="Pix2PixHD">[https://github.com/NVIDIA/pix2pixHD Pix2PixHD {{---}} GitHub]</ref>{{---}} нейронная сеть, основанная на архитектуре Pix2Pix, которая является новым удачным подходом для решения задачи получения изображений высокого разрешения из сегментированных изображений.
 +
 +
Основа Pix2Pix была улучшена за счет изменений в генераторе, дискриминаторе и функции ошибки.
 +
 +
'''Генератор''' был разбит на две подсети <tex>G_1</tex> и <tex>G_2</tex> так, что первая приняла роль глобальной сети генератора, а вторая стала локальным усилителем сети. Таким образом, генератор стал задаваться набором <tex>G = \{G1, G2\}</tex>. Глобальная сеть генератора работает с изображениями с разрешением <tex>1024 × 512</tex>, в то время как локальный усилитель сети принимает на вход изображения с разрешением в 4 раза больше размера вывода предыдущей сети. Для получения изображений большего разрешения могут быть добавлены дополнительные локальные усилители сети.
 +
 +
Чтобы различать реальные и синтезированные изображения с высоким разрешением, дискриминатор должен иметь большое поле восприятия. Для этого потребуется либо более глубокая сеть, либо более крупные сверточные ядра, оба из которых увеличат емкость сети и потенциально могут вызвать переобучение. Кроме того, оба варианта требуют большего объема памяти для обучения, что уже является дефицитным ресурсом для создания изображений с высоким разрешением. Для решения проблемы предлагаем используется '''3 дискриминатора''', которые имеют идентичную структуру сети, но работают с разными масштабами изображения<ref name="Pix2PixHDPaper">[https://arxiv.org/pdf/1711.11585.pdf High-Resolution Image Synthesis and Semantic Manipulation with Conditional GANs]</ref>.
 +
 +
'''Функция ошибки''' была улучшена за счет добавления ошибки (feature matching loss) в разных масштабах изображения для каждого дискриминатора <tex>\sum_{k=1}^{3} L_{FM}(G, D_k)</tex>, для вычисления которой будем использовать  выдаваемые значения дискриминатора на разных слоях изображения: <tex>L_{FM}(G, D_k) = \mathbb{E}_{(s,x)}\sum_{i=1}^{T}\frac{1}{N_i}[||D_k^{(i)}(s,x) - D_k^{(i)}(s, G(s))||]</tex>, где <tex>T</tex> {{---}} количество слоев, <tex>N_i</tex> {{---}} количество элементов в каждом слое, <tex>s</tex> {{---}} исходное сегментированное изображение, <tex>x</tex> {{---}} соответствующее реальное изображение, <tex>G(s)</tex> {{---}} сгенерированное изображение.
 +
 +
На рисунках 11 и 12 приведены примеры генерации изображения по входным сегментированным изображениям с применением различных стилей.
 +
 +
[[File:City_pix2pixhd.gif|600px|center|thumb|Рис. 11. Пример работы Pix2PixHD {{---}} label-to-streetview.<ref name="Pix2PixHD">[https://github.com/NVIDIA/pix2pixHD Pix2PixHD {{---}} GitHub]</ref>]]
 +
 +
[[File:Face_pix2pixhd.gif|600px|center|thumb|Рис. 12. Пример работы Pix2PixHD {{---}} label-to-face. <ref name="Pix2PixHD">[https://github.com/NVIDIA/pix2pixHD Pix2PixHD {{---}} GitHub]</ref>]]
 +
 +
== CycleGAN ==
 +
[[File:CycleGAN Arxitecture.jpeg|390px|right|thumb|Рис. 13. Алгоритм CycleGAN <ref name="Алгоритм CycleGAN">[https://habr.com/ru/post/479218/  Алгоритм CycleGAN]</ref>]]
 +
Нейронная сеть, в отличии от описанной выше Pix2Pix позволяет реализовать решение задачи обучения на независимых множествах. Обычно применяются для задач изменения стиля фотографий.
 +
 +
=== Архитектура ===
 +
'''CycleGAN'''<ref name=" Cycle-Consistent Adversarial Networks">[https://arxiv.org/abs/1703.10593  Cycle-Consistent Adversarial Networks]</ref> реализует архитектуру циклически-согласованных состязательных сетей (англ. {{---}} ''Cycle-Consistent Adversarial Networks''), суть которой состоит в решении проблемы отсутствия парного набора данных.
 +
 +
В Архитектуре присутствуют 2 генератора и 2 дискриминатора которые выполняют различные задачи:
 +
*Генератор <math>G_{A}</math> учится преобразовывать исходное изображение <math>X</math> в выходное изображение <math>Y</math>
 +
*Генератор <math>G_{B}</math> учится преобразовывать выходное изображение <math>Y</math> в исходное изображение <math>X</math>
 +
*Дискриминатор <math>D_{A}</math> учится различать изображение <math>X</math> и сгенерированное изображение <math>X ( G_{B}(Y) )</math>
 +
*Дискриминатор <math>D_{B}</math> учится различать изображение <math>Y</math> и сгенерированное изображение <math>Y ( G_{A}(X) )</math>
 +
Структура генератора состоит из кодировщика (англ. {{---}} ''Encoder''), создающего функцию особенностей из исходного изображения, трансформатора (англ. {{---}} ''Transformation''), изменяющего функцию особенностей для создания сгенерированного изображения, и декодера (англ. {{---}} ''Decoder''), возвращающего функцию особенностей обратно в формат изображения. Структура дискриминатора состоит из декодера, извлекающего особенности из входного изображения, и классификатора, определяющего сгенерировано ли изображение.
 +
[[File:Generator.jpeg|390px|right|thumb|Рис. 14. Архитектура Генератора  <ref name="how CycleGAN works"></ref>]]
 +
[[File:Discriminator.jpeg|390px|right|thumb|Рис. 15. Архитектура Дискриминатора <ref name="how CycleGAN works"></ref>]]
 +
Реализация элементов дискриминатора и генератора аналогичны тем, которые используются в Pix2Pix.
 +
 +
'''Сеть''' предоставляет подход перевода изображения из исходного домена  <math>X</math> в целевой домен <math>Y</math> при отсутствии парных примеров. Цель задачи в изучении отображения <math>G{A}: X → Y </math>, так, чтобы распределение изображений <math>G_{A}(X)</math> было неотличимо от распределения <math>G_{B}(Y)</math> с учетом состязательной потери (aнгл. {{---}} ''Сonsistency loss'').
 +
Также чтобы избежать коллапса мод<ref name="Mode Collapse">[http://neerc.ifmo.ru/wiki/index.php?title=Generative_Adversarial_Nets_(GAN)#.D0.A3.D0.BB.D1.83.D1.87.D1.88.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BE.D0.B1.D1.83.D1.87.D0.B5.D0.BD.D0.B8.D1.8F_GAN Улучшение обучения GAN]</ref>(англ. {{---}} ''Mode collapse''), следует проверить отображение  <math>G : Y → X </math>, который пытается сопоставить <math>Y</math> и <math>X</math>.
 +
 +
Другими словами для выполнения успешного преобразования должно выполниться следующее условие <math>G_{B}(G_{A}(X)) \sim X + Loss_{full}. </math>
 +
 +
==== Функция потери ====
 +
Функция потери<ref name="Cyclic_loss">[https://towardsdatascience.com/a-gentle-introduction-to-cycle-consistent-adversarial-networks-6731c8424a87  Cyclic_loss]</ref> должна быть выполнена таким образом, что
 +
все отображения должны быть противоположными друг другу и взаимно однозначными.
 +
 +
Она состоит из потери согласованности цикла (англ. {{---}} ''Cycle Consistency Loss'') и состязательной потери (англ. {{---}} ''Adversarial loss'').
 +
 +
<tex>Loss_{adv}(G,D_{B},X) = \frac{1}{m}(\sum_{i=1}^m(1 -D_{B}(G_{Xi})))*2</tex>
 +
 +
<tex>Loss_{adv}(F,D_{A},Y) = \frac{1}{m}(\sum_{i=1}^m(1 -D_{A}(F_{Yi}))*2</tex>
 +
 +
<tex>Loss_{cyc}(G,F,X,Y) = \frac{1}{m}\sum_{i=1}^m(F(G(Xi) - Xi) + (G(F(Yi)) - Yi))</tex>
 +
 +
<tex>Loss_{full} = Loss_{adv} + \lambda * Loss_{cyc}</tex>,
 +
 +
где <tex>\lambda</tex> {{---}} гиперпараметр для уравнения потери согласованности цикла
 +
 +
 +
[[File:Doge starrynight.jpg|700px|center|thumb|Рис. 16. Пример работы CycleGAN  <ref name="how CycleGAN works">[https://towardsdatascience.com/cyclegan-how-machine-learning-learns-unpaired-image-to-image-translation-3fa8d9a6aa1d  Пример работы CycleGAN]</ref>]]
 +
[[File:Comics.png|700px|center|thumb|Рис. 17. Пример работы CycleGAN  <ref name="Алгоритм CycleGAN"></ref>]]
  
 
== См. также ==
 
== См. также ==
 +
* [[Компьютерное зрение]]
 +
* [[Generative Adversarial Nets (GAN)]]
 +
* [[Сверточные нейронные сети]]
 +
* [[Сегментация изображений]]
  
 
== Примечания ==
 
== Примечания ==
Строка 23: Строка 181:
  
 
== Источники информации ==
 
== Источники информации ==
 +
 +
* [https://arxiv.org/abs/1611.07004 Image-to-Image Translation with Conditional Adversarial Networks]
 +
* [https://arxiv.org/abs/1711.11585 High-Resolution Image Synthesis and Semantic Manipulation with Conditional GANs]
 +
* [https://arxiv.org/abs/1805.03189 Learning image-to-image translation using paired and unpaired training samples]
 +
* [https://arxiv.org/abs/1703.10593v6 Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks]
 +
* [https://www.coursera.org/learn/apply-generative-adversarial-networks-gans/home/welcome Apply Generative Adversarial Networks (GANs) {{---}} Coursera]
  
 
[[Категория:Машинное обучение | ]]
 
[[Категория:Машинное обучение | ]]
 +
[[Категория:Компьютерное зрение | ]]
 +
[[Категория:Сверточные нейронные сети | ]]
 +
[[Категория:Глубокое обучение | ]]
 
[[Категория:{{BASEPAGENAME}}]]
 
[[Категория:{{BASEPAGENAME}}]]

Текущая версия на 19:30, 4 сентября 2022

Эта статья находится в разработке!


Определение:
Задача трансляции изображения (англ. Image-to-image translation) — это задача из области компьютерного зрения, цель которой состоит в том, чтобы научиться строить соответствия между входным и выходным изображениями, используя тренировочные данные.

Другими словами, задача состоит в том, чтобы научиться преобразовывать изображение из одной области в другую, получая в итоге изображение со стилем (характеристиками) последней.

Рис. 1. Пример трансляции изображения: превращение лошади в зебру.[1]

Описание задачи

Задача разделяется на два типа в зависимости от тренировочных данных.
В одном случае, у нас есть четкое представление результата, который должен получиться, а в другом случае, его нет, но есть множество, определяющее стиль желаемого результата (Рис. 2).

Рис. 2. Виды тренировочных данных для трансляции изображений. [2]

Обучение на парах изображений

Алгоритм трансляции изображений, обученный на парах изображений — это алгоритм трансляции одного изображения в другое, где тренировочные данные состоят из множества, в котором каждому входному изображению соответствует выходное изображение, содержащее первое с другим стилем.

Примерами приложения этого алгоритма являются следующие трансляции изображений:

  • черно-белое изображение — цветное;
  • сегментация изображения (англ. segmentation map) — реальная картинка;
  • линии-края (англ. edges) — фотография;
  • генерация разных поз и одежды на человеке;
  • описывающий изображение текст — фотография.

Некоторые примеры изображены на Рис. 3.

Рис. 3. Примеры применения алгоритма трансляции изображений, обученном на парных тренировочных данных. (Pix2Pix)[3]

Обучение на независимых множествах

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

Пример:

  • тренировочные данные — два множества: {реальные фотографии}, {картины К. Моне};
  • приложение — взяли любую фотографию, например, поле с цветами; получили поле с цветами в стиле К. Моне.
Рис. 4. Примеры применения алгоритма трансляции изображений, обученном на двух независимых множествах. (CycleGan)[1]

Pix2Pix

Pix2Pix[3] — это подход для трансляции изображений с помощью глубоких сверточных нейронных сетей.

Архитектура

Рис. 5. Пример процесса обучения генератора и дискриминатора для Pix2Pix. [4]

Pix2Pix реализует архитектуру условных порождающих состязательных сетей (англ. CGAN), где для генератора взята архитектура, основанная на U-Net[5], а для дискриминатора используется сверточный классификатор PatchGAN[6], который штрафует алгоритм на уровне участков изображения.

Генератор CGAN'a работает следующим образом: на вход подается one-hot вектор класса x и вектор шума z, в результате прохода через условный генератор выдается сгенерированное изображение этого класса. Таким образом, генератор можно представить, как следующую функцию: [math]G: \{x,z\} \to y[/math].
Генератор Pix2Pix работает cхожим образом, но вместо вектора класса подается изображение, а вектор шума и вовсе убирается, потому что он не вносит достаточно стохастичности в результат работы генератора.

Генератор обучается создавать максимально правдоподобные выходные изображения, дискриминатор же учится как можно лучше отличать фальшивые изображения от реальных.

Генератор

Рис. 6. Архитектура Pix2Pix генератора. [7]

Для генератора Pix2Pix используется U-net-генератор.
U-net-генератор[5] — это модель encoder-decoder с добавлением пропускаемых соединений (англ. skip-connections) между зеркальными слоями в стеках кодировщика и декодера.

Алгоритм работы генератора:

  • на вход подается изображение;
  • далее последовательно применяются свертка, батч-нормализация (англ. Batch Norm layer), функция активации LeakyReLU и пулинг, что, тем самым, уменьшает количество признаков;
  • при этом, следуя архитектуре U-net, добавляются пропускаемые соединения между каждым слоем [math]i[/math] и слоем [math]n - i[/math], где [math]n[/math] — общее количество слоев; каждое пропускаемое соединение просто объединяет все каналы на уровне [math]i[/math] с другими на слое [math]n - i[/math]; таким образом, информация, которая могла быть сильно сжата (потеряна), может доходить до некоторых более поздних слоев;
  • после того, как получен слой минимального размера, начинается работа декодера, который делает то же, что и кодировщик, с отличием в слое, обратном пулингу, который увеличивает количество признаков;
  • также в декодере добавляется dropout, чтобы достигнуть стохастичности на выходе генератора.

Генератор должен не только обмануть дискриминатор, но и приблизиться к истине, поэтому его функция ошибки выглядит следующим образом:
[math]L(G) = BCE\,Loss[/math][8] [math]+\,\lambda*\sum_{i=1}^{n}|generated\_output - real\_output|[/math], где [math]|generated\_output - real\_output|[/math] — попиксельная разница.

Дискриминатор

Рис. 7. Архитектура PatchGAN дискриминатора. [9]

Для дискриминатора данной сети используется сверточный дискриминатор PatchGAN.

PatchGAN дискриминатор[6] — это тип дискриминатора для генеративных состязательных сетей, который штрафует алгоритм на уровне локальных фрагментов (патчей).
Дискриминатор PatchGAN пытается определить, является ли каждый фрагмент размера [math]N\times N[/math] изображения настоящим или поддельным. Этот дискриминатор сверточно запускается по изображению, усредняя все ответы, чтобы посчитать окончательный результат [math]D[/math].
Проще говоря, для каждого фрагмента определяется матрица классификаций, где все значения находятся в промежутке [math][0,1][/math], где [math]0[/math] — подделка. Проходясь сверткой, в итоге получаем конечную матрицу классификаций. Таким образом, для поддельного изображения от генератора PatchGan должен попытаться вывести матрицу нулей.
Интересно, что [math]N[/math] может быть намного меньше полного размера изображения и при этом давать результаты высокого качества. Это выгодно, потому что меньший PatchGAN имеет меньше параметров, работает быстрее и может применяться к изображениям большого размера.
Такой дискриминатор эффективно моделирует изображение как Марковское случайное поле[10], предполагая независимость между пикселями, разделенных диаметром более одного фрагмента.

Полное описание архитектуры

Для того, чтобы описать полный порядок работы Pix2Pix, обратимся к примеру:

Пусть у вас есть набор пар, состоящий из реальных фотографий и их сегментаций. Задача состоит в том, чтобы  научиться генерировать из сегментированных изображений реальные.

  • помещается сегментированное изображение в генератор U-Net, и он генерирует некоторый выход;
  • дальше сгенерированное изображение соединяется с исходным входным сегментированным изображением, и это все идет в PatchGan дискриминатор, который выводит матрицу классификации, состоящую из значений между 0 и 1, которая показывает, насколько реальны или поддельны разные части этого изображения;
  • затем для вычисления ошибки дискриминатора проводится 2 сравнения:
    • сравнение матрицы классификации от {объединения сгенерированного изображения с исходным входным сегментированным изображением} с матрицей из всех 0;
    • матрицы классификация от {объединения реального изображения с исходным входным сегментированным изображением} с матрицей из всех 1;
  • затем для вычисления ошибки генератора проводится сравнение матрицы классификации от {объединения сгенерированного изображения с исходным входным изображением} с матрицей из всех 1, которое считается с помощью BCE Loss, которое впоследствии суммируется с попиксельным сравнением реального изображения со сгенерированным, домноженным на [math]\lambda[/math];
Рис. 8. Архитектура Pix2Pix. [11]

Примеры

Для тестирования решения были проведены следующие эксперименты:

  • сегментированные изображения [math]\leftrightarrow[/math] фотографии;
  • нарисованная карта [math]\leftrightarrow[/math] фотоснимок;
  • черно-белые фотографии [math]\to[/math] цветные фотографии;
  • линии-края [math]\to[/math] фотографии;
  • эскизы-рисунки [math]\to[/math] фотографии;
  • день [math]\to[/math] ночь;

и так далее.

Рис. 9. Примеры Pix2Pix. [12]

Pix2PixHD

Рис. 10. Генератор Pix2PixHD. [4]

Pix2PixHD[13]— нейронная сеть, основанная на архитектуре Pix2Pix, которая является новым удачным подходом для решения задачи получения изображений высокого разрешения из сегментированных изображений.

Основа Pix2Pix была улучшена за счет изменений в генераторе, дискриминаторе и функции ошибки.

Генератор был разбит на две подсети [math]G_1[/math] и [math]G_2[/math] так, что первая приняла роль глобальной сети генератора, а вторая стала локальным усилителем сети. Таким образом, генератор стал задаваться набором [math]G = \{G1, G2\}[/math]. Глобальная сеть генератора работает с изображениями с разрешением [math]1024 × 512[/math], в то время как локальный усилитель сети принимает на вход изображения с разрешением в 4 раза больше размера вывода предыдущей сети. Для получения изображений большего разрешения могут быть добавлены дополнительные локальные усилители сети.

Чтобы различать реальные и синтезированные изображения с высоким разрешением, дискриминатор должен иметь большое поле восприятия. Для этого потребуется либо более глубокая сеть, либо более крупные сверточные ядра, оба из которых увеличат емкость сети и потенциально могут вызвать переобучение. Кроме того, оба варианта требуют большего объема памяти для обучения, что уже является дефицитным ресурсом для создания изображений с высоким разрешением. Для решения проблемы предлагаем используется 3 дискриминатора, которые имеют идентичную структуру сети, но работают с разными масштабами изображения[14].

Функция ошибки была улучшена за счет добавления ошибки (feature matching loss) в разных масштабах изображения для каждого дискриминатора [math]\sum_{k=1}^{3} L_{FM}(G, D_k)[/math], для вычисления которой будем использовать выдаваемые значения дискриминатора на разных слоях изображения: [math]L_{FM}(G, D_k) = \mathbb{E}_{(s,x)}\sum_{i=1}^{T}\frac{1}{N_i}[||D_k^{(i)}(s,x) - D_k^{(i)}(s, G(s))||][/math], где [math]T[/math] — количество слоев, [math]N_i[/math] — количество элементов в каждом слое, [math]s[/math] — исходное сегментированное изображение, [math]x[/math] — соответствующее реальное изображение, [math]G(s)[/math] — сгенерированное изображение.

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

Рис. 11. Пример работы Pix2PixHD — label-to-streetview.[13]
Рис. 12. Пример работы Pix2PixHD — label-to-face. [13]

CycleGAN

Рис. 13. Алгоритм CycleGAN [15]

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

Архитектура

CycleGAN[16] реализует архитектуру циклически-согласованных состязательных сетей (англ. — Cycle-Consistent Adversarial Networks), суть которой состоит в решении проблемы отсутствия парного набора данных.

В Архитектуре присутствуют 2 генератора и 2 дискриминатора которые выполняют различные задачи:

  • Генератор [math]G_{A}[/math] учится преобразовывать исходное изображение [math]X[/math] в выходное изображение [math]Y[/math]
  • Генератор [math]G_{B}[/math] учится преобразовывать выходное изображение [math]Y[/math] в исходное изображение [math]X[/math]
  • Дискриминатор [math]D_{A}[/math] учится различать изображение [math]X[/math] и сгенерированное изображение [math]X ( G_{B}(Y) )[/math]
  • Дискриминатор [math]D_{B}[/math] учится различать изображение [math]Y[/math] и сгенерированное изображение [math]Y ( G_{A}(X) )[/math]

Структура генератора состоит из кодировщика (англ. — Encoder), создающего функцию особенностей из исходного изображения, трансформатора (англ. — Transformation), изменяющего функцию особенностей для создания сгенерированного изображения, и декодера (англ. — Decoder), возвращающего функцию особенностей обратно в формат изображения. Структура дискриминатора состоит из декодера, извлекающего особенности из входного изображения, и классификатора, определяющего сгенерировано ли изображение.

Рис. 14. Архитектура Генератора [17]
Рис. 15. Архитектура Дискриминатора [17]

Реализация элементов дискриминатора и генератора аналогичны тем, которые используются в Pix2Pix.

Сеть предоставляет подход перевода изображения из исходного домена [math]X[/math] в целевой домен [math]Y[/math] при отсутствии парных примеров. Цель задачи в изучении отображения [math]G{A}: X → Y [/math], так, чтобы распределение изображений [math]G_{A}(X)[/math] было неотличимо от распределения [math]G_{B}(Y)[/math] с учетом состязательной потери (aнгл. — Сonsistency loss). Также чтобы избежать коллапса мод[18](англ. — Mode collapse), следует проверить отображение [math]G : Y → X [/math], который пытается сопоставить [math]Y[/math] и [math]X[/math].

Другими словами для выполнения успешного преобразования должно выполниться следующее условие [math]G_{B}(G_{A}(X)) \sim X + Loss_{full}. [/math]

Функция потери

Функция потери[19] должна быть выполнена таким образом, что все отображения должны быть противоположными друг другу и взаимно однозначными.

Она состоит из потери согласованности цикла (англ. — Cycle Consistency Loss) и состязательной потери (англ. — Adversarial loss).

[math]Loss_{adv}(G,D_{B},X) = \frac{1}{m}(\sum_{i=1}^m(1 -D_{B}(G_{Xi})))*2[/math]

[math]Loss_{adv}(F,D_{A},Y) = \frac{1}{m}(\sum_{i=1}^m(1 -D_{A}(F_{Yi}))*2[/math]

[math]Loss_{cyc}(G,F,X,Y) = \frac{1}{m}\sum_{i=1}^m(F(G(Xi) - Xi) + (G(F(Yi)) - Yi))[/math]

[math]Loss_{full} = Loss_{adv} + \lambda * Loss_{cyc}[/math],

где [math]\lambda[/math] — гиперпараметр для уравнения потери согласованности цикла


Рис. 16. Пример работы CycleGAN [17]
Рис. 17. Пример работы CycleGAN [15]

См. также

Примечания

Источники информации