Изменения

Перейти к: навигация, поиск

Блендинг изображений

823 байта добавлено, 22:12, 7 января 2021
Добавлены картинки
==Трансфер стиля==
Прежде чем переходить к гармонизации картин, рассмотрим задачу трансфера стиля с изображения $S$ на изображение $I$. Для этого используются выходы скрытых слоёв [[Сверточные нейронные сети | свёрточной нейронной сети ]] VGG-19<ref name="SZ14">[https://arxiv.org/pdf/1409.1556.pdf Very Deep Convolutional Networks for Large-Scale Image Recognition] Karen Simonyan, Andrew Zisserman (2014)</ref>.
Основная идея генерации изображения {{---}} решение оптимизационной задачи $\mathcal{L}(O, I, S) \longrightarrow xrightarrow[O]{} min$, где $O$ {{---}} итоговое изображение, $\mathcal{L}(O, I, S)$ {{---}} [[Функция потерь и эмпирический риск | функция потерь]]. Такую задачу можно решать градиентным спуском в пространстве изображений используя [[обратное распространение ошибки | метод обратного распространения ошибки]].
{{Определение
|definition =
$\beta_l$ {{---}} вклад $l$-го слоя в функцию потерь<ref name="NotOriginalDef"/>.}}
Итоговой функцией потерь будет $\mathcal{L}_{Gatys} = \mathcal{L}_{content}(I, O) + w_{style}\mathcal{L}_{style}(I, O)$<ref name="NotOriginalDef"/>. Вес $w_{style}$, векторы $\alpha$ и $\beta$ являются, в некотором смысле, гиперпараметрами алгоритма, которые нужно подбирать<ref name="GEB16"/>.
*'''TODO''': GEB16 Figure 3 (влияние Авторы статьи показывают, что в качестве начальной инициализации можно брать изображение $w_lI$)*'''TODO''': GEB16 Figure 4 (влияние , изображение $\alphaS$)*'''TODO''': GEB16 Figure 5 (влияние $L$)или белый шум {{---}} алгоритм даёт похожие результаты в этих случаях.
Авторы статьи показывают, что в качестве начальной инициализации можно брать изображение [[Файл:GEB16_Figure_6.png|1000px|thumb|center|Начальная инициализация: A) $O_0 = I$, изображение B) $O_0 = S$ или белый шум {{---}} алгоритм даёт похожие результаты в этих случаях<ref name, C) $O_0 ="GEB16"/>. *'''TODO''': GEB16 Figure 6 random$]]
===Histogram Loss===
$\mathcal{L}_{tv}(O) = \displaystyle\sum_{i, j} (O^l_{i, j} - O^l_{i-1, j}))^2 + (O^l_{i, j} - O^l_{i, j-1}))^2$ {{---}} общая вариационная потеря (англ. ''Total variation loss'').}}
==Глубокая гармонизация картин<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 картинка)]]Алгоритм будет состоять из двух проходов. Первый проход будет делать грубую гармонизацию, а второй {{---}} более тщательную. Отличаться они будут '''стилевым маппингом todo: придумать норм название''' и функциями потерь<ref name="LPSB17">https://arxiv.org/pdf/1804.03189.pdf Fujun Luan, Sylvain Paris, Eli Shechtman, Kavita Bala (2018)</ref>.
{{Определение
===Первый проход===
 
'''TODO:''' нормально объяснить что такое патч (возможно проще картинкой)
{{Определение
|definition =
'''Патчем''' (англ. ''patch'') для столбца $j$ будем называть тензор $3 \times 3 \times N_l$, который состоит из соседних векторов активации в тензоре свёрточного слоя, с центром в столбце $j$}}
 
[[Файл:LPSB18_Figure_2b.png|250px|thumb|right|Результаты после первого прохода]]
Первый проход делает грубую гармонизацию, но при этом он хорошо работает с любыми стилями. Здесь используется алгоритм <code>IndependentMapping</code> для построения стилевого маппинга. Этот алгоритм для каждого столбца $j$ в $F_l[I]$ ищет столбец $p(j)$ в $F_l[S]$, такой что евклидово расстояние между патчем $F_l[I]$ с центром $j$ и патчем $F_l[S]$ с центром $p(j)$ минимально (метод ближайшего соседа).
'''for''' $l \in [1 : L]$: <font color="green"> // L = количество слоёв сети </font>
'''for''' $j \in [1 : M_l]$:
'''if''' $j \in Resize(Mask, l)$: <font color="green"> // рассматриваем патчи только внутри маски, которую нужно масштабираовать масштабировать в соответсвии с размером слоя $l$ </font>
$P_l(j) \leftarrow NearestNeighborIndex(F[I], j, F[S])$
'''return''' $P$
$\mathcal{L}_1(I, S, O, P) = \mathcal{L}^{\alpha}_{content}(I, O) + w_{style}\mathcal{L}^{\beta}_{style}(S, O, P)$, где $w_{style}$ {{---}} вес стилевой функции потерь}}
* '''TODO''' Figure 2b, 5c (результаты после первого прохода)
===Второй проход===
 
[[Файл:LPSB18_Figure_2c.png|250px|thumb|right|Результаты после второго прохода]]
 
Второй проход делает более качественную гармонизацию после первого прохода. Здесь мы будем использовать более сложный алгоритм <code>ConsistentMapping</code> построения стилевого маппинга и более сложную функцию потерь. Суть этого алгоритма в том, чтобы найти стилевой мапинг на некотором слое $l_{ref}$ и перенести этот маппинг на остальные слои. Также, мы будем предпочитать маппинги, в которых смежные патчи в $F_l[S]$ остаются смежными после мапинга, чтобы обеспечить пространсвенную согласованность (видимо таким образом мы хотим переносить сложные текстуры более качественно, например мазки кистью).
$\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)$, где $w_{style}$, $w_{hist}$, $w_{tv}$ {{---}} веса соответсвующих функций потерь}}
*'''TODO''' figure 5f (результаты {|| [[Файл:LPSB18_Figure_5с.png|250px|thumb|none|Только второй проход]]| [[Файл:LPSB18_Figure_5d.png|250px|thumb|none|Только первый проход]]| [[Файл:LPSB18_Figure_5f.png|250px|thumb|none|Результат с $\mathcal{L}_{style}$ вместо $\mathcal{L}_{s1}$), 5d (результаты только после второго прохода)]]|}
===Итоговый алгоритм===
</font>
* '''TODO''' как подбирать гиперпараметры $w_{style}$, $w_{hist}$, $w_{tv}$, $\alpha$, $\beta$, $\gamma$
* '''TODO''' красивые картинки
===Постобработка===
[[Файл:LPSB18_Figure_5f.png|250px|thumb|right|Результат постобработки (без постобработки , после первой стадии, после второй стадии)]] Описанный алгоритм даёт хорошие результаты в целом, но при ближайшем рассмотрении могут быть артефакты. Поэтому сделаем двухступенчатую постобработку (подробное описание есть в оригинальной статье<ref name="LPSB17LPSB18"/>):
# Переведём изображение в [https://en.wikipedia.org/wiki/CIELAB_color_space CIELAB] и применим [https://en.wikipedia.org/wiki/Guided_filter Guided filter] для a и b каналов.
# С помощбю алгоритма PatchMatch<ref name="BSFG09">https://www.researchgate.net/profile/Eli_Shechtman/publication/220184392_PatchMatch_A_Randomized_Correspondence_Algorithm_for_Structural_Image_Editing/links/02e7e520897b12bf0f000000.pdf Connelly Barnes, Eli Shechtman, Adam Finkelstein, Dan B Goldman (2009)</ref> и того же Guided filter делаем так чтобы все патчи выходного изображения присутсвовали в стилевом (чтобы не было новых объектов или структур)
===Подбор гиперпараметров===
 
[[Файл:LPSB18_Figure_4.png|250px|thumb|none|Влияние $l_{ref}$ на результат]]
Возьмём $l_{ref}$ = conv4_1, Выберем следующие веса для слоёв:
58
правок

Навигация