Изменения

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

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

6114 байт добавлено, 19:44, 4 сентября 2022
м
rollbackEdits.php mass rollback
Копирование элемента одного изображения и его вставка на другое изображение {{---}} один из наиболее используемых методов для создания графического контента. Простая вставка, как правило, бросается в глаза и делает результат похожим на коллаж, во многих случаях этот эффект является нежелательным.
{{Определение
|definition =
'''Блендинг изображений''' (англ. ''image blending'') {{---}} метод, позволяющий вставить часть одного изображения в другое таким образом, чтобы композиция изображений выглядела естественно, без швов на границах вставки . }}Основная трудность задачи заключается в том, что естественность результата зависит не только от бесшовности наложения, но и соответсвующими цветами от схожести цветов и текстурамитекстуры вставляемого и фонового изображений. }  {|! Вставляемое изображение! Фоновое изображение! Простая вставка! Желаемый результат|-| [[Файл:Diver bl diver.png|180px]]| [[Файл:Diver bl sea.png|180px]]| [[Файл:Diver bl2.png|180px]]| [[Файл:Diver bl3.png|180px]]|}
==Блендинг Пуассона==
[[Файл:Poisson int1.png|thumb|right|300px250px|Рис. Рисунок $1.1$. : Пример перепада яркости при простой вставке<ref name='ZWS20'/>]][[Файл:Poisson int2.png|thumb|right|300px250px|Рис. Рисунок $1.2$. : Результат применения блендинга Пуассона<ref name='ZWS20'/>]]
Простая вставка одного изображения поверх другого нередко влечет заметный перепад яркости на границе вставки (рис. рисунок $1.1$). Метод Пуассона заключается в сглаживании этого перепада (рис. рисунок $1.2$) с целью сделать дефект менее заметным, используя градиент вставляемого изображения и значения пикселей фонового изображения на границе вставки.
'''Замечание:''' Для RGB изображений задача минимизации решается для каждого цветового канала отдельно.
! Маска $M$
|-
| [[Файл:Poisson_cat.jpg|200px155px]]| [[Файл:Poisson_cherry.jpg|200px155px]]| [[Файл:Poisson_cherry_mask.png|200px155px]]
|}
=== Дискретный случай ===
Пусть $p$ {{---}} координаты $(x, y)$ пикселя двухмерного изображения. За $Img_p$ обозначим значение пикселя с координатами $p$ изображения $Img$. Пусть $\Omega = \left\{ p\;|\;M_p = 1 \right\}$ {{---}} область, заданная маской $M$. Тогда $\partial \Omega$ {{---}} координаты границы вставляемой области, а $int(\Omega)$ {{---}} внутренность области.
Пусть $N_p$ {{---}} множество соседей $p$ (максимум четыре пикселя, имеющих общую границу с $p$, т.е. пиксели со следующими координатами: $(x + 1, y), (x - 1, y), (x, y + 1), (x, y - 1)$). Для всех пар $(p, q)$ таких, что $q \in N_p$, введем $v_{pq} = I_p - I_q$.
==Нейронный перенос стиля==
{{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)$ {{---}} [[Функция потерь и эмпирический риск | функция потерь]]. Такую задачу можно решать градиентным спуском в пространстве изображений используя [[обратное распространение ошибки | метод обратного распространения ошибки]].
==Глубокая гармонизация картин==
Для того чтобы вставить изображение в картину или рисунок нужно не только сделать бесшовный переход и изменить цвета, но ещё и изменить текстуру вставляемого изображения, например, сымитировать мазки кистью(рисунок $2$). Используем для этого комбинацию подходов из других статей<ref name="GEB16"/><ref name="JAFF16"/><ref name="WRB17"/>.
<div class="oo-ui-panelLayout-scrollable" style="display: block; vertical-align:middle; height: auto; max-width: auto; float: center">[[Файл:LPSB18_Figure_1.png|1000px750px|thumb|center|Рисунок $2$: Пример работы алгоритма ''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$ картинка)]]</div>
Алгоритм состоит из двух проходов. Первый проход делает грубую гармонизацию, а второй {{---}} более тщательную. Отличаются они '''стилевым маппингом''' и функциями потерь<ref name="LPSB18">https://arxiv.org/pdf/1804.03189.pdf Fujun Luan, Sylvain Paris, Eli Shechtman, Kavita Bala (2018)</ref>.
'''Патчем''' (англ. ''patch'') для столбца $j$ будем называть тензор $3 \times 3 \times N_l$, который состоит из соседних векторов активации в тензоре выхода свёрточного слоя, с центром в $(x, y)$, где $j = y W_l + x$.}}
<!--
{| class="wikitable" style="float:right; clear:right;"
|-
| [[Файл:LPSB18_Figure_2b.png|250px|thumb|none|Результаты после первого прохода]]
| [[Файл:LPSB18_Figure_2c.png|250px|thumb|none|Результаты после второго прохода]]
|}
-->
<div class="tright" style="clear:none">[[Файл:LPSB18_Figure_2c.png|250px|thumb|none|Рисунок $3.2$: Результаты после второго прохода<ref name="WRB17"/>]]</div><div class="tright" style="clear:none">[[Файл:LPSB18_Figure_2b.png|250px|thumb|none|Рисунок $3.1$: Результаты после первого прохода<ref name="WRB17"/>]]</div>
Первый проход делает грубую гармонизацию, но при этом он хорошо работает с любыми стилями(рисунок $3.1$). Здесь используется алгоритм $IndependentMapping$ для построения стилевого маппинга. Этот алгоритм для каждого столбца $j$ в $F_l[I]$ ищет столбец $p(j)$ в $F_l[S]$, такой что евклидово расстояние между патчем $F_l[I]$ с центром $j$ и патчем $F_l[S]$ с центром $p(j)$ минимально (метод ближайшего соседа).
<font size="3em">
===Второй проход===
[[Файл:LPSB18_Figure_5c.png|thumb|right|250px|Рисунок $4.1$: Только первый проход<!--ref name="WRB17"/>]][[Файл:LPSB18_Figure_2cLPSB18_Figure_5d.png|thumb|right|250px|Рисунок $4.2$: Только второй проход<ref name="WRB17"/>]][[Файл:LPSB18_Figure_5f.png|thumb|right|250px|Рисунок $4.3$: Результат с $\mathcal{L}_{style}$ вместо $\mathcal{L}_{s1}$<ref name="WRB17"/>]][[Файл:LPSB18_Figure_5g.png|thumb|right|Результаты после второго 250px|Рисунок $4.4$: Оба прохода<ref name="WRB17"/>]]--[[Файл:LPSB18_Figure_5h.png|thumb|right|250px|Рисунок $4.5$: Финальный результат<ref name="WRB17"/>]]
Второй проход делает более качественную гармонизацию после первого прохода(рисунок $3.2$). Здесь мы будем использовать более сложный алгоритм $ConsistentMapping$ построения стилевого маппинга и более сложную функцию потерь. Суть этого алгоритма в том, чтобы найти стилевой мапинг на некотором слое $l_{ref}$ и перенести этот маппинг на остальные слои. Также, мы будем предпочитать маппинги, в которых смежные патчи в $F_l[S]$ остаются смежными после мапинга, чтобы обеспечить пространсвенную согласованность (таким образом мы хотим переносить сложные текстуры более качественно, например, мазки кистью). Если применять второй проход сразу, то результаты получаются хуже (рисунок $4.2$).
<font size="3em">
</font>
При вычислении стилевого маппинга появляется очень много дублирующихся векторов, что даёт не очень хорошие результаты(рисунок $4.3$). Поэтому при вычислении матрицы Грама выкинем повторяющиеся векторы. Назовём функцию потерь с такой модификацией $\mathcal{L}_{s1}$.
$$\mathcal{L}_2(I, S, O, P) = \mathcal{L}_{content}(I, O) + w_{style}\mathcal{L}_{s1}(S, O, P) + w_{hist}\mathcal{L}_{hist}(S, O) + w_{tv}\mathcal{L}_{tv}(O),$$
где $w_{style}, w_{hist}, w_{tv}$ {{---}} веса соответсвующих функций потерь.
<!--
{| class="wikitable" style="background-color:#FFF; text-align:center"
|-
! | Рисунок $4.1$: Только второй первый проход<ref name="WRB17"/>! | Рисунок $4.2$: Только первый второй проход<ref name="WRB17"/>! | Рисунок $4.3$: Результат с $\mathcal{L}_{style}$ вместо $\mathcal{L}_{s1}$<ref name="WRB17"/>| Рисунок $4.4$: Оба прохода<ref name="WRB17"/>| Рисунок $4.5$: Финальный результат<ref name="WRB17"/>
|-
| [[Файл:LPSB18_Figure_5c.png|250px]]
| [[Файл:LPSB18_Figure_5d.png|250px]]
| [[Файл:LPSB18_Figure_5f.png|250px]]
| [[Файл:LPSB18_Figure_5g.png|250px]]
| [[Файл:LPSB18_Figure_5h.png|250px]]
|}
-->
===Итоговый алгоритм===
===Постобработка===
[[Файл:LPSB18_Figure_6abc.png|400px|thumb|right|Рисунок $5$: Результат постобработки (без постобработки, после первой стадии, после второй стадии)<ref name="WRB17"/>]]
Описанный алгоритм даёт хорошие результаты в целом, но при ближайшем рассмотрении могут быть артефакты(рисунок $5$). Поэтому сделаем двухступенчатую постобработку (подробное описание есть в оригинальной статье<ref name="LPSB18"/>):# Переведём изображение в цветовое пространство [https://en.wikipedia.org/wiki/CIELAB_color_space CIELAB$L*\alpha*\beta$] и применим [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|400px|thumb|right|Рисунок $6$: Влияние $l_{ref}$ на результат<ref name="WRB17"/>]]
Возьмём $l_{ref}$ = conv4_1(что будет если использовать другие слои видно на рисунке $6$).
Выберем следующие веса для слоёв:
|}
<!--
{| class="wikitable"
|+ Веса функций потерь
|-
! $w_{style}$
! $w_{hist}$
! $w_{tv}$
|-
| $\tau$
| $\tau$
| $\tau\frac{10}{1 + \exp(10^4 * noise(S) - 25)}$
|}
-->
Введём гиперпараметр $\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>.
| $10$
|}
 
На рисунке $4.4$ результат алгоритма без подбора гиперпараметров. Видно, что самолёт ярче, чем остальное изображение. С подбором параметров получается более естественный результат (рисунок $4.5$).
===Примеры===
Примеры взяты с [https://github.com/luanfujun/deep-painterly-harmonization/tree/master/results Github авторов].
{|
! Постобработка
|-
| [[Файл:5_target.jpg|300px180px]]| [[Файл:5_naive.jpg|300px180px]]| [[Файл:5_final_res.png|300px180px]]| [[Файл:5_final_res2.png|300px180px]]
|-
| [[Файл:6_target.jpg|300px180px]]| [[Файл:6_naive.jpg|300px180px]]| [[Файл:6_final_res.png|300px180px]]| [[Файл:6_final_res2.png|300px180px]]
|-
| [[Файл:10_target.jpg|300px180px]]| [[Файл:10_naive.jpg|300px180px]]| [[Файл:10_final_res.png|300px180px]]| [[Файл:10_final_res2.png|300px180px]]
|}
 
===Более новые подходы===
 
* [https://arxiv.org/pdf/2006.00809.pdf Foreground-aware Semantic Representations for Image Harmonization]
* [https://arxiv.org/pdf/2009.09169.pdf BargainNet: Background-Guided Domain Translation for Image Harmonization]
==Глубокий блендинг==
Будем считать, что на вход подаются изображения, прошедшие предварительную обработку:
* Используемая для вставки часть $I$ вырезана с помощью маски .* $M$ и $I$ выровнены относительно $S$.* Размеры матриц, задающих $M, S, I$ , совпадают.
'''Примеры входных данных:'''
{| class="wikitable" style="background-color:#FFF; text-align:center"
! '''Стилевое <br/> изображение $S$'''<ref name='ZWS20'/>
| [[Файл:Deep bl s1.png|150px]]
| [[Файл:Deep bl s2.png|150px]]
| [[Файл:Deep bl s3.png|150px]]
|-
! '''Накладываемое <br/> изображение $I$'''<ref name='ZWS20'/>
| [[Файл:Deep bl i1.png|150px]]
| [[Файл:Deep bl i2.png|150px]]
{{Определение
|definition =
'''Дискретный оператор Лапласа''' (фильтр Лапласа) $\mathbf{D}^2$ {{---}} аналог непрерывного оператора Лапласа $\nabla^2$, который позволяет выделять контуры изображения(рисунки $7.1$ и $7.2$).
$$\mathbf{D}^2=\begin{bmatrix}0 & 1 & 0\\1 & -4 & 1\\0 & 1 & 0\end{bmatrix}.$$ }}
{| class="wikitable" style="float:right; clear:right;"
!Рисунок $7.1$:<br>Исходное изображение<ref>https://en.wikipedia.org/wiki/Lenna#/media/File:Lenna_(test_image).png</ref>!Рисунок $7.2$:<br>Применение фильтра Лапласа
|-
| [[Файл:Lenna.png|200px220px]]| [[Файл:Lenna_Laplacian_Neg.png|200px220px]]
|}
Построение начинается с белого шума $Z$, который оптимизируется в области вставки путем минимизации суммарной функции потерь $\mathcal{L}_{total}$, представленной взвешенной суммой всех функций потерь, описанных выше:
$$ \mathcal{L}_{total}(Z) = w_{grad}\mathcal{L}_{grad}(I, S, B) + w_{content}\mathcal{L}_{content}(I, M, Z) + w_{style}\mathcal{L}_{style}(S, B) + w_{tv}\mathcal{L}_{tv}(B) + w_{hist}\mathcal{L}_{hist}(S, B).$$
Для решения задачи минимизации авторы статьи<ref name='ZWS20' /> используют алгоритм L-BFGS<ref name="LBFGS">https://en.wikipedia.org/wiki/Limited-memory_BFGS Limited-memory BFGS - Wikipedia</ref>.
 
Отметим, что $\mathcal{L}_{content}$ зависит от маски и отвечает за сохранение содержания $I$ в области вставки.
'''return''' $O$
</font>
 
Примеры с [https://github.com/owenzlz/DeepImageBlending/tree/master/results Github авторов]:
{|
===Детали реализации===
В статье использовались следующие значения коэффициентов:
{| class="wikitable"
| $10^{-6}$
|}
 <!--Для подсчета $\mathcal{L}_{style}$ используются слои conv1_2, conv2_2, conv3_3, conv4_3 $VGG$-19, для $\mathcal{L}_{content}$ {{---}} conv2_2.-->{| class="wikitable"|+ Коэффициенты $\alpha$ и $\beta$|-! Параметр ! conv1_2 ! conv2_2! conv3_3! conv4_3 |-! $\alpha$ | $0$| $1$| $0$| $0$|-! $\beta$| $1/4$| $1/4$| $1/4$| $1/4$|}
На обоих этапах максимальное количество итераций алгоритма L-BFGS {{---}} $1000$.
=== Примеры ===
Примеры с [https://github.com/owenzlz/DeepImageBlending/tree/master/results Github авторов]: [[Файл:МЛ блендинг пример.png|1000px800px]]
==См. также==
* [[Neural_Style_Transfer|Neural Style Transfer]]
* [[Сверточные_нейронные_сети | Свёрточная нейронная сеть]]
 
==Источники информации==
* [https://en.wikipedia.org/wiki/Histogram_matching Histogram matching]
* Patrick Perez, Michel Gangnet, Andrew Blake (2003), [https://www.cs.jhu.edu/~misha/Fall07/Papers/Perez03.pdf Poisson Image Editing].
<!--* Karen Simonyan, Andrew Zisserman (2014), [https://arxiv.org/pdf/1409.1556.pdf Very Deep Convolutional Networks for Large-Scale Image Recognition]-->
* Leon A. Gatys, Alexander S. Ecker, Matthias Bethge (2016), [https://rn-unison.github.io/articulos/style_transfer.pdf Image Style Transfer Using Convolutional Neural Networks]
<!--* Eric Risser, Pierre Wilmot, Connelly Barnes (2017), [https://arxiv.org/pdf/1701.08893.pdf Stable and Controllable Neural Texture Synthesis and Style Transfer Using Histogram Losses]-->
<!--* Aravindh Mahendran, Andrea Vedaldi (2015), [https://arxiv.org/pdf/1412.0035.pdf Understanding Deep Image Representations by Inverting Them]-->
<!--* Justin Johnson, Alexandre Alahi, Li Fei-Fei (2016), [https://arxiv.org/pdf/1603.08155.pdf Perceptual Losses for Real-Time Style Transfer and Super-Resolution]-->
<!--* Jing Liao, Yuan Yao, Lu Yuan, Gang Hua, Sing Bing Kang (2017), [https://arxiv.org/pdf/1705.01088.pdf Visual Attribute Transfer through Deep Image Analogy]-->
* Fujun Luan, Sylvain Paris, Eli Shechtman, Kavita Bala (2018), [https://arxiv.org/pdf/1804.03189.pdf Deep Painterly Harmonization]
* Lingzhi Zhang, Tarmily Wen, Jianbo Shi (2020), [https://openaccess.thecvf.com/content_WACV_2020/papers/Zhang_Deep_Image_Blending_WACV_2020_paper.pdf Deep Image Blending]
==Примечания==
1632
правки

Навигация