Вписывание части изображения
Восстановление изображения (англ. inpainting) — это процесс замены поврежденных частей изображения на реалистичные фрагменты. Вписывание части изображения - это подзадача восстановления, которая опирается на имеющуюся неиспорченную часть изображении для замены поврежденной.
Методы данной области применяются для редактирования изображений или для их восстановления, если их часть была утрачена или подвержена. С помощью современных моделей можно вырезать ненужные объекты или изменить их внешний вид (например, поменять цвет глаз у человека).
Виды восстановления изображения
Восстановление изображения разделяется на две задачи:
- Управляемое восстановление изображения(англ. non-blind inpainting). В этой задаче вместе с изображением подается информация о том, какие пиксели нужно заменить.
- Слепое восстановление изображения(англ. blind inpainting). В решениях данной проблемы модель сама определяет, где на изображении поврежденные пиксели. Модели слепого восстановления чаще всего занимаются устранением шумов (англ. denoising). В качестве шума, например, может быть наложенный текст. Пример работы модели удаления наложенного текста приведен на картинке справа.
В этом конспекте преимущественно речь пойдет про управляемое восстановление.
Традиционные методы
Для решения данной задачи существует множество различных методов, в том числе простых. Почти все простые методы основаны на следующей концепции: заполнение отсутствующих частей пикселями, идентичными соседним пикселям или похожими на них. Такие методы наиболее подходят для задачи устранения шума или небольших дефектов изображения. Но на изображениях, где отсутствует значительная часть данных, эти методы дают плохое качество изображения на выходе.
Есть два основных простых метода восстановления данных:
- Быстрый пошаговый метод (англ. Fast marching method). Этот метод двигается от границ области, которую нужно заполнить, к ее центру, постепенно восстанавливая пиксели. Каждый новый пиксель вычисляется как взвешенная сумма известных соседних пикселей.
- Метод Навье-Стокса (англ. Navier-Stokes method). Метод основывается на том, что границы объектов на изображении должны быть непрерывными. Значения пикселей вычисляются из областей вокруг испорченное части. Метод основывается на дифференциальных уравнениях в частных производных.
Глубокое обучение
В отличие от приведенных выше методов, глубокое обучение позволяет в процессе восстановления изображения учитывать его семантику. В этом случае алгоритм заполнения отсутствующих областей основывается на том, какие объекты расположены на изображении.
Для того, чтобы понимать, какую часть изображения нужно заполнить, на вход сети кроме самого изображения подается слой маски с информацией об испорченных пикселях.
Сети обычно имеют модель автокодировщиков (autoencoder) — сначала идут слои кодирующие, а потом декодирующие изображение. Функция потерь заставляет модель изучать другие свойства изображения, а не просто копировать его из входных данных в выходные. Именно это позволяет научить модель заполнять недостающие пиксели.
Обучение может происходить через сравнение оригинального изображения и синтетического, сгенерированного сетью или через генеративно-состязательную сеть (GAN). Во втором случае для обучения используется дискриминатор, который определяет настоящее ли изображение подали ему на вход. В современных моделях обычно используют совмещенный подход: функции потерь зависят и от исходного изображения, и от выхода дискриминатора.
В ранних моделях часто применялись два дискриминатора:
- Локальный дискриминатор (англ. Local Discriminator). Ему подавалась на вход только сгенерированная часть изображения.
- Глобальный дискриминатор (англ. Global Discriminator). В данном случае на вход подавалось все изображение целиком.
Однако в современных моделях используется один дискриминатор, который принимает на вход не только восстановленное изображение, но и маску. Современные модели чаще всего принимают на вход маски произвольной формы (англ. free-form mask), при работе с которыми локальный дискриминатор показывает плохое качество. Именно поэтому концепция двух дискриминаторов стала непопулярной.
Виды сверток
Помимо классической свертки в задаче подрисовки широко применяют другие виды сверток, которые дают лучшее качество выходного изображения.
Расширенная свертка (Dilated convolution)
Похожа на пуллинг и свертку с шагом, но позволяет:
- Экспоненциально расширить рецептивное поле без потери качества изображения
- Получить большее рецептивное поле при тех же затратах на вычисления и памяти, сохранив качество изображения
Формула отличается от классической только коэффициентом расширения l:
Пример:
1-, 2- и 4-расширенные свертки с классическими ядрами 3x3, 5x5 и 9x9 соответственно. Красные точки обозначают ненулевые веса, остальные веса ядра равны нулю. Выделенные синие области обозначают рецептивные поля. |
Частичная свертка (Partial convolution)
Частичная свертка позволяет решить две проблемы предыдущих подходов глубокого обучения:
- Предположение, что испорченные области имеют простую форму (прямоугольную).
- Заполнение испорченной области одним цветом и применение свертки ко всему изображению вне зависимости от того, какие пиксели испорчены, а какие нет.
Слой свертки состоит из:
— значения пикселей, — маска, указывающая на то какие пиксели испорчены.
Поэлементное перемножение
и позволяет получить результат, зависящий только от правильных пикселей, а нормализует этот результат, так как количество правильных пикселей на каждом слое свертки различается.Маска обновляется так:
Если результат свертки зависел хоть от одного реального пикселя, то на следующем слое свертки результирующий пиксель не будет считаться испорченным. Таким образом с каждым слоем свертки маска заполняется пока не будет полностью заполнена единицами.
Стробированная свертка (Gated convolution)
Разделение пикселей только на правильные и испорченные не позволяет:
- Контролировать восстановление изображения и вносить некоторую дополнительную информацию.
- Сохранить информацию об испорченной области, так как постепенно все пиксели становятся правильными.
Вместо жесткой маски, которая обновляется по некоторым правилам, стробированная свертка учится автоматически извлекать маску из данных:
Данная свертка учится динамическому отбору признаков для каждого слоя изображения и каждой логической области маски, значительно улучшая однородность цвета и качество исправления испорченных областей различных форм.
Функции потерь
Существует большое множество различных функций потерь при методе обучение модели через сравнение сгенерированного изображения с оригинальным. Примеры:
- L1-loss или Per-pixel loss. Оценивает точность восстановления каждого пикселя по отдельности.
- — выход генератора; — оригинальное изображние (англ. ground truth); — количество элементов в объекте ; — бинарная маска; — гиперпараметр, - поэлементное перемножение.
- Perceptual loss. Cравнивает признаки полученного и исходного изображений, полученные с помощью модели VGG-16[1].
- — изображение , в котором нестертые части заменены на части из ; — карта признаков, полученная -ым слоем VGG-16.
- Style loss. Сравнивает текстуру и цвета изображений, используя матрицу Грама[2].
- — матрица Грама для выполнения автокорреляции на карте признаков VGG-16; — размерность матрицы Грама.
- Total variation loss. Оценивает однородность полученного изображения.
- Adversarial loss. Сравнивает генерируемые и оригинальные грани объектов в изображении.
- — черное белое оригинальное изображение; — грани объектов оригинального изображения; — генерируемые грани; — дискриминатор;
- Feature-matching loss. Сравнивает изображения по признакам, извлекаемым из всех слоев дискриминатора.
- — количество слоев дискриминатора; — число нейронов на -ом слое дискриминатора; — значения диксриминатора на слое ;
При обучении обычно используется комбинация функций потерь с некоторыми весами, которые являются гиперпараметрами. В моделях, где вдобавок используется дискриминатор, функция потерь от его выхода также подмешивается к итоговой функции потерь.
Примеры современных моделей
DeepFillv2[3]
Главная идея этой модели — использование стробированной свертки, которая позволила добиться хорошего качества вписывания при восстановлении изображения с разными формами испорченных областей. Также можно использовать рисунок пользователя в качестве входных данных.
В данной модели используется вариант генеративно-состязательной сети — SN-PatchGAN. Дискриминатор этой сети в каждой точке вычисляет кусочно-линейную функцию потерь, формируя таким образом [4], в которой все слои классической свертки заменены на стробированные.
генеративно-состязательных сетей, каждая из которых сосредотачивается на различных частях и свойствах изображения. Генератор, состоящий из двух сетей (грубой и сети повышающей качество изображения), используют модель кодировщик-декодировщик вместо U-NetSC-FEGAN[5]
SC-FEGAN позволяет производить высококачественные изображения лиц, учитывая передаваемые пользователем эскизы и цвета на области маски (стертых частях изображения). Иными словами пользователь может легко редактировать изображения, стирая фрагменты, которые он хочет изменить, и подставляя туда эскизы и/или цвета, которые будут отражены в генерируемом фрагменте.
Дискриминатор данной сети принимает на вход сгенерированное изображение, маску и рисунок пользователя. Итоговая функция потерь формируется из выхода дискриминатора и функций сравнения изображения с оригинальным (per-pixel loss, perceptual loss, style loss).
Pluralistic Image Completion[6]
Главное отличие этой модели от других — способность выдавать несколько вариантов заполнения отсутствующих областей изображения. Обычно имеется множество возможных реалистичных вариантов восстановления изображения, однако большинство моделей выдают на выход лишь один, пытаясь получить оригинальное изображение. Используя данную модель, человек может выбрать то сгенерированное изображение, которое выглядит более реалистичным, таким образом получая более качественное изображение на выходе.
Данная модель добивается такого эффекта путем пропускания входного изображения через две параллельные сети. Первая сеть — реконструирующая. Она пытается приблизить выходное изображение к оригинальному. Вторая сеть — генерирующая, работающая с априорным распределением отсутствующих областей и выборками известных пикселей. Каждая сеть имеет свой дискриминатор, помогающий обучить модель. Кроме выхода дискриминатора для обучения также используются функции сравнения полученного изображения с оригинальным.
EdgeConnect[7]
EdgeConnect разбивает задачу вписывания на две части:
- Выделение границ изображения и предсказание границ утраченной части изображения.
- Использование сгенерированных границ для заполнения утраченной части изображения.
В обоих частях используется генеративно-состязательная сеть. Генераторы состоят из кодировщика, нескольких остаточных блоков с расширенной сверткой и декодировщика. Для дискриминатора используется PatchGAN[8].
Для генерации ребер сначала выделяются границы существующей части изображения с помощью Canny edge detector[9]. Потом полученная граница вместе с маской и черно-белым изображением дается генератору. В качестве целевой функции потерь для тренировки сети берется комбинация двух функций: adversarial loss и feature-matching loss. Также для стабилизация обучения генератора и дискриминатора используется спектральная нормализация.
Для восстановления генератор получает на вход испорченное изображение и границы, которые составлены из реальных и сгенерированных на предыдущем этапе. В результате генерируется полное изображение. Также как и на предыдущем этапе используется составная функция потерь из: adversarial loss, perceptual loss и style loss.
Однако, сети не удается предсказать достаточно хорошую границу, если отсутствует большая часть изображения или объект имеет сложную структуру.
Также данную модель можно использовать для соединения двух изображений или удаления лишних объектов с фотографий.
Deep Image Prior[10]
Как известно, большинство методов глубокого обучения требуют больших наборов данных для тренировки. В отличие от них Deep Image Prior не требует никакой предварительной обучающей выборки кроме одного изображения, которое надо исправить. Для этого сеть учится извлекать полезную информации из самого обрабатываемого изображения. Данный метод применяется для таких задач как вписывание части изображения, удаление шума и увеличение разрешения фотографий.
Сформулируем данную задачу как задачу минимизации:
— это функция потерь, зависящая от решаемой задачи, а — некоторая сверточная сеть.
Алгоритм решения задачи:
- Инициализируем рандомными весами.
- На каждой итерации:
- Сеть с текущими весами получает на вход фиксированный тензор и возвращает восстановленное изображение .
- С помощью сгенерированного изображения x и исходного изображения вычисляется функция потерь .
- Веса обновляются так, чтобы минимизировать уравнение (1).
В качестве
предлагается использовать сеть U-net с пропускающими соединениями.Для вписывания части изображения используется следующая функция потерь:
, где — маска.См. также
Примечания
- ↑ Very Deep Convolutional Networks for Large-Scale Image Recognition, Karen Simonyan, Andrew Zisserman
- ↑ Gramian matrix, Wikipedia
- ↑ Free-Form Image Inpainting with Gated Convolution, Jiahui Yu, Zhe Lin, Jimei Yang, Xiaohui Shen, Xin Lu, Thomas Huang
- ↑ U-Net: Convolutional Networks for Biomedical Image Segmentation, Olaf Ronneberger, Philipp Fischer, Thomas Brox
- ↑ Face Editing Generative Adversarial Network with User's Sketch and Color, Youngjoo Jo, Jongyoul Park
- ↑ Pluralistic Image Completion, Chuanxia Zheng, Tat-Jen Cham, Jianfei Cai
- ↑ EdgeConnect: Generative Image Inpainting with Adversarial Edge Learning, Kamyar Nazeri, Eric Ng, Tony Joseph, Faisal Z. Qureshi, Mehran Ebrahimi
- ↑ PatchGan, PapersWithCode
- ↑ Canny edge detector, Wikipedia
- ↑ Deep Image Prior, Dmitry Ulyanov, Andrea Vedaldi, Victor Lempitsky
Источники информации
- Guide to Image Inpainting: Using machine learning to edit and correct defects in photos, Heartbeat
- Introduction to image inpainting with deep learning, Weights & Biases
- Pushing the Limits of Deep Image Inpainting Using Partial Convolutions, Towards Data Science
- Understanding 2D Dilated Convolution Operation with Examples in Numpy and Tensorflow with Interactive Code, Towards Data Science