Задача трансляции изображений — различия между версиями
Spovar (обсуждение | вклад) м (→Архитектура) |
м (rollbackEdits.php mass rollback) |
||
(не показано 109 промежуточных версий 6 участников) | |||
Строка 3: | Строка 3: | ||
{{Определение | {{Определение | ||
|definition = | |definition = | ||
− | '''Задача трансляции изображения (англ. Image-to-image translation)''' — это задача из области компьютерного зрения, цель которой состоит в том, чтобы научиться строить соответствия между входным и выходным изображениями, используя тренировочные данные. | + | '''Задача трансляции изображения (англ. Image-to-image translation)''' — это задача из области [[ Компьютерное зрение| компьютерного зрения]], цель которой состоит в том, чтобы научиться строить соответствия между входным и выходным изображениями, используя тренировочные данные. |
}} | }} | ||
Другими словами, задача состоит в том, чтобы научиться преобразовывать изображение из одной области в другую, получая в итоге изображение со стилем (характеристиками) последней. | Другими словами, задача состоит в том, чтобы научиться преобразовывать изображение из одной области в другую, получая в итоге изображение со стилем (характеристиками) последней. | ||
− | [[Файл: | + | [[Файл:Horse2Zebra.png|thumb|right|Рис. 1. Пример трансляции изображения: превращение лошади в зебру.<ref name="cycle">[https://github.com/junyanz/CycleGAN CycleGAN {{---}} GitHub]</ref>]] |
== Описание задачи == | == Описание задачи == | ||
Задача разделяется на два типа в зависимости от тренировочных данных. <br> | Задача разделяется на два типа в зависимости от тренировочных данных. <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) {{---}} реальная картинка | + | * сегментация изображения (англ. segmentation map) {{---}} реальная картинка; |
− | * линии-края (англ. edges) {{---}} фотография | + | * линии-края (англ. edges) {{---}} фотография; |
− | * генерация разных поз и одежды на человеке | + | * генерация разных поз и одежды на человеке; |
− | * описывающий изображение текст {{---}} фотография | + | * описывающий изображение текст {{---}} фотография. |
− | + | Некоторые примеры изображены на Рис. 3. | |
− | [[File:Examples_paired_translation.jpg|700px|center|thumb|Примеры применения алгоритма трансляции изображений, обученном на парных тренировочных данных. (Pix2Pix)<ref name="pix">[https://github.com/phillipi/pix2pix Pix2Pix {{---}} GitHub]</ref>]] | + | [[File:Examples_paired_translation.jpg|700px|center|thumb|Рис. 3. Примеры применения алгоритма трансляции изображений, обученном на парных тренировочных данных. (Pix2Pix)<ref name="pix">[https://github.com/phillipi/pix2pix Pix2Pix {{---}} GitHub]</ref>]] |
=== Обучение на независимых множествах === | === Обучение на независимых множествах === | ||
− | '''Алгоритм трансляции изображений, обученный на двух независимых множествах''' — это такой алгоритм трансляции изображений, тренировочные данные которого состоят из двух независимых групп, описывающих свой стиль, цель которого | + | '''Алгоритм трансляции изображений, обученный на двух независимых множествах''' — это такой алгоритм трансляции изображений, тренировочные данные которого состоят из двух независимых групп, описывающих свой стиль, цель которого научиться отображать одну группу в другую так, чтобы содержание изображений (общее) сохранялось, а стиль (уникальные элементы изображений) переносился. |
Пример: | Пример: | ||
− | * тренировочные данные {{---}} два множества: <code>{реальные фотографии}, {картины К. Моне}</code> | + | * тренировочные данные {{---}} два множества: <code>{реальные фотографии}, {картины К. Моне}</code>; |
* приложение {{---}} взяли любую фотографию, например, поле с цветами; получили поле с цветами в стиле К. Моне. | * приложение {{---}} взяли любую фотографию, например, поле с цветами; получили поле с цветами в стиле К. Моне. | ||
− | [[File:Examples_unpaired_translation.jpeg|700px|center|thumb|Примеры применения алгоритма трансляции изображений, обученном на двух независимых множествах. (CycleGan)<ref name="cycle">[https://github.com/junyanz/CycleGAN CycleGAN {{---}} GitHub]</ref>]] | + | [[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> {{---}} это подход для трансляции изображений с помощью глубоких сверточных нейронных сетей. | + | Pix2Pix<ref name="pix">[https://github.com/phillipi/pix2pix Pix2Pix {{---}} GitHub]</ref> {{---}} это подход для трансляции изображений с помощью глубоких [[:Сверточные нейронные сети|сверточных нейронных сетей]]. |
=== Архитектура === | === Архитектура === | ||
− | [[File:Training_CGAN_pix2pix.png|400px|right|thumb|Пример процесса обучения генератора и дискриминатора для Pix2Pix.]] | + | [[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>, который штрафует алгоритм на уровне участков изображения. | 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>, который штрафует алгоритм на уровне участков изображения. | ||
Строка 52: | Строка 52: | ||
Генератор Pix2Pix работает cхожим образом, но вместо вектора класса подается изображение, а вектор шума и вовсе убирается, потому что он не вносит достаточно стохастичности в результат работы генератора. | Генератор Pix2Pix работает cхожим образом, но вместо вектора класса подается изображение, а вектор шума и вовсе убирается, потому что он не вносит достаточно стохастичности в результат работы генератора. | ||
− | Генератор обучается | + | Генератор обучается создавать максимально правдоподобные выходные изображения, дискриминатор же учится как можно лучше отличать фальшивые изображения от реальных. |
==== Генератор ==== | ==== Генератор ==== | ||
− | [[File: | + | [[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 используется | + | Для генератора 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 и пулинг, что, тем самым, уменьшает количество признаков | + | * далее последовательно применяются свертка, [[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, чтобы достигнуть стохастичности на выходе генератора | + | * также в декодере добавляется dropout, чтобы достигнуть стохастичности на выходе генератора. |
− | Генератор должен не только обмануть | + | Генератор должен не только обмануть дискриминатор, но и приблизиться к истине, поэтому его '''функция ошибки''' выглядит следующим образом: <br> |
− | <tex>L(G) = BCE\,Loss + \lambda*\sum_{i=1}^{n}|generated\_output - real\_output|</tex> | + | <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|Архитектура PatchGAN дискриминатора.]] | + | [[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. | ||
− | '''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> {{---}} это тип дискриминатора для генеративных состязательных сетей, который штрафует | + | '''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> | Дискриминатор PatchGAN пытается определить, является ли каждый фрагмент размера <tex>N\times N</tex> изображения настоящим или поддельным. Этот дискриминатор сверточно запускается по изображению, усредняя все ответы, чтобы посчитать окончательный результат <tex>D</tex>.<br> | ||
Проще говоря, для каждого фрагмента определяется матрица классификаций, где все значения находятся в промежутке <tex>[0,1]</tex>, где <tex>0</tex> {{---}} подделка. Проходясь сверткой, в итоге получаем конечную матрицу классификаций. Таким образом, для поддельного изображения от генератора PatchGan должен попытаться вывести матрицу нулей. <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>, предполагая независимость между пикселями, разделенных диаметром более одного фрагмента. | Такой дискриминатор эффективно моделирует изображение как Марковское случайное поле<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|Архитектура Pix2Pix.]] | + | [[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|Генератор Pix2PixHD.]] | + | [[File:Generator_pix2pixhd.png|400px|right|thumb|Рис. 10. Генератор Pix2PixHD. <ref name="towardsdatascience">[https://towardsdatascience.com/pix2pix-869c17900998 Pix2Pix {{---}} Towardsdatascience]</ref>]] |
− | Pix2PixHD<ref>[https://github.com/NVIDIA/pix2pixHD Pix2PixHD {{---}} GitHub]</ref>{{---}} нейронная сеть, основанная на архитектуре Pix2Pix, которая является новым удачным подходом для решения задачи получения изображений высокого разрешения из сегментированных изображений. | + | Pix2PixHD<ref name="Pix2PixHD">[https://github.com/NVIDIA/pix2pixHD Pix2PixHD {{---}} GitHub]</ref>{{---}} нейронная сеть, основанная на архитектуре Pix2Pix, которая является новым удачным подходом для решения задачи получения изображений высокого разрешения из сегментированных изображений. |
Основа Pix2Pix была улучшена за счет изменений в генераторе, дискриминаторе и функции ошибки. | Основа Pix2Pix была улучшена за счет изменений в генераторе, дискриминаторе и функции ошибки. | ||
− | '''Генератор''' был разбит на две подсети <tex>G_1</tex> и <tex>G_2</tex> так, что первая приняла роль глобальной сети генератора, а вторая стала локальным усилителем сети. Таким образом, генератор стал задаваться набором <tex>G = \{G1, G2\}</tex>. Глобальная сеть генератора работает с изображениями с | + | '''Генератор''' был разбит на две подсети <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>]] | |
− | |||
− | |||
− | |||
== См. также == | == См. также == | ||
Строка 148: | Строка 189: | ||
[[Категория:Машинное обучение | ]] | [[Категория:Машинное обучение | ]] | ||
+ | [[Категория:Компьютерное зрение | ]] | ||
+ | [[Категория:Сверточные нейронные сети | ]] | ||
+ | [[Категория:Глубокое обучение | ]] | ||
[[Категория:{{BASEPAGENAME}}]] | [[Категория:{{BASEPAGENAME}}]] |
Текущая версия на 19:30, 4 сентября 2022
Определение: |
Задача трансляции изображения (англ. Image-to-image translation) — это задача из области компьютерного зрения, цель которой состоит в том, чтобы научиться строить соответствия между входным и выходным изображениями, используя тренировочные данные. |
Другими словами, задача состоит в том, чтобы научиться преобразовывать изображение из одной области в другую, получая в итоге изображение со стилем (характеристиками) последней.
![](/wiki/images/thumb/9/9a/Horse2Zebra.png/300px-Horse2Zebra.png)
Содержание
Описание задачи
Задача разделяется на два типа в зависимости от тренировочных данных.
В одном случае, у нас есть четкое представление результата, который должен получиться, а в другом случае, его нет, но есть множество, определяющее стиль желаемого результата (Рис. 2).
![](/wiki/images/thumb/b/be/Paired_vs_unpaired_training_data.png/400px-Paired_vs_unpaired_training_data.png)
Обучение на парах изображений
Алгоритм трансляции изображений, обученный на парах изображений — это алгоритм трансляции одного изображения в другое, где тренировочные данные состоят из множества, в котором каждому входному изображению соответствует выходное изображение, содержащее первое с другим стилем.
Примерами приложения этого алгоритма являются следующие трансляции изображений:
- черно-белое изображение — цветное;
- сегментация изображения (англ. segmentation map) — реальная картинка;
- линии-края (англ. edges) — фотография;
- генерация разных поз и одежды на человеке;
- описывающий изображение текст — фотография.
Некоторые примеры изображены на Рис. 3.
![](/wiki/images/thumb/9/90/Examples_paired_translation.jpg/700px-Examples_paired_translation.jpg)
Обучение на независимых множествах
Алгоритм трансляции изображений, обученный на двух независимых множествах — это такой алгоритм трансляции изображений, тренировочные данные которого состоят из двух независимых групп, описывающих свой стиль, цель которого научиться отображать одну группу в другую так, чтобы содержание изображений (общее) сохранялось, а стиль (уникальные элементы изображений) переносился.
Пример:
- тренировочные данные — два множества:
{реальные фотографии}, {картины К. Моне}
; - приложение — взяли любую фотографию, например, поле с цветами; получили поле с цветами в стиле К. Моне.
![](/wiki/images/thumb/0/00/Examples_unpaired_translation.jpeg/700px-Examples_unpaired_translation.jpeg)
Pix2Pix
Pix2Pix[3] — это подход для трансляции изображений с помощью глубоких сверточных нейронных сетей.
Архитектура
![](/wiki/images/thumb/1/1c/Training_CGAN_pix2pix.png/400px-Training_CGAN_pix2pix.png)
Pix2Pix реализует архитектуру условных порождающих состязательных сетей (англ. CGAN), где для генератора взята архитектура, основанная на U-Net[5], а для дискриминатора используется сверточный классификатор PatchGAN[6], который штрафует алгоритм на уровне участков изображения.
Генератор CGAN'a работает следующим образом: на вход подается one-hot вектор класса x и вектор шума z, в результате прохода через условный генератор выдается сгенерированное изображение этого класса. Таким образом, генератор можно представить, как следующую функцию:
Генератор Pix2Pix работает cхожим образом, но вместо вектора класса подается изображение, а вектор шума и вовсе убирается, потому что он не вносит достаточно стохастичности в результат работы генератора.
Генератор обучается создавать максимально правдоподобные выходные изображения, дискриминатор же учится как можно лучше отличать фальшивые изображения от реальных.
Генератор
![](/wiki/images/thumb/3/35/U-Net-Generator-Model.png/400px-U-Net-Generator-Model.png)
Для генератора Pix2Pix используется U-net-генератор.
U-net-генератор[5] — это модель encoder-decoder с добавлением пропускаемых соединений (англ. skip-connections) между зеркальными слоями в стеках кодировщика и декодера.
Алгоритм работы генератора:
- на вход подается изображение;
- далее последовательно применяются свертка, батч-нормализация (англ. Batch Norm layer), функция активации LeakyReLU и пулинг, что, тем самым, уменьшает количество признаков;
- при этом, следуя архитектуре U-net, добавляются пропускаемые соединения между каждым слоем и слоем , где — общее количество слоев; каждое пропускаемое соединение просто объединяет все каналы на уровне с другими на слое ; таким образом, информация, которая могла быть сильно сжата (потеряна), может доходить до некоторых более поздних слоев;
- после того, как получен слой минимального размера, начинается работа декодера, который делает то же, что и кодировщик, с отличием в слое, обратном пулингу, который увеличивает количество признаков;
- также в декодере добавляется dropout, чтобы достигнуть стохастичности на выходе генератора.
Генератор должен не только обмануть дискриминатор, но и приблизиться к истине, поэтому его функция ошибки выглядит следующим образом:
[8] , где — попиксельная разница.
Дискриминатор
![](/wiki/images/thumb/a/a0/The-PatchGAN-structure-in-the-discriminator-architecture.png/400px-The-PatchGAN-structure-in-the-discriminator-architecture.png)
Для дискриминатора данной сети используется сверточный дискриминатор PatchGAN.
PatchGAN дискриминатор[6] — это тип дискриминатора для генеративных состязательных сетей, который штрафует алгоритм на уровне локальных фрагментов (патчей).
Дискриминатор PatchGAN пытается определить, является ли каждый фрагмент размера изображения настоящим или поддельным. Этот дискриминатор сверточно запускается по изображению, усредняя все ответы, чтобы посчитать окончательный результат .
Проще говоря, для каждого фрагмента определяется матрица классификаций, где все значения находятся в промежутке , где — подделка. Проходясь сверткой, в итоге получаем конечную матрицу классификаций. Таким образом, для поддельного изображения от генератора PatchGan должен попытаться вывести матрицу нулей.
Интересно, что может быть намного меньше полного размера изображения и при этом давать результаты высокого качества. Это выгодно, потому что меньший PatchGAN имеет меньше параметров, работает быстрее и может применяться к изображениям большого размера.
Такой дискриминатор эффективно моделирует изображение как Марковское случайное поле[10], предполагая независимость между пикселями, разделенных диаметром более одного фрагмента.
Полное описание архитектуры
Для того, чтобы описать полный порядок работы Pix2Pix, обратимся к примеру:
Пусть у вас есть набор пар, состоящий из реальных фотографий и их сегментаций. Задача состоит в том, чтобы научиться генерировать из сегментированных изображений реальные.
- помещается сегментированное изображение в генератор U-Net, и он генерирует некоторый выход;
- дальше сгенерированное изображение соединяется с исходным входным сегментированным изображением, и это все идет в PatchGan дискриминатор, который выводит матрицу классификации, состоящую из значений между 0 и 1, которая показывает, насколько реальны или поддельны разные части этого изображения;
- затем для вычисления ошибки дискриминатора проводится 2 сравнения:
- сравнение матрицы классификации от {объединения сгенерированного изображения с исходным входным сегментированным изображением} с матрицей из всех 0;
- матрицы классификация от {объединения реального изображения с исходным входным сегментированным изображением} с матрицей из всех 1;
- затем для вычисления ошибки генератора проводится сравнение матрицы классификации от {объединения сгенерированного изображения с исходным входным изображением} с матрицей из всех 1, которое считается с помощью BCE Loss, которое впоследствии суммируется с попиксельным сравнением реального изображения со сгенерированным, домноженным на ;
![](/wiki/images/thumb/a/a4/Pix2pix-UNet-128-GAN-network-architecture.png/700px-Pix2pix-UNet-128-GAN-network-architecture.png)
Примеры
Для тестирования решения были проведены следующие эксперименты:
- сегментированные изображения фотографии;
- нарисованная карта фотоснимок;
- черно-белые фотографии цветные фотографии;
- линии-края фотографии;
- эскизы-рисунки фотографии;
- день ночь;
и так далее.
![](/wiki/images/thumb/d/d6/Pix2pix_examples.png/800px-Pix2pix_examples.png)
Pix2PixHD
![](/wiki/images/thumb/8/84/Generator_pix2pixhd.png/400px-Generator_pix2pixhd.png)
Pix2PixHD[13]— нейронная сеть, основанная на архитектуре Pix2Pix, которая является новым удачным подходом для решения задачи получения изображений высокого разрешения из сегментированных изображений.
Основа Pix2Pix была улучшена за счет изменений в генераторе, дискриминаторе и функции ошибки.
Генератор был разбит на две подсети
и так, что первая приняла роль глобальной сети генератора, а вторая стала локальным усилителем сети. Таким образом, генератор стал задаваться набором . Глобальная сеть генератора работает с изображениями с разрешением , в то время как локальный усилитель сети принимает на вход изображения с разрешением в 4 раза больше размера вывода предыдущей сети. Для получения изображений большего разрешения могут быть добавлены дополнительные локальные усилители сети.Чтобы различать реальные и синтезированные изображения с высоким разрешением, дискриминатор должен иметь большое поле восприятия. Для этого потребуется либо более глубокая сеть, либо более крупные сверточные ядра, оба из которых увеличат емкость сети и потенциально могут вызвать переобучение. Кроме того, оба варианта требуют большего объема памяти для обучения, что уже является дефицитным ресурсом для создания изображений с высоким разрешением. Для решения проблемы предлагаем используется 3 дискриминатора, которые имеют идентичную структуру сети, но работают с разными масштабами изображения[14].
Функция ошибки была улучшена за счет добавления ошибки (feature matching loss) в разных масштабах изображения для каждого дискриминатора
, для вычисления которой будем использовать выдаваемые значения дискриминатора на разных слоях изображения: , где — количество слоев, — количество элементов в каждом слое, — исходное сегментированное изображение, — соответствующее реальное изображение, — сгенерированное изображение.На рисунках 11 и 12 приведены примеры генерации изображения по входным сегментированным изображениям с применением различных стилей.
![](/wiki/images/thumb/7/73/City_pix2pixhd.gif/600px-City_pix2pixhd.gif)
![](/wiki/images/thumb/3/30/Face_pix2pixhd.gif/600px-Face_pix2pixhd.gif)
CycleGAN
![](/wiki/images/thumb/d/db/CycleGAN_Arxitecture.jpeg/390px-CycleGAN_Arxitecture.jpeg)
Нейронная сеть, в отличии от описанной выше Pix2Pix позволяет реализовать решение задачи обучения на независимых множествах. Обычно применяются для задач изменения стиля фотографий.
Архитектура
CycleGAN[16] реализует архитектуру циклически-согласованных состязательных сетей (англ. — Cycle-Consistent Adversarial Networks), суть которой состоит в решении проблемы отсутствия парного набора данных.
В Архитектуре присутствуют 2 генератора и 2 дискриминатора которые выполняют различные задачи:
- Генератор учится преобразовывать исходное изображение в выходное изображение
- Генератор учится преобразовывать выходное изображение в исходное изображение
- Дискриминатор учится различать изображение и сгенерированное изображение
- Дискриминатор учится различать изображение и сгенерированное изображение
Структура генератора состоит из кодировщика (англ. — Encoder), создающего функцию особенностей из исходного изображения, трансформатора (англ. — Transformation), изменяющего функцию особенностей для создания сгенерированного изображения, и декодера (англ. — Decoder), возвращающего функцию особенностей обратно в формат изображения. Структура дискриминатора состоит из декодера, извлекающего особенности из входного изображения, и классификатора, определяющего сгенерировано ли изображение.
![](/wiki/images/thumb/b/b8/Generator.jpeg/390px-Generator.jpeg)
![](/wiki/images/thumb/0/0c/Discriminator.jpeg/390px-Discriminator.jpeg)
Реализация элементов дискриминатора и генератора аналогичны тем, которые используются в Pix2Pix.
Сеть предоставляет подход перевода изображения из исходного домена [18](англ. — Mode collapse), следует проверить отображение , который пытается сопоставить и .
в целевой домен при отсутствии парных примеров. Цель задачи в изучении отображения , так, чтобы распределение изображений было неотличимо от распределения с учетом состязательной потери (aнгл. — Сonsistency loss). Также чтобы избежать коллапса модДругими словами для выполнения успешного преобразования должно выполниться следующее условие
Функция потери
Функция потери[19] должна быть выполнена таким образом, что все отображения должны быть противоположными друг другу и взаимно однозначными.
Она состоит из потери согласованности цикла (англ. — Cycle Consistency Loss) и состязательной потери (англ. — Adversarial loss).
,
где
— гиперпараметр для уравнения потери согласованности цикла
![](/wiki/images/thumb/4/46/Doge_starrynight.jpg/700px-Doge_starrynight.jpg)
![](/wiki/images/thumb/4/40/Comics.png/700px-Comics.png)
См. также
- Компьютерное зрение
- Generative Adversarial Nets (GAN)
- Сверточные нейронные сети
- Сегментация изображений
Примечания
- ↑ 1,0 1,1 CycleGAN — GitHub
- ↑ CycleGAN — Towardsdatascience
- ↑ 3,0 3,1 Pix2Pix — GitHub
- ↑ 4,0 4,1 Pix2Pix — Towardsdatascience
- ↑ 5,0 5,1 U-Net: Convolutional Networks for Biomedical Image Segmentation
- ↑ 6,0 6,1 Precomputed Real-Time Texture Synthesis with Markovian Generative Adversarial Networks
- ↑ Pix2Pix GAN Models — Machine Learning Mastery
- ↑ BCE Loss — towardsdatascience
- ↑ The PatchGAN structure — ResearchGate
- ↑ Markov random field — Wikipedia
- ↑ Pix2pix UNet_128 GAN network architecture — ResearchGate
- ↑ Sik-Ho Tsang
- ↑ 13,0 13,1 13,2 Pix2PixHD — GitHub
- ↑ High-Resolution Image Synthesis and Semantic Manipulation with Conditional GANs
- ↑ 15,0 15,1 Алгоритм CycleGAN
- ↑ Cycle-Consistent Adversarial Networks
- ↑ 17,0 17,1 17,2 Пример работы CycleGAN
- ↑ Улучшение обучения GAN
- ↑ Cyclic_loss
Источники информации
- Image-to-Image Translation with Conditional Adversarial Networks
- High-Resolution Image Synthesis and Semantic Manipulation with Conditional GANs
- Learning image-to-image translation using paired and unpaired training samples
- Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks
- Apply Generative Adversarial Networks (GANs) — Coursera