58
правок
Изменения
→Глубокая гармонизация картинhttps://arxiv.org/pdf/1804.03189.pdf Fujun Luan, Sylvain Paris, Eli Shechtman, Kavita Bala (2018)
==Глубокая гармонизация картин<ref name="LPSB18">https://arxiv.org/pdf/1804.03189.pdf Fujun Luan, Sylvain Paris, Eli Shechtman, Kavita Bala (2018)</ref>==
Для того чтобы вставить изображение в картину или рисунок нужно не только сделать бесшовный переход и изменить цвета, но ещё и изменить текстуру вставляемого изображения, например , сымитировать мазки кистью. Используем для этого комбинацию подходов из других статей<ref name="GEB16"/><ref name="JAFF16"/><ref name="WRB17"/>.
[[Файл:LPSB18_Figure_1.png|1000px|thumb|center|Пример работы алгоритма ''Deep Image Analogy''<ref name="LYY*17">[https://arxiv.org/pdf/1705.01088.pdf Visual Attribute Transfer through Deep Image Analogy] Jing Liao, Yuan Yao, Lu Yuan, Gang Hua, Sing Bing Kang (2017)</ref> ($3 $ картинка) и ''Deep Painterly Harmonization''<ref name="LPSB18"/> ($4 $ картинка)]]
Алгоритм будет состоять из двух проходов. Первый проход будет делать грубую гармонизацию, а второй {{---}} более тщательную. Отличаться они будут '''стилевым маппингом''' и функциями потерь.
# Входное $I$ и стилевое $S$ изображения подаются на вход нейронной сети VGG-19, так мы получаем $F^l_{ij}\left[I\right]$ и $F^l_{ij}\left[S\right]$.
# Для каждого слоя $l$ некоторым алгоритмом $\pi$ cтроится стилевой маппинг $P_l$, который сопоставляет столбцам из $F_l[I]$ столбцы из $F_l[S]$.
# Изображение $O$ восстанавливается градиентным спуском по пространству изображений, используя некоторую функцию с использованием функции потерь $\mathcal{L}$.
<font size="3em">
'''fun''' $SinglePassHarmonization$(
<font color="green">// Градиентным спуском ищем изображение $O$, которое минимизирует $\mathcal{L}$ </font>
$O \leftarrow Reconstruct(I, M, S, P, \mathcal{L})$
'''return''' $O$
</font>
{{Определение
|definition =
'''Вектор активации''' (англ. ''activation vector'') {{---}} это вектор значений функции активации для каждого фильтра свёрточного слоя. Заметим, что столбцы столбец $F_l$ являются векторами активации.}}
{{Определение
|definition =
'''Патчем''' (англ. ''patch'') для столбца $j$ будем называть тензор $3 \times 3 \times N_l$, который состоит из соседних векторов активации в тензоре выхода свёрточного слоя, с центром в столбце $(x, y)$, где $j= y \times W_l + x$.}}
<!--
<div class="tright" style="clear:none">[[Файл:LPSB18_Figure_2b.png|250px|thumb|none|Результаты после первого прохода]]</div>
Первый проход делает грубую гармонизацию, но при этом он хорошо работает с любыми стилями. Здесь используется алгоритм <code>$IndependentMapping</code> $ для построения стилевого маппинга. Этот алгоритм для каждого столбца $j$ в $F_l[I]$ ищет столбец $p(j)$ в $F_l[S]$, такой что евклидово расстояние между патчем $F_l[I]$ с центром $j$ и патчем $F_l[S]$ с центром $p(j)$ минимально (метод ближайшего соседа).
<font size="3em">
</font>
В первом проходе используется модифицированная функция потерь $\mathcal{L}_{Gatys}$, с тем лишь отличием, что в $\mathcal{L}^{\beta}_{style}$ к $F_l[S]$ применяется стилевой маппинг $P_l$.
$$\mathcal{L}_1(I, S, O, P) = \mathcal{L}^{\alpha}_{content}(I, O) + w_{style}\mathcal{L}^{\beta}_{style}(S, O, P) \text{, где } w_{style} \text{ {{---}} вес стилевой функции потерь}$$
<!--[[Файл:LPSB18_Figure_2c.png|250px|thumb|right|Результаты после второго прохода]]-->
Второй проход делает более качественную гармонизацию после первого прохода. Здесь мы будем использовать более сложный алгоритм $ConsistentMapping$ построения стилевого маппинга и более сложную функцию потерь. Суть этого алгоритма в том, чтобы найти стилевой мапинг на некотором слое $l_{ref}$ и перенести этот маппинг на остальные слои. Также, мы будем предпочитать маппинги, в которых смежные патчи в $F_l[S]$ остаются смежными после мапинга, чтобы обеспечить пространсвенную согласованность (видимо таким образом мы хотим переносить сложные текстуры более качественно, например , мазки кистью).
<font size="3em">
$CSet \leftarrow \{q\}$
<font color="green">// Перебираем все смежные патчи </font>
'''for''' $o \in \left\{N, NE, E, SE, S, SW, W, NW\right\}$:
<font color="green">// Добавляем в кандидаты патч, сосед которого является маппингом для нашего соседа в соответсвующем направлении </font>
$CSet \leftarrow CSet \cup \left\{P_0(j + o) - o\right\}$
<font color="green">// Переносим позицию $q$ обратно на слой $l$</font>
$P_l(j) \leftarrow ChangeResolution(l_{ref}, l, q)$
'''return''' $P$
</font>
$$\mathcal{L}_2(I, S, O, P) = \mathcal{L}^{\alpha}_{content}(I, O) + w_{style}\mathcal{L}^{\beta}_{s1}(S, O, P) + w_{hist}\mathcal{L}^{\gamma}_{hist}(S, O) + w_{tv}\mathcal{L}_{tv}(O) \text{, где } w_{style}, w_{hist}, w_{tv} \text{ {{---}} веса соответсвующих функций потерь}$$
{|class="wikitable" style="background-color:#FFF; text-align:center"|-! Только второй проход! Только первый проход! Результат с $\mathcal{L}_{style}$ вместо $\mathcal{L}_{s1}$|-| [[Файл:LPSB18_Figure_5c.png|250px|thumb|none|Только второй проход]]| [[Файл:LPSB18_Figure_5d.png|250px|thumb|none|Только первый проход]]| [[Файл:LPSB18_Figure_5f.png|250px|thumb|none|Результат с $\mathcal{L}_{style}$ вместо $\mathcal{L}_{s1}$]]
|}
Введём гиперпараметр $\tau$ и возьмём $w_{style} = w_{hist} = \tau$, $w_{tv} = \tau\frac{10}{1 + \exp(10^4 * noise(S) - 25)}$, где $noise(S) = \underset{i,j}{\mathrm{med}}\left\{\left(O^l_{i, j} - O^l_{i-1, j}\right)^2 + \left(O^l_{i, j} - O^l_{i, j-1}\right)^2\right\}$<ref>[https://github.com/luanfujun/deep-painterly-harmonization/blob/a33a9a70366b6baff1cc0291f857b5895b271fc1/neural_paint.lua#L470 код функции $noise$</ref>
Для того чтобы подбирать $\tau$ авторы статьи использовали классификатор стилей изображений. Они взяли VGG-19, обучили её классифицировать $18 $ различных стилей. Эти стили были разделены на $3 $ категории с разными $\tau$. Используя $Softmax $ можно интерполировать необходимый $\tau$ по следующей таблице:
{| class="wikitable"