Как сделать стилизованное фото
Создание стилизованной фотографии в программе Photoshop
Этим уроком мы начнем новую интересную тему — создание стилизованной фотографии в программе Photoshop. И на данной странице будут со временем появляться ссылки на новые уроки по заданной теме.
Стилизация — это намеренное приведение оригинала фото к какому-то иному виду, придание ему новых характеристик и нового «видения». То есть мы берем обычную фотографию и задаем ей новый стиль, отсюда и название процесса обработки фотографии.
Для стилизации фотографий используется множество разнообразных эффектов, созданных как при помощи встроенных стандартных фильтров и инструментов программы Photoshop, так и при помощи специальных фильтров, действий (экшенов) и отдельных программ.
В результате стилизации можно получить из обычной фотографии картину, рисунок (черно-белый и цветной), гравюру, «мультяшное» фото, картинку в стиле поп-арт и фэнтези…
Практически невозможно показать все эффекты, применяемые для изменения стиля фотографии. Потому что при стилизации можно использовать как один выбранный эффект (которых немало), так и группу разнообразных эффектов. А это уже сотни, а то и тысячи разнообразных комбинаций!
Но все же о некоторых возможностях стилизации фотографий я вам расскажу и покажу на примерах. А дальше, зная основы, вы сможете комбинировать по вашему вкусу и разумению эти возможности и получать нужные вам результаты.
В каждом уроке мы будем рассматривать по 1-2 возможных варианта стилизации фотографии.
Стилизация фотографии при помощи RGB- каналов
Начнем наш урок с получения стилизованного фото самым простым, на мой взгляд, способом: при помощи окна «Каналы».
Мы будем работать в данном уроке с RGB- каналами, которые создаются в программе Photoshop автоматически при загрузке изображения. Увидеть их можно, выбрав в основном меню программы Окно вкладку Каналы.
Как видим, каждое изображение представлено в виде трех каналов – красного, зеленого и синего. По-английски – Red, Green, Blue. Из первых букв и получается название каналов – RGB.
Изменяя каналы, отключая, добавляя и инвертируя их, мы можем получить очень интересные эффекты.
Шаг 1.
А) Открываем в программе фотографию цветка.
Б) Создаем дубликат слоя (Ctrl+J), переходим на него. Слой Фон закрываем.
В) Открываем окно Каналы.
На скриншоте показаны одновременно виды всех трех описанных выше действий.
Шаг 2.
Выбираем любой из каналов (для примера выбран синий канал). Остальные каналы отключаем. Вот так выглядит теперь наша фотография.
Шаг 3.
Задаем инверсию канала. Это можно сделать двумя способами. Через меню Изображение- Коррекция- Инверсия либо при помощи быстрых клавиш Ctrl+I.
Шаг 4.
Включаем все остальные каналы. Получаем вот такой эффект стилизации.
Аналогично можно изменять остальные два каналы или выбирать сочетание каналов. В результате получаем следующие варианты нашей изначальной фотографии.
Если вам подходит такие эффекты для выбранной вами фотографии, то можно на этом остановиться, перейти на закладку Слои и, выбрав любую выбранную картинку, сохранить ее как новое фото.
А можно дополнить выполненные преобразования, например, эффектами наложения.
Для этого делаем следующее:
• Оставляем видимыми слой Фон (оригинал фотографии) и слой с измененным каналом (в нашем случае Фон-копия или фон-копия 1… и тому подобное).
• Переходим на слой с эффектом и применяем к нему разные эффекты наложения. Для этого дважды кликаем по нему правой кнопкой мышки и экспериментируем с режимами наложения. Выбираем тот вариант, который вам больше всего подходит для вашей фотографии.
Вот какие варианты получились у меня при «игре» с режимами наложения.
(* при клике по фотографиям их можно увидеть в большем размере)
Следующий урок: Стилизация фотографии с использованием меню Коррекция и эффектов наложения.
Стилизация в фотографии
Это очень интересное направление, в котором одновременно проявляются практически все основные навыки фотохудожника: построение концепции съёмки, детальная проработка образа, профессиональная фотосъёмка и качественная постобработка.
За основу для этой статьи я взяла серию кадров с Одри Хепбёрн из кинофильма «Завтрак у Тиффани». У меня было несколько съёмок в таком стиле, но даже сейчас этот образ для меня до конца не раскрыт, и ещё остались идеи для новых снимков.
Мои модели с радостью принимают предложение войти в образ легендарной актрисы. Классический жанр, стиль Одри, узнаваемый всеми кадр, высокое качество снимка — всё это прекрасно сочетается в фотографии, которая может украсить любой интерьер:
Что такое стилизация в фотографии? Для меня это возможность повторить нечто узнаваемое, стильное, шедевральное и добавить своё видение.
Когда я работала над съёмками серии «Завтрак у Тиффани», меня не покидало ощущение, будто я каким-то чудесным образом оказалась по ту сторону экрана и у меня появился счастливый шанс поснимать сюжеты самой.
Узнаваемость с первого взгляда — один из основных критериев того, что проект состоялся. В этом случае у меня была идея повторить самые известные кадры фильма. Работа по их выбору стала началом подготовки к фотосессии.
Кстати, ещё один важный момент — выбор модели. Конечно же, не было задачи найти девушку, похожую на Одри. Но какое-то сходство всё-таки желательно.
КОНЦЕПЦИЯ
Я решила снимать только в студии. Интерьеры, городские локации, витрины — всё было реализовано при помощи Photoshop, прорисовано и сколлажировано на этапе постобработки. Поэтому для стилизации я выбирала те примеры, которые смогу воспроизвести наиболее точно. Также я смотрела на детали, на второстепенных персонажей, которые должны были присутствовать уже в студии. В итоге у меня получилось 10–15 кадров.
СОЗДАНИЕ ОБРАЗА
Я очень много работаю с моделями в рамках художественных и стилизованных фотосессий, и у меня есть большой список фирм и брендов, предоставляющих в аренду платья и аксессуары. Кстати, этот образ в плане подбора одежды не самый сложный. Что-то мы покупали, что-то брали в аренду. Сложнее всего, кстати, было найти похожую шляпку.
Наверное, самый узнаваемый кадр — это «обложка» фильма. Здесь мы видим модель, сидящую за столиком, и задний план, на котором внимание зрителя не акцентируется. Однако по концепции снимка можно понять, что это интерьер ресторана. Весь реквизит, начиная от столовых принадлежностей и заканчивая круассанами, салфетками, розой, был собран до съёмки и привезён в студию.
Повторить этот кадр не так сложно. Главное, как я уже говорила, сделать его узнаваемым. Тут уже большую роль играет схожесть реквизита, аксессуаров и, конечно же, самой модели. Она необязательно должна быть копией нашей героини, но важно вжиться в роль, прочувствовать настроение, максимально повторить позу. Не менее важны правильный макияж, причёска, которые готовят стилисты на съёмочной площадке.
Это классическая чёрно-белая фотография. Исходный материал был снят в студии, на белой циклораме, однако, по сути, это коллаж с серьёзной прорисовкой и ретушью.
При работе над этим снимком я позволила себе пофантазировать, добавить немного сказочности при помощи коллажирования, детальной прорисовки на графическом планшете, ретуши и цветокоррекции. На первом снимке бекстейдж съёмки, где можно рассмотреть реквизит.
Конечно же, у каждого из нас разные цели и задачи. Я хотела не только максимально повторить кадр, над которым я работаю, но и внести в съёмку что-то своё, поэтому я не стремилась к стопроцентной точности. Важна узнаваемость с первого взгляда и читаемость идеи, а нарушать границы, дополнять образы, я могу только на уровне интуиции.
СЪЁМКА В СТУДИИ
Теперь о технических особенностях. Тут две составляющих. Первая — профессиональная фотосъёмка, вторая — художественная обработка. Под профессиональной работой я подразумеваю старательные, детально продуманные действия. Для хорошего результата и начинающему фотографу, и профи нужно потратить массу усилий.
На этапе съёмки моим верным помощником является камера Nikon D800. Я более 10 лет работаю с Nikon и вряд ли когда-нибудь предпочту другой фотобренд. Nikon D800 — это оптимальное качество плюс большой формат кадра. Так как я часто печатаю свои работы в большом формате для выставок, публикаций в журналах, делаю своим клиентам фотокниги, Nikon D800 для меня незаменим.
В студии я обычно работаю с объективами Nikon 24-70mm f/2.8G ED AF-S Nikkor и Nikon 70-200mm f/2.8G ED AF-S VR II Zoom-Nikkor, используя студийный импульсный свет. Эта линейка объективов даёт великолепную резкость, что очень важно при съёмке материала для дальнейшей работы с большими форматами. А матрица и максимальное разрешение у Nikon D800 позволяет печатать снимки в превосходном качестве.
ПОСТОБРАБОТКА
Съёмка на белой циклораме позволяет в дальнейшем не полностью отделять модель от фона, но и накладывать слои в Photoshop. Важно правильно выставить свет, чтобы на этапе постобработки было легче заменить фон, дорисовать или проработать детали. Нужно добиться отсутствия теней на заднем плане, иначе при прорисовке фона это «выдаст» монтаж, и работа не будет смотреться реалистично.
Я всегда снимаю в RAW, что даёт мне больше возможности корректировки уже готовых снимков. На этапе конвертации фотографий я много работаю кистями по отдельным участкам снимка, в этом случае, конечно же, необходим именно формат RAW.
Как я уже писала, все фоны были добавлены на этапе постобработки. Если приложить максимум усилий к тому, чтобы на съёмочной площадке всё было в соответствии с концепцией, фотосессия получится реалистичной и максимально приближенной к оригиналу.
Как сделать стилизованное фото
Войти
Авторизуясь в LiveJournal с помощью стороннего сервиса вы принимаете условия Пользовательского соглашения LiveJournal
Сегодня мы расскажем о художественных фильтрах в фотошопе. С помощью этих фильтров возможна стилизация под живопись (масло, пастель, карандаш), имитация поверхностей и структур. При помощью этих фильтров вы сможете создать из своих фотографий произведения искусства.
Фильтр – инструмент для изменения изображения. Это может быть размытие, усиление резкости, стилизация, усиление рельефа, изменение цветовой гаммы и многое другое.
Все фильтры вы можете найти во вкладке “Фильтр”, которая находится сверху. При нажатии на данную вкладку перед нами появляется меню.
Имитирует рисунок акварельными красками. Но не очень хорошо. Применив пару трюков можно добиться замечательных результатов. Сделайте две копии фотографии с помощью Ctrl + J, затем выберите фильтр “Акварель”.
Marine watercolor / © luceluceluce
Меняем режим наложения первого слоя на Screen (Осветление или Экран), а второй на Multiply (Умножение). В оба слоя добавьте маски. Держите нажатой клавишу Alt, чтобы создать черную маску. С помощью кисти белого цвета и акварельной кисти, варианты которой вы найдете в интернете, рисуйте по маскам. Таким образом, вы будете имитировать типичные цветовые переходы. Фотошоп провел предварительную работу и подготовил эскиз. С помощью кистей и текстуры вы можете получить нужный эффект.
Фильтр “Цветной карандаш” использует текущий цвет фона, как цвет бумаги, на которой будет создаваться рисунок. То есть еще до применения фильтра нужно принять небольшое решение. Цвета снимка превратятся в цвета карандашей. Между карандашными штрихами будет виден цвет бумаги.
Так как мелкие детали редко хорошо прорабатываются, лучше работать с большими фотографиями. С помощью одноразового применения фильтра сложно получить хороший результат. Поэтому я рекомендую сделать несколько копий изображения, применить на разных копиях разные настройки и с помощью масок слоев прорисовать те участки, которые лучше всего подходят к данной части фотографии. Текстура бумаги способствует тому, что изображение выглядит более реалистично. В данном случае текстура находится в слое над всеми остальными слоями и я использовал режим наложения слоя Multiply (Умножение) с небольшой прозрачностью.
sexy woman / © stryjek
Фильтр смягчает изображение путем добавления диагональных мазков, причем светлые области становятся ярче и теряют детализацию. В этом фильтре используются цвета снимка для имитации растушевки. При этом можно задавать длину штриха, что естественно влияет на детали и резкость/размытие. Можно менять яркость разных зон снимка и интенсивность яркости.
Так вы добьетесь, что штрихи будут не слишком равномерными. Конечно здесь важно правильно выбрать мотив. Фантастические коллажи здесь подходят больше, чем, например, портрет.
The Temple / © Zuboff
Green forest with fog / © andreiuc88
То есть с помощью этого фильтра можно добиться эффекта иллюстрации. Для определения содержания изображения достаточно даже простого контура. Здесь тоже очень важно выбрать правильное изображение. Здесь тоже имеет смысл использовать разные режимы смешивания слоев, например, Overlay (Наложение).
Green forest with fog / © andreiuc88
Этот фильтр имитирует нанесение краски на еще свежую штукатурку, по крайней мере в теории. Выбор мотива очень важен и здесь.
Saint Mary Magdalene / © zatletic
В результате применения этого фильтра получается рисунок, очень напоминающий технику сухой кисти (рисование большим количеством краски при малом количестве воды).
Mediterrane Impression / © pk200258
Использование этого фильтра дает эффект рисунка пастелью. В верхней части диалогового окна задается длина штриха и степень деталировки. В нижней части определяются свойства материала, на который нанесен рисунок, размер текстуры, рельефность и направление света.
Настройки зависят от мотива. После настроек фильтра стоит на некоторых частях снимка с помощью маски удалить (или частично удалить) действие фильтра.
На контрастных снимках дает достаточно интересный эффект. Шкала Grain (Зерно) управляет размером зерна, Highlight Area (Освещение) — процентом осветленных участков, a Intensity (Интенсивность) — экспозицией (освещенностью).
Fine art image / © konradbak
Fashion Couple Dramatic / © Gabi Moisa
Grand Cru Rotwein / © Wilm Ihlenfeld
dutch mills 3 / © dzain
Превращает изображение в монохромный негатив и добавляет светлую обводку, «свечение», по контуру объектов.
Придает снимку вид картины, выполненной маслом.
rotes Italien / © Grischa Georgiew
Lüneburger Heide / © Thorsten Schier
Superhero businessman / © Nomad_Soul
О других фильтрах и их применении мы расскажем в следующей статье.
Стилизация изображений с помощью нейронных сетей: никакой мистики, просто матан
Приветствую тебя, Хабр! Наверняка вы заметили, что тема стилизации фотографий под различные художественные стили активно обсуждается в этих ваших интернетах. Читая все эти популярные статьи, вы можете подумать, что под капотом этих приложений творится магия, и нейронная сеть действительно фантазирует и перерисовывает изображение с нуля. Так уж получилось, что наша команда столкнулась с подобной задачей: в рамках внутрикорпоративного хакатона мы сделали стилизацию видео, т.к. приложение для фоточек уже было. В этом посте мы с вами разберемся, как это сеть «перерисовывает» изображения, и разберем статьи, благодаря которым это стало возможно. Рекомендую ознакомиться с прошлым постом перед прочтением этого материала и вообще с основами сверточных нейронных сетей. Вас ждет немного формул, немного кода (примеры я буду приводить на Theano и Lasagne), а также много картинок. Этот пост построен в хронологическом порядке появления статей и, соответственно, самих идей. Иногда я буду его разбавлять нашим недавним опытом. Вот вам мальчик из ада для привлечения внимания.
Visualizing and Understanding Convolutional Networks (28 Nov 2013)
Первым делом стоит упомянуть статью, в которой авторы смогли показать, что нейронная сеть — это не черный ящик, а вполне даже интерпретируемая вещь (кстати, сегодня это можно сказать не только о сверточных сетях для компьютерного зрения). Авторы решили научиться интерпретировать активации нейронов скрытых слоев, для этого они использовали деконволюционную нейронную сеть (deconvnet), предложенную несколькими годами ранее (кстати, теми же Зейлером и Фергусом, которые являются авторами и этой публикации). Деконволюционная сеть — это на самом деле такая же сеть со свертками и пулингами, но примененными в обратном порядке. В оригинальной работе по deconvnet сеть использовалась в режиме обучения без учителя для генерации изображений. В этот раз авторы применили ее просто для обратного прохода от признаков, полученных после прямого прохода по сети, до исходного изображения. В итоге получается изображение, которое можно интерпретировать как сигнал, вызвавший данную активацию на нейронах. Естественно, возникает вопрос: а как сделать обратный проход через свертку и нелинейность? А тем более через max-пулинг, это уж точно не инвертируемая операция. Рассмотрим все три компонента.
Обратный ReLu
В сверточных сетях в качестве функции активации часто используется ReLu(x) = max(0, x), который делает все активации на слое не отрицательными. Соответственно, при обратном проходе через нелинейность необходимо получить также не отрицательные результаты. Для этого авторы предлагают использовать этот же ReLu. С точки зрения архитектуры Theano необходимо переопределить функцию градиента операции (бесконечно ценный ноутбук находится в рецептах лазаньи, оттуда вы почерпнете детали того, что за класс ModifiedBackprop).
Обратная свертка
Тут немного сложнее, но все логично: достаточно применить транспонированную версию того же ядра свертки, но к выходам из обратного ReLu вместо предыдущего слоя, используемого при прямом проходе. Но боюсь, что на словах это не так очевидно, посмотрим на визуализацию этой процедуры (тут вы найдете еще больше визуализаций сверток).
Свертка при stride=1 | Обратная версия |
---|---|
Свертка при stride=2 | Обратная версия |
---|---|
Обратный пулинг
Вот эта операция (в отличие от предыдущих) вообще говоря не инвертируема. Но нам все же хотелось бы при обратном проходе каким-то способом пройти через максимум. Для этого авторы предлагают использовать карту того, где был максимум при прямом проходе (max location switches). При обратном проходе входной сигнал в анпулинг преобразуется так, чтобы приближенно сохранить структуру исходного сигнала, тут действительно проще увидеть, чем описать.
Результат
Алгоритм визуализации крайне прост:
Каждый серый квадрат на изображении ниже соответствует визуализации фильтра (который применяется для свертки) или весов одного нейрона, а каждая цветная картинка — это та часть оригинального изображения, которая активирует соответствующий нейрон. Для наглядности нейроны внутри одного слоя сгруппированы в тематические группы. В общем внезапно оказалось, что нейронная сеть выучивает ровно то, о чем писали Хьюбел и Вейзел в работе про структуру зрительной системы, за что и были удостоены Нобелевской премии в 1981 году. Благодаря этой статье мы получили наглядное представление того, что выучивает сверточная нейронная сеть на каждом слое. Именно эти знания позволят позже манипулировать содержимым генерируемого изображения, но до этого еще далеко, следующие несколько лет ушли на совершенствование способов «трепанации» нейронных сетей. Помимо этого, авторы статьи предложили способ анализа, как лучше выстраивать архитектуру сверточной нейронной сети для достижения лучших результатов (правда, ImageNet 2013 они так и не выиграли, но попали в топ; UPD: таки оказывается выиграли, Clarifai это они и есть).
Вот пример визуализации активаций, используя deconvnet, сегодня этот результат смотрится уже так себе, но тогда это был прорыв.
Deep Inside Convolutional Networks: Visualising Image Classification Models and Saliency Maps (19 Apr 2014)
Данная статья посвящена исследованию методов визуализации знаний, заключенных в сверточной нейронной сети. Авторы предлагают два способа визуализации, основанных на градиентном спуске.
Class Model Visualisation
Итак, представьте, что у нас есть обученная нейронная сеть для решения задачи классификации на какое-то количество классов. Обозначим за значение активации выходного нейрона, который соответствует классу c. Тогда следующая задача оптимизации дает нам ровно то изображение, которое максимизирует выбранный класс:
Такую задачу легко решить, используя Theano. Обычно мы просим фреймворк взять производную по параметрам модели, но в этот раз мы считаем, что параметры фиксированы, а производная берется по входному изображению. Следующая функция выбирает максимальное значение выходного слоя и возвращает функцию, которая вычисляет производную по входному изображению.
Вы наверняка видели в интернетах странные изображения с мордами собак — DeepDream. В оригинальной статье авторы используют следующий процесс для генерации изображений, которые максимизируют выбранный класс:
Получаются такие вот изображения:
А если инициализировать первое изображение реальной фотографией и запустить этот же процесс? Но на каждой итерации будем выбирать случайный класс, обнулять остальные и вычислять значение производной, то получится вот такой вот deep dream.
Почему же столько морд собак и глаз? Все просто: в имаджнете из 1000 классов почти 200 собак, у них есть глаза. А также много классов, где просто есть люди.
Class Saliency Extraction
Если этот процесс инициализировать реальной фотографией, остановить после первой итерации и отрисовать значение производной, то мы получим такое изображение, прибавив которое к исходному, мы увеличим значение активации выбранного класса.
Опять результат «так себе». Важно отметить, что это новый способ визуализации активаций (ничто же не мешает нам фиксировать значения активаций не на последнем слое, а вообще на любом слое сети и брать производную по входному изображению). Следующая статья объединит оба предыдущих подхода и даст нам инструмент к тому, как настраивать трансфер стиля, который будет описан позже.
Striving for Simplicity: The All Convolutional Net (13 Apr 2015)
Данная статья вообще говоря не о визуализации, а о том, что замена пулинга сверткой с большим страйдом не приводит к потере качества. Но как побочный продукт своих изысканий авторы предложили новый способ визуализации фич, который они применили для более точного анализа того, что выучивает модель. Их идея в следующем: если мы просто берем производную, то при деконволюции обратно не проходят те фичи, которые были на входном изображении меньше нуля (применение ReLu для входного изображения). И это приводит к тому, что на пропагируемом обратно изображении появляются отрицательные значения. С другой стороны, если использовать deconvnet, то от производной ReLu берется еще один ReLu — это позволяет не пропускать обратно отрицательные значения, но как вы видели результат получается «так себе». Но что если объединить эти два метода?
Тогда получится вполне чистое и интерпретируемое изображение.
Go deeper
Теперь давайте задумаемся, а что нам это дает? Позволю себе напомнить, что каждый сверточный слой — это функция, которая получает на вход трехмерный тензор и на выход тоже выдает трехмерный тензор, быть может, другой размерности d x w x h; depth — это количество нейронов в слое, каждый из них генерит плашку (feature map) размером wigth x height.
Давайте попробуем провести следующий эксперимент на сети VGG-19:
Да вы почти ничего не видите, т.к. рецептивная область очень маленькая, это вторая свертка 3х3, соответственно общая область 5х5. Но увеличив, мы увидим, что фича — это просто детектор градиента.
А теперь представим, что вместо максимума по плашке мы будем брать производную значения суммы всех элементов плашки по входному изображению. Тогда очевидно рецептивная область группы нейронов будет покрывать все входное изображение. Для ранних слоев мы увидим яркие карты, из которых мы делаем вывод, что это детекторы цветов, затем градиентов, затем границ и так далее в сторону усложнения паттернов. Чем глубже слой, тем более тусклое изображение получается. Это объясняется тем, что у более глубоких слоев, более сложный паттерн, который они детектируют, а сложный паттерн появляется реже, чем простой, потому и карта активаций тускнеет. Первый способ подходит для понимания слоев со сложными паттернами, а второй — как раз для простых.
Более полную базу активаций вы можете скачать для нескольких изображений тут и тут.
A Neural Algorithm of Artistic Style (2 Sep 2015)
Итак, прошло пару лет с момента первой удачной трепанации нейронной сети. У нас (в смысле — у человечества) есть на руках мощный инструмент, который позволяет понять, что выучивает нейронная сеть, а также убрать то, что нам не очень хотелось бы что бы она выучивала. Авторы данной статьи разрабатывают метод, который позволяет сделать так, чтобы одно изображение генерировало похожую карту активаций на какое то целевое изображение, а возможно даже и не на одно — это и лежит в основе стилизации. На вход мы подаем белый шум, и похожим итеративным процессом как в deep dream мы приводим это изображение к такому, у которого карты признаков похожи на целевое изображение.
Content Loss
Как уже было упомянуто, каждый слой нейронной сети производит трехмерный тензор некоторой размерности.
Обозначим выход i-ого слоя от входной как . Тогда если мы будем минимизировать взвешенную сумму невязок между входным изображением
и некоторым изображением, к которому мы стремимся c, то получится ровно то, что нужно. Наверное.
Для экспериментов с этой статьей можно использовать этот волшебный ноутбук, там происходят вычисления (как на ГПУ, так и на ЦПУ). ГПУ используется для вычисления фич нейросети и значения функции стоимости. Theano выдает функцию, которая умеет вычислять градиент целевой функции eval_grad по входному изображению x. Затем это все подается в lbfgs и запускается итеративный процесс.
Если же мы запустим оптимизацию такой функции, то мы быстро получим изображение, похожее на целевое. Теперь мы умеем из белого шума воссоздавать изображения, похожие на некоторое content-изображение.
Легко заметить две особенности полученного изображения:
Добавление ранних слоев сразу исправляет ситуацию с цветами.
Надеюсь, к этому моменту вы ощутили, что вы можете управлять тем, что будет перерисовано на изображение из белого шума.
Style Loss
И вот мы добрались до самого интересного: а как же нам передать стиль? Что такое стиль? Очевидно, что стиль — это не то что мы оптимизировали в Content Loss’е, ведь там содержится много информации о пространственных положениях фичей. Так что первое, что нужно сделать, — это каким-либо способом убрать эту информацию из представлений, полученных на каждом слое.
Автор предлагает следующий способ. Возьмем тензор на выходе из некоторого слоя, развернем по пространственным координатам и посчитаем матрицу ковариации между плашками. Обозначим это преобразование как G. Что мы на самом деле сделали? Можно сказать, что мы посчитали, как часто признаки внутри плашки встречаются попарно, или, другими словами, мы аппроксимировали распределение признаков в плашках многомерным нормальным распределением.
Тогда Style Loss вводится следующим образом, где s — это некоторое изображение со стилем:
Попробуем для Винсента? Получим в принципе что-то ожидаемое — шум в стиле Ван Гога, информация о пространственном расположении фичей полностью потеряна.
А что если вместо стилевого изображения поставить фотографию? Получится уже знакомые фичи, знакомые цвета, но пространственное положение полностью потеряно.
Наверняка вы задались вопросом о том, а почему мы вычисляем именно матрицу ковариации, а не что то другое? Ведь существует много способов того, как агрегировать признаки так, чтобы потерялись пространственные координаты. Это действительно вопрос открытый, и если взять что-то очень простое, то результат изменится не драматически. Давайте проверим это, будем вычислять не матрицу ковариации, а просто среднее значение каждой плашки.
Комбинированный лосс
Естественно, возникает желание смешать эти две функции стоимости. Тогда мы из белого шума будем генерировать такое изображение, что в нем будут сохранены признаки из content-изображения (у которых есть привязка к пространственным координатам), а также будут присутствовать «стилевые» признаки, не привязанные к пространственным координатам, т.е. мы будем надеяться, что детали изображения контента останутся нетронутыми со своих мест, но будут перерисованы с нужным стилем.
На самом деле присутствует еще и регуляризатор, но мы его опустим для простоты. Остается ответить на следующий вопрос: а какие слои (веса) использовать при оптимизации? И боюсь, что ответа на этот вопрос у меня нет, да и у авторов статьи тоже. У них есть предложение использовать следующие, но это совсем не значит, что другая комбинация будет работать хуже, слишком большое пространство поиска. Единственное правило, которое следует из понимания модели: нет смысла брать соседние слои, т.к. у них признаки будут отличаться друг от друга не сильно, потому в стиль добавляется по слою из каждой группы conv*_1.
Итоговую модель можно представить в следующем виде.
Попытка контролировать процесс
Давайте вспомним предыдущие части, уже как два года до текущей статьи, другие ученые исследовали, что же действительно выучивает нейронная сеть. Вооружившись всеми этими статьями, можно нагенерить визуализации фич различных стилей, различных изображений, различных разрешений и размеров, и попытаться понять, какие слои с каким весом брать. Но даже перевзвешивание слоев не дает полного контроля над происходящим. Проблема здесь более концептуальная: мы ведь оптимизируем не ту функцию! Как так, спросите вы? Ответ простой: эта функция минимизирует невязку… ну вы поняли. Но что мы действительно хотим — это то, чтобы изображение нам понравилось. Выпуклая комбинация content и style loss функций не является мерилом того, что наш разум считает красивым. Было замечено, что если продолжать стилизацию слишком долго, то функция стоимости естественно падает ниже и ниже, а вот эстетическая красота результата резко падает.
Ну да ладно, есть еще одна проблема. Допустим, мы нашли слой, который извлекает нужные нам признаки. Допустим, какие-то текстурки треугольные. Но этот слой еще содержит множество других признаков, например кружочков, которые мы очень не хотим видеть на результирующем изображении. Вообще говоря, если бы можно было нанять миллион китайцев, то можно было бы визуализировать все фичи стилевого изображения, и полным перебором просто отметить те, которые нам нужны, и только их включить в функцию стоимости. Но по понятным причинам это не так просто. Но что если мы просто удалим все кружочки, которые мы не хотим видеть на результате, из стилевого изображения? Тогда просто не сработают активации соответствующих нейронов, которые реагируют на кружочки. И, естественно, тогда в результирующей картинке этого не появится. То же самое и с цветами. Представьте яркое изображение с большим количеством цветов. Распределение цветов будет очень размазанным по всему пространству, таким же будет и распределение у результирующего изображения, но вот в процессе оптимизации наверняка потеряются те пики, которые были на оригинале. Оказалось, что простое уменьшение разрядности цветовой палитры решает эту проблему. Плотность распределения большинства цветов будет около нуля, и будут большие пики на нескольких участках. Таким образом, манипулируя оригиналом в фотошопе, мы манипулируем признаками, которые извлекаются из изображения. Человеку проще выразить свои желания визуально, нежели пытаться сформулировать их на языке математики. Пока. В итоге, дизайнеры и менеджеры, вооружившись фотошопом и скриптами для визуализации признаков, добились раза в три быстрее результата лучше, чем тот, что сделали математики с программистами.
Оригинал | Деградированная версия |
---|---|
Texture Networks: Feed-forward Synthesis of Textures and Stylized Images (10 Mar 2016)
Вроде бы на этом можно было остановиться, если не один нюанс. Вышеописанный алгоритм стилизации работает очень долго. Если взять реализацию, где lbfgs запускается на ЦПУ, то процесс занимает минут пять. Если переписать так, чтобы и оптимизация шла в ГПУ, то процесс будет занимать 10-15 секунд. Это никуда не годится. Возможно авторы этой и следующей статьи думали примерно так же. Обе публикации вышли независимо с разницей в 17 дней, спустя почти год после предыдущей статьи. Авторы текущей статьи, как и авторы предыдущей, занимались генерацией текстур (если вы просто обнулите Style Loss примерно это и получится). Они предложили оптимизировать не изображение, полученное из белого шума, а некоторую нейронную сеть, которая генерирует стилизованное изображение.
Теперь если процесс стилизации не включает в себя никакой оптимизации, требуется сделать только прямой проход. А оптимизация требуется только один раз для тренировки сети-генератора. В этой статье используется иерархический генератор, где каждый следующий z размером больше предыдущего и семплируется из шума в случае генерации текстуры, и из некоторой базы изображений для тренировки стилизатора. Критично использовать что-то отличное от тренировочной части имаджнета, т.к. фичи внутри Loss-сети вычисляются сетью, обученной как раз на тренировочной части.
Perceptual Losses for Real-Time Style Transfer and Super-Resolution (27 Mar 2016)
Как видно из названия, авторы, которые опоздали всего на 17 дней с идеей генерирующей сети, занимались увеличением разрешения изображений. Они судя по всему были вдохновлены успехами residual learning на последнем имаджнете.
Соответственно residual block и conv block.
Таким образом, теперь у нас на руках помимо контроля над стилизацией есть еще и быстрый генератор (благодаря этим двум статьям время генерации одного изображения измеряется десятками мс).
Окончание
Информацию из рассмотренных статей и код авторов мы использовали как начальную точку для создания еще одного приложения для стилизации первого приложения для стилизации видео:
Генерит что-то такое:
Ну и остальные полезные ссылки: