Pavel Plyusnin

Data Scientist

Стилизация изображений при помощи StyleTransferNet

Каждый из нас хочет создавать произведения искусства, но не каждый из нас Ван Гог, Пикассо или Малевич. Зато каждый может фотографировать. Благодаря нейронным сетям, этого уже достаточно, чтобы делать интересные работы

Перенос стиля одного изображения на другое — известная проблема, которая как раз находит свое решение в наши дни. Уже есть рабочие методы, которые могут стилизовать фотографии не только под картины, но и по некоторому другому, фотореалистичному принципу. Например, описанная нейронная сеть позволяет получать из дневных снимков ночные

Здесь же я остановлюсь на собственной реализации метода, позволяющего переносить стиль.

Идея предложенного метода заключается в использовании функции потерь, которая учитывает несоответствие выходного изображения с исходным, а также с изображением стиля, на различных слоях сети посредством матриц Грамма

Подробнее!

Если подробней, то обозначим за x_c — целевое изображение, x_s — изображение стиля, а x — желаемое, неизвестное, выходное изображение

Рассмотрим сверточный слой l: размерность его карты признаков равна M_l = H_l \times W_l, а всего N_l фильтров.

Тогда \Phi^l_{ij}(x) \in \mathbb{R}^{M_l} — размерность выходного вектора i-го фильтра на j позиции слоя l

Определим матрицу Грамма \in \mathbb{R}^{N_l \times N_l} как

G_{ij}(x) = \frac{1}{M_l}\sum_{k=1}^{M_l}\Phi_{ik}(x)\Phi_{jk}(x) = \frac{1}{M_l}\Phi^l(x)(\Phi^l(x))^T

В ней содержатся корреляции между картами признаков

Тогда вводя функции потерь как

\mathcal{L}_{\text { content }}\left(x, x_{c}\right)=\frac{1}{N_{l_{c}} M_{l_{c}}}\left\|\Phi^{l_{c}}(x)-\Phi^{l_{c}}\left(x_{c}\right)\right\|_{F}^{2}

(признаки высокого уровня должны быть похожи)

\mathcal{L}_{s t y l e}^{\prime}=\frac{1}{N_{l}^{2}}\left\|G^{\prime}(x)-G^{\prime}\left(x_{s}\right)\right\|_{F}^{2}

(корреляции признаков должны по возможности совпадать)

Находим результирующий выход, минимизирующий суммарный лосс.

x=\underset{x}{\arg \min }\left\{\mathcal{L}_{\text { content }}\left(x, x_{c}\right)+\alpha \mathcal{L}_{\text {style}}\left(x, x_{s}\right)\right\}

В моей реализации также были использованы и другие фишки, например Instance normalization

[свернуть]

Минусом этой реализации является необходимость обучать сеть для каждого нового фильтра. Зато имея уже обученную сеть, стилизация новых изображений происходит очень быстро

Пример работы фильтра

Здесь приведены примеры работы сетей для двух фильтров

Еще один пример работы

У данного проекта есть и коммерческая ценность. В качестве эксперимента, клиентам было предложено применить все 3 стандартных фильтра к своему изображению за 30 рублей за фото или дополнительно получить свой фильтр на основе собственного стилевого изображения по цене 150 рублей за фильтр.

Заявки принимались всего 2 часа и за это время было получено более 15 изображений для обработки стандартными фильтрами и 3 заявки на обучение оригинальных фильтров.

Учитывая отсутствие серьезной рекламы и продвижения, результат довольно хороший — основные сложности были с ручным приемом заказов, поэтому следующим шагом для построения полноценного коммерческого проекта стало бы написание пользовательского интерфейса для загрузки собственных изображений в сервис и автоматическое построение требуемых нейронных сетей на сервере.

Добавить комментарий

Your email address will not be published. Required fields are marked *.

*
*
You may use these <abbr title="HyperText Markup Language">HTML</abbr> tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>