A neural algorithm of artistic style

Posted on May 31, 2016 • lo

This notebook and code are available on Github.

This notebook illustrates a Tensorflow implementation of the paper “A Neural Algorithm of Artistic Style” which is used to transfer the art style of one picture to another picture’s contents.

If you like to run this notebook, you will need to install TensorFlow, Scipy and Numpy. You will need to download the VGG-19 model. Feel free to play with the constants a bit to get a feel how the bits and pieces play together to affect the final image generated.

Overview

We will build a model to paint a picture using a style we desire. The style of painting of one image will be transferred to the content image.

The idea is to use the filter responses from different layers of a convolutional network to build the style. Using filter responses from different layers (ranging from lower to higher) captures from low level details (strokes, points, corners) to high level details (patterns, objects, etc) which we will used to perturb the content image, which gives the final “painted” image:

Using Guernica’s style painting and Hong Kong’s Peak Tram to yield this:

We need to define come constants for the image. If you want to use another style or image, just modify the STYLE_IMAGE or CONTENT_IMAGE. For this notebook, I hardcoded the image width to be 800 x 600, but you can easily modify the code to accommodate different sizes.

Now we define some constants which is related to the algorithm. Given that the style image and the content image remains the same, these can be tweaked to achieve different outcomes. Comments are added before each constant.

Now we need to define the model that “paints” the image. Rather than training a completely new model from scratch, we will use a pre-trained model to achieve our purpose — called “transfer learning”.

We will use the VGG19 model. You can download the VGG19 model from here. The comments below describes the dimensions of the VGG19 model. We will replace the max pooling layers with average pooling layers as the paper suggests, and discard all fully connected layers.

Define the equation (1) from the paper to model the content loss. We are only concerned with the “conv4_2” layer of the model.

Define the equation (5) from the paper to model the style loss. The style loss is a multi-scale representation. It is a summation from conv1_1 (lower layer) to conv5_1 (higher layer). Intuitively, the style loss across multiple layers captures lower level features (hard strokes, points, etc) to higher level features (styles, patterns, even objects).

You can tune the weights in the STYLE_LAYERS to yield very different results. See the Bonus part at the bottom for more illustrations.

Define the rest of the auxiliary functions.

Create an TensorFlow session.

Now we load the content image “Hong Kong”. The model expects an image with MEAN_VALUES subtracted to function correctly. “load_image” already handles this. The showed image will look funny.

Now we load the style image using Guernica. Similarly, the color will look distorted but that’s what the model needs:

Please join the Simons Foundation and our generous member organizations in supporting arXiv during our giving campaign September 23-27. 100% of your contribution will fund improvements and new initiatives to benefit arXiv’s global scientific community.

[secure site, no need to create account]

Abstract: In fine art, especially painting, humans have mastered the skill to create unique visual experiences through composing a complex interplay between the content and style of an image. Thus far the algorithmic basis of this process is unknown and there exists no artificial system with similar capabilities. However, in other key areas of visual perception such as object and face recognition near-human performance was recently demonstrated by a class of biologically inspired vision models called Deep Neural Networks. Here we introduce an artificial system based on a Deep Neural Network that creates artistic images of high perceptual quality. The system uses neural representations to separate and recombine content and style of arbitrary images, providing a neural algorithm for the creation of artistic images. Moreover, in light of the striking similarities between performance-optimised artificial neural networks and biological vision, our work offers a path forward to an algorithmic understanding of how humans create and perceive artistic imagery.

Нейронные сети могут делать много разных вещей. Они могут понимать наши голоса, распознавать изображения и переводить речь, но знаете ли вы, что еще они умеют рисовать? Изображение сверху демонстрирует некоторые сгенерированные результаты применения нейронного рисования.

Сегодня я собираюсь познакомить вас с тем как это делается. Прежде всего, убедитесь, что у вас обновленная копия Ubuntu (14.04 — та, что использовал я). Вам необходимо иметь несколько гигов свободного пространства на жестком диске и в оперативной памяти, хотя бы не менее 6 GB (больше оперативки для больших выводимых разрешений). Для запуска Ubuntu как виртуальной машины, вы можете использовать Vagrant вместе с VirtualBox.

Убедитесь, что у вас установлен git. Чтобы скачать и установить git, просто откройте терминал и выполните:

Шаг 1: Установите torch7

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

Запустите эти команды в терминале (вам может понадобиться использовать для них sudo):

Теперь нам надо обновить наши переменные окружения, запустите:

Шаг 2: Установите loadcaffe

Выполните в терминале:

Либо, если у вас возникают проблемы, попробуйте так:

Шаг 3: Установите neural-style

Это torch-реализация спецификации Нейронный Алгоритм Художественного Стиля Леона А. Гатиса, Александра С. Эккера и Маттиаса Бетге. Спецификация представляет алгоритм для комбинирования контента одного изображения со стилем другого изображения, используя сверточные нейронные сети.

Сначала склонируйте neural-style с GitHub:

Далее, скачайте модели нейронной сети:

Шаг 4: Запускаем

Теперь убедитесь, что у вас есть хотя бы 6 GB оперативной памяти (если вы используете виртуальную машину, убедитесь, что выделили достаточное количество памяти для нее). Затем проверьте, работает ли нейронный стиль с помощью этой команды:

Заметьте, что вы выполняете это в режиме CPU, выполнение в режиме GPU выходит за рамки данной статьи.

Чтобы увидеть инструкции о том, как использовать нейронный стиль, запустите:

Теперь давайте выполним тестовую команду, чтобы убедиться, что нейронные стили работают. Для начала убедитесь, что вы находитесь в директории нейронных сетей, если вы следовали всем инструкциям выше, вы должны быть в

/neural-network, теперь запустите:

Заметьте, я ввел меньший размер изображения, чтобы обработка закончилась быстрее. Когда команда завершится, выходной файл, со стандартным именем out.png, будет расположен в той же директории.

Результат


golden_gate.jpg


starry_night.jpg


out.png


[an error occurred while processing the directive]
Карта сайта