58
правок
Изменения
Чуть лучше (надеюсь) стиль картинок
'''Патчем''' (англ. ''patch'') для столбца $j$ будем называть тензор $3 \times 3 \times N_l$, который состоит из соседних векторов активации в тензоре свёрточного слоя, с центром в столбце $j$}}
<!--{| class="wikitable" style="float:right; clear:right;"|-| [[Файл:LPSB18_Figure_2b.png|250px|thumb|rightnone|Результаты после первого прохода]]| [[Файл:LPSB18_Figure_2c.png|250px|thumb|none|Результаты после второго прохода]]|}--> <div class="tright" style="clear:none">[[Файл:LPSB18_Figure_2c.png|250px|thumb|none|Результаты после второго прохода]]</div><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)$ минимально (метод ближайшего соседа).
В первом проходе используется модифицированная функция потерь $\mathcal{L}_{Gatys}$, с тем лишь отличием, что к $F_l[S]$ применяется стилевой маппинг $P_l$.
===Второй проход===
<!--[[Файл:LPSB18_Figure_2c.png|250px|thumb|right|Результаты после второго прохода]]-->
Второй проход делает более качественную гармонизацию после первого прохода. Здесь мы будем использовать более сложный алгоритм <code>ConsistentMapping</code> построения стилевого маппинга и более сложную функцию потерь. Суть этого алгоритма в том, чтобы найти стилевой мапинг на некотором слое $l_{ref}$ и перенести этот маппинг на остальные слои. Также, мы будем предпочитать маппинги, в которых смежные патчи в $F_l[S]$ остаются смежными после мапинга, чтобы обеспечить пространсвенную согласованность (видимо таким образом мы хотим переносить сложные текстуры более качественно, например мазки кистью).
При вычислении стилевого маппинга появляется очень много дублирующихся векторов, что даёт не очень хорошие результаты. Поэтому при вычислении матрицы Грама выкинем повторяющиеся векторы. Назовём эту функцию потерь $\mathcal{L}_{s1}$.
{|
===Постобработка===
[[Файл:LPSB18_Figure_6abc.png|400px|thumb|right|Результат постобработки (без постобработки , после первой стадии, после второй стадии)]]
Описанный алгоритм даёт хорошие результаты в целом, но при ближайшем рассмотрении могут быть артефакты. Поэтому сделаем двухступенчатую постобработку (подробное описание есть в оригинальной статье<ref name="LPSB18"/>):
===Подбор гиперпараметров===
[[Файл:LPSB18_Figure_4.png|400px|thumb|noneright|Влияние $l_{ref}$ на результат]]
Возьмём $l_{ref}$ = conv4_1.
==Глубокий блендинг==
<!-- Настя лапочка :3 -->
Алгоритм глубокого блендинга состоит из двух этапов. На первом этапе на стилевое изображения $S$ бесшовно накладывается входное изображение $I$, получается подготовительное блендинг-изображение $B$. На втором этапе $B$ модифицируется таким образом, чтобы результат по стилю был похож на $S$.
=== Первый этап ===
<div class="tright" style="clear:none">[[Файл:Deep bl 2stage.png|thumb|none|200px|Результат после обоих этапов]]</div><div class="tright" style="clear:none">[[Файл:Deep bl 1stage.png|thumb|rightnone|200px|Результат первого этапа]]</div>
На первом этапе изображение $I$ накладывается на фоновое изображение $S$ таким образом, чтобы были незаметны швы.
Построение начинается с белого шума $Z$, который оптимизируется в области вставки путем минимизации суммарной функции потерь $\mathcal{L}_{total}$, представленной взвешенной суммой всех функций потерь, описанных выше:
=== Второй этап ===
Второй этап алгоритма представляет собой модификацию полученного на первом этапе блендинг-изображения $B$ таким образом, чтобы стиль изображения был наиболее близок к стилю $S$.