Заявление о проблеме

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

Примечательные моменты в постановке задачи

  1. Неоднозначно. Причина, по которой я разумно написал выше в формулировке проблемы, заключается в том, что то, что разумно, зависит от приложения, и часто мы позволяем определению быть неоднозначным. например Если на участке раньше была птица, следует ли его заполнить птицей или небом? Если патч содержал часть объекта, должны ли мы заполнять объект больше или меньше?
  2. Несмотря на двусмысленность, я думаю, что большинство решений на данный момент предполагают, что мы хотим, чтобы окончательное изображение выглядело «реальным».
  3. Нам разрешено только вставлять участки и не изменять сами исходные пиксели.
  4. Патчи могут быть любой формы и размера. Поскольку технически разрешены патчи любого размера, мы можем выбрать все изображение как патч, и, таким образом, проблема сводится к генерации изображения. Обсуждаемые ниже исследовательские решения могут быть использованы в этом крайнем случае, но они, вероятно, не будут работать в таком крайнем случае.
  5. Постановка проблемы в текущей форме требует семантического понимания, чтобы завершенные исправления выглядели «настоящими».

Некоторые размеры проблемы

Некоторые аспекты, о которых можно подумать, относятся к их собственному применению в живописи.

  1. Локальная или глобальная согласованность. Следует отметить, что мы не только хотим, чтобы заполненный патч был согласован внутри себя (согласованность может быть с точки зрения цвета, края, семантики и т. д.), но мы также хотим, чтобы он чтобы иметь смысл с остальной частью изображения. Могут ли две цели противоречить друг другу? Один важнее другого для определенного приложения?
  2. Размер пятна. Хотя в приведенной выше формулировке проблемы мы не указали размер отверстия, может ли знание того, какого размера заплатка, может быть полезен в решении?
  3. Домен изображения. Как выглядят входящие изображения? Это только естественные сцены? Это только изображения трафика?
  4. Домен исправлений. Хотите найти исправления определенного типа? например патч всегда содержит лицо или часть лица?

Решение

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

Сетевая архитектура

Первая часть настройки Deep ML - это сама сеть. В случае перерисовки изображения у нас есть изображение на входе и изображение на выходе. Для такого случая большинство установок используют архитектуру кодировщика-декодера, где мы устанавливаем сверточные слои в первой части сети (кодировщике), постепенно уменьшая выходное разрешение. Вторая часть сети (декодер) увеличивает выходное разрешение за счет деконволюционных (также называемых повышающих сверточных) слоев. Пример сети показан ниже.

Как мы увидим позже, принято добавлять другие вспомогательные сети в дополнение к этой сети кодировщика / декодера. Чтобы отличить эту часть сети от других, ее принято называть «Сеть завершения», поскольку она дополняет неизвестные патчи до целого изображения. Несколько замечаний о сети завершения

  1. На входе может быть много дырок (заплаток). Поскольку при вводе изображения в сеть отверстия должны быть заполнены некоторым значением, вывод зависит от значения цвета, которое мы выбираем для патчей, что делает его гиперпараметром.
  2. Нам решать, как создавать эти входные патчи, делая их еще и гиперпараметром. Форма, размер и расположение этих пятен - все зависит от нас.
  3. Мы должны сохранить отдельную маску, которая сообщает нам, какие пиксели принадлежат патчам.
  4. Сеть завершения также должна выводить значения для областей без исправлений. Нам это на самом деле не нужно, поскольку мы просто хотели бы использовать значения входных пикселей для этих местоположений, но это зависит от нас, хотим ли мы использовать этот выходной каким-либо образом (например, для наказания сети за плохой прогноз в этих регионах).

Гиперпараметр архитектуры кодировщика / декодера - это то, насколько кодировщик должен уменьшить выходное разрешение, прежде чем декодер вернет его. Одна из целей уменьшения выходного разрешения в кодировщике - увеличить выходное воспринимающее поле (входные пиксели, от которых зависит каждый выходной пиксель). На изображении выше, поскольку у нас есть полностью связанный слой между каждым выходным пикселем, зависит от каждого входного пикселя. В проблеме рисования полей с высокой восприимчивостью важны, так как мы хотели бы заполнить пиксели патча, используя как можно больше входных пикселей, чтобы патчи были глобально согласованными. Увеличивать рецептивные поля можно разными способами.

  • Полностью связанный слой. Наличие полностью связанного слоя гарантирует, что выходное воспринимающее поле представляет собой все изображение, но это также увеличивает количество параметров. В настоящее время принято избегать полносвязных слоев и большого количества параметров, которые идут с ними, что делает сеть полностью сверточной. Если размер вывода не нужно фиксировать, он также имеет то преимущество, что можно вводить изображение любого размера. Даже для фиксированных выходных размеров можно избежать полностью связанных слоев с помощью ROIPooling (динамическое изменение размера формы объекта)
  • Расширенные свертки. Еще один способ увеличить поле восприятия - использовать расширенные свертки вместо обычных сверток.

  • Двухэтапная сеть. Еще один способ улучшить глобальную согласованность сети - это использовать два этапа в сети, вынуждая сеть генерировать изображение дважды. Результат первого этапа, по характеру настройки, будет более грубым, поверх которого второй этап строит и дает более точный результат. Любые из описанных ниже потерь могут быть применены к обоим этапам (включая потери от состязания, при условии, что также добавлены дискриминаторы).
    Другой вариант двухэтапной сети - это прогнозирование ребер в качестве промежуточного результата, который подается в качестве дополнительного input (первым входом является само изображение) на второй этап. Изображение такой сети показано на рис. 5. Для создания карт границ можно использовать любой детектор границ, например Canny Edge Detector. В качестве первого шага генератора фронтов авторы [6] предпочитают использовать состязательный проигрыш.

  • Сеть внимания. Еще один способ обеспечить принятие более глобальных решений при заполнении пикселей - это явное включение в архитектуру сети с использованием внимания. Дополнительные сведения см. В разделе 4 в [1].

Частичные свертки

Как обсуждалось выше, вывод сети завершения зависит от цвета, который мы выбираем для использования в качестве заплат. В идеале мы бы хотели, чтобы сеть вообще не учитывала пиксели патча при генерации выходных данных. [4] пытается добиться этого, изменяя операцию свертки. Модификация выглядит следующим образом

  1. Для сверток на входных пикселях (входные пиксели являются первым набором функций) учитывайте только пиксели без патча. Пиксели патча избегаются во время свертки, то есть произведение пикселя патча на вес сверточного ядра явно устанавливается на 0
  2. Если была активирована частичная свертка (т.е. не все пиксели в свертке не были пикселями патча), то выходная сумма масштабируется в соответствии с количеством пропущенных пикселей в свертке.
  3. Для сверток после самого первого слоя выполняется то же самое, за исключением того, что определение функции без исправлений обновляется для всех функций, которые имеют хотя бы один входной пиксель без исправлений в их принимающем поле.

M - это двоичная маска с нулями для пикселей патча. 1 имеет ту же форму, что и M, но все элементы равны 1. X - это функция ввода для текущего скользящего окна свертки. W - веса сверточного ядра, а b - смещение. m ’ - это обновленная маска, вычисляемая для следующего слоя после каждого слоя.

Основная идея здесь состоит в том, чтобы последовательно рассматривать только те функции, для которых используется хотя бы один входной пиксель. Если в воспринимающем поле объекта нет входных пикселей, ему присваивается значение 0. В конце концов, когда вы углубитесь в сеть и по мере увеличения восприимчивого поля, все объекты должны иметь хотя бы один входной пиксель в своем воспринимающем поле, уменьшающемся. частичная свертка к нормальной свертке.

Стробированные свертки
Мы видели выше в разделе "Частичные свертки", что каждая функция может быть либо перенесена на следующий слой, либо установлена ​​на 0 в зависимости от того, был ли у этой функции входной пиксель без патча в ее принимающем поле. . Что, если было ли распространено входное свойство или нет, не зависело от этого правила, а было изучено?

Как это узнать?

[7] предлагает закрытые свертки. Каждая свертка - это сеть завершения, замененная закрытой сверткой, которая выглядит так

  1. Имейте две нормальные свертки на входном элементе (I).
    K = Conv (I, Wₖ)
    H = Conv (I, Wₕ)
    Здесь Wₕ и Wₖ - веса сверточного ядра
  2. Передайте вывод одной такой свертки в сигмоид. Теперь эти сигмоидальные выходы должны представлять, какие функции разрешить (1 означает разрешение, а 0 - запрет).
    S = сигмовидная (H)
  3. Чтобы применить это к выходным функциям, мы просто поэлементно умножаем второй выход свертки на сигмоидный выход.
    Output = K ⊙ S

Очевидно, что здесь следует отметить, что это увеличивает количество параметров сети. [7] уменьшил параметры в других частях сети, чтобы уравновесить эти дополнительные затраты.

Состязательная тренировка

Есть не так много вещей, с которыми мы могли бы согласиться относительно того, как должен выглядеть окрашенный результат, но большинство людей согласятся, что он не должен выглядеть фальшивым. Это причина, по которой наличие состязательной настройки действительно хорошо работает для проблемы Image Inpainting. Идея состоит в том, чтобы обучить как сеть завершения, так и сеть дискриминатора (задача которой - определить, является ли изображение поддельным или настоящим). Все изображения, сгенерированные сетью завершения, должны быть предсказаны дискриминатором как поддельные, а все реальные изображения (без пятен) должны быть предсказаны как настоящие. Здесь следует отметить, что можно ввести либо

  1. Весь вывод сети завершения на дискриминатор (глобальный дискриминатор)
  2. Только вывод патча и некоторой области вокруг него на дискриминатор (локальный дискриминатор).

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

Другой выбор архитектуры, который мы можем сделать здесь, - это иметь отдельные потери для локального дискриминатора и глобального дискриминатора. Или мы могли бы объединить выходы двух дискриминаторов и присоединить их к одной функции потерь, как показано на рис.8.

Убытки

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

Справочник по символам

M : маска ввода, содержащая 0 для областей патча и 1 для областей без патча
X: входное изображение
⊙: умное умножение элементов
Lᵣ: потеря реконструкции
Lₕ: потеря отверстия
C: завершение сети
Nₚ: количество пикселей в изображении (ширина * высота * каналы)
Lₚₑᵣ: потеря восприятия
Iₒᵤₜ: выходное изображение, то есть C (X, M)
Iₕ: Iₒᵤₜ с пикселями без патча, замененными базовыми истинными значениями
P: количество слоев, используемых для потери восприятия
ψⁿₚ: выход слой p сети VGG для входного изображения n
R: Область расширения области отверстия на 1 пиксель
Nₕ: Количество пикселей патча
Lₐ: Adversarial Loss

Потеря реконструкции
Мы хотим, чтобы область без исправлений выводилась сетью как есть. Потеря L2 или L1 для того же самого поможет.

Lᵣ = ∥ M ⊙ ( Iₒᵤₜ - X) ∥²

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

Lₕ = ∥ (1-M) ⊙ (Iₒᵤₜ — X) ∥²

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

Одна из возможностей использовать потерю дырок, но уменьшить ее отрицательные эффекты, состоит в том, чтобы взвесить ее на пиксель с пикселями, удаленными от ближайшего известного (не-патч) пикселя, способствующего меньшим потерям. Одна такая схема используется в [1] и называется Пространственно дисконтированная потеря. Схема проста: потеря каждого пикселя умножается на коэффициент масштабирования γˡ, где γ устанавливается равным 0,99, а l - расстояние этого пикселя от ближайшего известного пикселя.

Можно также нормализовать потери в отверстиях и потери при реконструкции с помощью количества пикселей Nₚ

Потеря восприятия

Идея потери восприятия заключается в том, чтобы увидеть, насколько наши результаты отличаются от реальных данных в глубоком пространстве функций. Один из способов подумать об этом - заставить вывод быть похожим в более высоком концептуальном пространстве, а не только в значениях пикселей. Чтобы вычислить потери, мы суммируем различия в выходных данных на разных уровнях предварительно обученной сети VGG.

Поскольку разные уровни «кодируют» разные концепции, а более высокие уровни кодируют все более сложные концепции, эта потеря инкапсулирует разницу между выходными данными и наземной истиной на различных «уровнях концепций». Какие слои выбрать для потери восприятия - это гиперпараметр.

Потеря стиля

Эта потеря связана с предыдущей работой над Style Transfer [8]. Идея состоит в том, чтобы определить «Стиль», используя промежуточные значения характеристик глубоко подготовленной сети.

Гипотеза состоит в том, что корреляции между различными каналами выходного объекта из определенного слоя говорят нам кое-что о «стиле» входного изображения. Вы суммируете их по комбинациям каналов и по различным уровням предварительно обученной сети, такой как VGG, и получаете одно число, которое представляет «стиль» этого изображения. Попробуйте минимизировать разницу между этими числами для сгенерированного вывода (Iₒᵤₜ) и входного изображения (X), и мы получим потерю стиля.

Обычно для этой потери мы выбираем слои из средних слоев сети, поскольку они не представляют ни очень высокий уровень, ни очень низкий уровень концепций и поэтому могут хорошо подходить для представления «стиля».

Посмотрите видео this от Andew NG, чтобы лучше понять Style Loss.

У нас также может быть две потери: одна для исходного вывода и одна для вывода с пикселями без патча, замененными наземной истиной.

Kₚ - нормировочная константа для слоя p, равная 1 / CₚHₚWₚ (каналы, высота и ширина слоя p). Мы также нормализуем на Cₚ * Cₚ, который является размером матрицы автокорреляции.

Общая вариационная потеря

Мы не хотим, чтобы выходные значения слишком сильно варьировались в областях выходных патчей, поскольку это обычно не относится к естественным изображениям. Таким образом, снижение гладкости области кажется разумным.

Состязательные проигрыши

Типичное состязательное поражение состоит из трех компонентов.

  1. Заставить дискриминатор предсказать 0 (реальный) на входном изображении (или входном патче)
  2. Заставить дискриминатор предсказать 1 на сгенерированном изображении (или патче).
  3. Заставить генератор (сеть завершения) обмануть дискриминатор, чтобы он предсказал 0 на сгенерированном изображении

Есть разные версии формулировки этого. Их сравнение можно найти в [5] (что также предполагает, что трудно выбрать одну формулировку, которая хорошо работает при любых обстоятельствах).

Простое состязательное поражение для Inpainting можно сформулировать как

L (Дискриминатор) = - (журнал (D (X)) + журнал (1-D (C (X, M)))

L (Сеть завершения) = log (1-D (C (X, M))

Обсуждение

Скетч как вход
[7] рассмотрел интересную возможность влияния на сеть завершения в том, как вы хотели бы, чтобы она завершала исправления, предоставляя сети дополнительный вход, скетч. Эскиз должен очертить форму рассматриваемого объекта.

Для набросков в качестве входных данных авторы [7] использовали края, сгенерированные детектором краев HED для изображений естественной сцены и алгоритмы CV для обнаружения ориентиров на изображениях лиц. Использование ребер делает его похожим на подход «Предсказание края в качестве первого этапа», описанный выше, за исключением того, что в этом случае они просто передают его в качестве дополнительного входа без каких-либо изменений в сети в противном случае. Добавление еще одной потери реконструкции на краях, похоже, не улучшает их результаты.

Заключение

В этой статье я представил проблему Inpainting и кратко коснулся техник из литературы. С каждым новым изменением или идеей создается новый гиперпараметр для практикующего, который должен решить, следует ли включить это в свою установку. Поскольку в целом, читая одни статьи, трудно сказать, будет ли что-то работать в целом, я не стал говорить о результатах.

Я также воздерживался от обсуждения общих деталей сетевой архитектуры, таких как выбор использования остаточных соединений или начальных блоков или настройки архитектуры U-Net, поскольку эти детали являются общими для большинства проблем со зрением, и до практикующего, чтобы увидеть, что работает для его вычислений. / требования к точности.

Более полный список научных работ по рисованию изображений можно найти здесь.

использованная литература

  1. Создание генеративного изображения с контекстным вниманием
  2. Кодировщики контекста: изучение особенностей путем рисования
  3. Завершение согласованного изображения на глобальном и локальном уровне
  4. Рисование изображений для отверстий неправильной формы с использованием частичных сверток
  5. Созданы ли GAN одинаково? Крупномасштабное исследование
  6. EdgeConnect: создание генеративного изображения с помощью Adversarial Edge Learning
  7. Создание изображений произвольной формы с помощью стробированной свертки
  8. Нейроалгоритм художественного стиля