58
правок
Изменения
Убрал лоссы из определений, переработал раздел с переносом стиля.
Mетод Пуассона сдвигает цвета накладываемого изображения, сохраняя свойства градиента (т.е. если пиксель $I_{p1}$ был меньше $I_{p2}$, то после преобразования $I_{p1}$ не станет больше $I_{p2}$), однако само значение градиета может получиться другим.<ref name='clear_poisson'>https://erkaman.github.io/posts/poisson_blending.html Poisson blending для самых маленьких</ref>
==Трансфер Нейронный перенос стиля==
{{main|Neural Style Transfer}}
Прежде чем переходить к гармонизации картин, рассмотрим задачу трансфера нейронного переноса стиля с изображения $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}(I, S, O) \xrightarrow[O]{} min$, где $O$ {{---}} итоговое изображение, $\mathcal{L}(I, S, O)$ {{---}} [[Функция потерь и эмпирический риск | функция потерь]]. Такую задачу можно решать градиентным спуском в пространстве изображений используя [[обратное распространение ошибки | метод обратного распространения ошибки]].
{{Определение
|definition =
Пусть $F^l\left[I\right] \in \mathcal{R}^{N_l \times M_l}$ {{---}} выход матрица значений выхода $l$-го слоя сети на изображении $I$. Выход $l$-го слоя сети имеет размерность $N_l \times W_l \times H_l$. Представим его как матрицу $N_l \times M_l$, где $N_l$ {{---}} количество фильтров в $l$-ом слое, $M_l$ {{---}} количество признаков (высота, умноженная на ширину$M_l = W_l H_l$). Тогда $F^l_{ij}\left[I\right]$ {{---}} $j$-ый признак $i$-го фильтра в $l$-ом слое. Столбец матрицы $F^l\left[I\right]$ отражает содержание изображенияразмера $N_l$ назовём '''вектором активации'''.}}
{{Определение
|definition =
'''Матрица Грама''' (англ. ''Gram matrix'') {{---}} матрица попарных скалярных произведений. В нашем случае матрица отражает статистику выходов фильтров независимо от их расположения, что, в свою очередь, отражает стиль изображения. $$G^l\left[IS\right] \in \mathcal{R}^{N_l \times N_l},$$$$G^l\left[IS\right] = F^l\left[IS\right]F^l\left[IS\right]^T.$$}}
Скомбинируем $\mathcal{L}_{content}$ и $\mathcal{L}_{style}$ и получим функцию потерь, которая была использована в алгоритме Гатиса<ref name="GEB16">[[Файлhttps:GEB16_Figure_6//rn-unison.png|1000px|thumb|center|Начальная инициализация: '''github.io/articulos/style_transfer.pdf Image Style Transfer Using Convolutional Neural Networks] Leon A. Gatys, Alexander S. Ecker, Matthias Bethge (2016)''' </ref>:$O_0 $\mathcal{L}_{Gatys}(I, S, O) = \mathcal{L}_{content}(I$; '''B, O) + w_{style}\mathcal{L}_{style}(S, O)''' .$O_0 = S$; '''C)''' Вес $O_0 = randomw_{style}$, векторы $4\alpha$ примера инициализированы различными белыми шумами ]]и $\beta$ являются, в некотором смысле, гиперпараметрами алгоритма, которые мы выберем позднее.
===Histogram Loss===
Авторы другой статьи<ref name="WRB17">[https://arxiv.org/pdf/1701.08893.pdf Stable and Controllable Neural Texture Synthesis and Style Transfer Using Histogram Losses] Eric Risser, Pierre Wilmot, Connelly Barnes (2017)</ref> показывают, что результаты, полученные с помощью $\mathcal{L}_{Gatys}$ нестабильны и предложили другую учитывать ещё одну функцию потерь, основанную на '''сопоставлении гистограмм'''.
{{Определение
|definition =
'''Сопоставление гистограмм''' (англ. ''Histogram matching'') {{---}} метод обработки изображения, после которого гистограмма изображения совпадает с целевой гистограммой<ref name="HistMatch">https://en.wikipedia.org/wiki/Histogram_matching</ref>.}}
'''Замечание:''' Если в случае остальных функций потерь нетрудно посчитать производную, то здесь могут возникнуть проблемы. Но поскольку $\displaystyle\frac{\partial \mathcal{L}_{hist}}{\partial F^l_{ij}\left[O\right]}$ является нулём почти везде, авторы предлагают при подсчёте производной считать $R\left(F^l_{ij}\left[O\right]\right)$ константой, которая не зависит от $O$.
===Total variation loss===
Также добавим ещё одну функцию потерь, которая удаляет шумы, при этом сохраняя важные детали изображения<ref name="MV15">[https://arxiv.org/pdf/1412.0035.pdf Understanding Deep Image Representations by Inverting Them] Aravindh Mahendran, Andrea Vedaldi (2015)</ref><ref name="JAFF16">[https://arxiv.org/pdf/1603.08155.pdf Perceptual Losses for Real-Time Style Transfer and Super-Resolution] Justin Johnson, Alexandre Alahi, Li Fei-Fei (2016)</ref>.{{Определение:|id=tv_loss_def|definition =$$\mathcal{L}_{tv}(O) = \displaystyle\sum_{i, j} \left(O^l_{i, j} - O^l_{i-1, j}\right)^2 + \left(O^l_{i, j} - O^l_{i, j-1}\right)^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$ картинка)]]
Алгоритм будет состоять состоит из двух проходов. Первый проход будет делать делает грубую гармонизацию, а второй {{---}} более тщательную. Отличаться Отличаются они будут '''стилевым маппингом''' и функциями потерь<ref name="LPSB18">https://arxiv.org/pdf/1804.03189.pdf Fujun Luan, Sylvain Paris, Eli Shechtman, Kavita Bala (2018)</ref>.
{{Определение
|definition =
'''Стилевым маппингом''' мы будем называть назовём отображение $P : \mathcal{R}^{N_l \times M_l} \rightarrow \mathcal{R}^{N_l \times M_l}$, которое некоторым образом переставляет столбцы матрицы (не обязательно обратимо, то есть столбцы могут теряться и копироваться). Более формально, пусть $p(j)$ {{---}} новая позиция столбца $j$, тогда $P(Q)_{i, p(j)} = Q_{ij}$.}}
Один проход будет состоять состоит из $3$ частей:
# Входное $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]$.
{{Определение
|definition =
<!--
</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{ {{---}} вес стилевой функции потерь.}$$
'''Замечание:''' при посчёте градиента $\mathcal{L}^{\alpha}_{content}$ используются только пиксели внутри маски<ref>https://github.com/luanfujun/deep-painterly-harmonization/blob/a33a9a70366b6baff1cc0291f857b5895b271fc1/neural_gram.lua#L349</ref>.
===Второй проход===
</font>
При вычислении стилевого маппинга появляется очень много дублирующихся векторов, что даёт не очень хорошие результаты. Поэтому при вычислении матрицы Грама выкинем повторяющиеся векторы. Назовём эту функцию потерь с такой модификацией $\mathcal{L}_{s1}$.
$$\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"
Описанный алгоритм даёт хорошие результаты в целом, но при ближайшем рассмотрении могут быть артефакты. Поэтому сделаем двухступенчатую постобработку (подробное описание есть в оригинальной статье<ref name="LPSB18"/>):
# Переведём изображение в цветовое пространство [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 делаем так, чтобы все патчи выходного изображения присутсвовали в стилевом (чтобы не было новых объектов или структур).
|}
Введём гиперпараметр $\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$ по следующей таблице:
| [[Файл:Deep bl i3.png|150px]]
|}
{{Определение
|}
Рассмотрим область $\overline{\Omega} = \{Определение\;p \;|id\;M_p =grad_loss_def|definition =0\; \}$. Заметим, что градиент $I$ в $\mathcaloverline{L\Omega}_{grad}($ равен нулю. Тогда градиенты $S$ и $B$ совпадают, I, M, O) = и задача минимизации $\displaystyle\fracmathcal{1L}_{2HWgrad}$ решается только в области вставки. На обоих этапах алгоритм минимизирует взвешенную сумму следующих функций потерь:* $\displaystyle\sum_mathcal{m=1L}^H \displaystyle\sum__{n=1content}^W $ для сохранения содержания накладываемого изображения $I$.* $\left[ \mathbfmathcal{DL}^2 B - \left(\mathbf_{Dstyle}^2 $ для переноса стиля изображения $S + $ на $I$.* $\mathbfmathcal{DL}^2 I\right) \right]^2__{mnhist}$ {{---}} градиентная функция потерь (англ. ''Possion gradient loss'')для стабилизации переноса стиля. * $H, W$ \mathcal{L}_{---tv}} высота и ширина изображений$ для удаления шумов. * $B = CAP(M, S, O)$ \mathcal{L}_{---}grad} блендинговое изображение, оптимизируемое относительно $O$для сохранения контуров фона и изображения. }}
=== Первый этап ===
На первом этапе изображение $I$ накладывается на фоновое изображение $S$ таким образом, чтобы были незаметны швы.
Построение начинается с белого шума $Z$, который оптимизируется в области вставки путем минимизации суммарной функции потерь $\mathcal{L}_{total}$, представленной взвешенной суммой всех функций потерь, описанных выше:
$$ \mathcal{L}_{total}(Z) = w_{grad}\mathcal{L}_{grad}(I, S, B) + w_{contcontent}\mathcal{L}_{contcontent}(I, M, Z) + w_{style}\mathcal{L}_{style}(S, B) + w_{tv}\mathcal{L}_{tv}(B) + w_{hist}\mathcal{L}_{hist}(S, B).$$Отметим, что $\mathcal{L}_{contcontent}$ зависит от маски и отвечает за сохранение содержания $I$ в области вставки.
Отличительной чертой этого этапа является использование функции потерь $\mathcal{L}_{grad}$, приближающей градиент результата к градиенту $I$ в области наложения, за счет чего достигается бесшовность.
$B \leftarrow CAP(M, S, Z)$
<font color="green">// Определим суммарную функцию потерь с весами слагаемых $w$</font>
$\mathcal{L}_{total}(Z) \leftarrow w_{grad}\mathcal{L}_{grad}(I, S, B) + w_{contcontent}\mathcal{L}_{contcontent}(I, M, Z) + w_{style}\mathcal{L}_{style}(S, B) + w_{tv}\mathcal{L}_{tv}(B) + w_{hist}\mathcal{L}_{hist}(S, B)$
<font color="green">// С помощью алгоритма L-BFGS ищем изображение $Z$, которое минимизирует $\mathcal{L}_{total}$ </font>
$Z \leftarrow Reconstruct(\mathcal{L}_{total}, Z)$
В отличие от предыдущего этапа, функция потерь не включает в себя $\mathcal{L}_{grad}$:
$$\mathcal{L}_{total}(O) = w_{contcontent}\mathcal{L}_{contcontent}(B, O) + w_{style}\mathcal{L}_{style}(S, O) + w_{tv}\mathcal{L}_{tv}(O) + w_{hist}\mathcal{L}_{hist}(S, O).$$
Минимизация происходит относительно результата алгоритма $O$, который инициализируется изображением $B$.
$O \leftarrow B$
<font color="green">// Определим суммарную функцию потерь с весами слагаемых $w$</font>
$\mathcal{L}_{total}(O) \leftarrow w_{cont}\mathcal{L}_{contcontent}(B, O) + w_{style}\mathcal{L}_{style}(S, O) + w_{tv}\mathcal{L}_{tv}(O) + w_{hist}\mathcal{L}_{hist}(S, O)$
<font color="green">// С помощью алгоритма L-BFGS ищем изображение $O$, которое минимизирует $\mathcal{L}_{total}$ </font>
$O \leftarrow Reconstruct(\mathcal{L}_{total}, O)$
! Этап
! $w_{grad}$
! $w_{contcontent}$
! $w_{style}$
! $w_{hist}$
|}
Для подсчета $\mathcal{L}_{style}$ используются слои conv1_2, conv2_2, conv3_3, conv4_3 $VGG$, для $\mathcal{L}_{contcontent}$ {{---}} conv2_2.
На обоих этапах максимальное количество итераций алгоритма L-BFGS {{---}} $1000$.