Стилизация изображения с помощью нейросети, Python3 и PyTorch

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

В 2015 году исследователи создали алгоритм neural style transfer, который соединял содержимое одного изображения с художественным стилем другого. Этот новый алгоритм генерировал уникальные образы; также он предложил уникальный взгляд на то, как визуальная система может вывести новые художественные концепции.

Этот алгоритм работает на основе нейросети. Подробности его реализации выходят за рамки данного мануала; найти больше можно в этом блоге.

Этот мануал научит вас преобразовывать стиль изображений с помощью нейросети, Jupyter Notebook и командной строки Linux.

Примечание: Для примера выберите любое простое изображение и найдите картину Винсента ван Гога «Звездная ночь». Внесите соответствующие поправки в код, указав имена ваших файлов.

Требования

Примечание: Работа с моделями машинного обучения может потребовать много памяти. Для выполнения некоторых вычислений на машине должно быть не менее 8 ГБ памяти.

1: Установка зависимостей и клонирование репозитория PyTorch-Style-Transfer с GitHub

В этом мануале используется открытая реализация алгоритма neural style transfer под названием PyTorch-Style-Transfer. В этой конкретной реализации используется библиотека PyTorch.

Чтобы установить PyTorch и пакет torchvision, введите:

pip3 install http://download.pytorch.org/whl/cu75/torch-0.1.12.post1-cp35-cp35m-linux_x86_64.whl
pip3 install torchvision

Примечание: Для этого мануала нужен пакет torch-0.1.12_2.

Чтобы не засорять домашний каталог разными файлами, создайте новый каталог style_transfer и используйте его в качестве рабочего:

mkdir style_transfer
cd style_transfer

Затем клонируйте репозиторий PyTorch-Style-Transfer в рабочий каталог с помощью git clone.

Читайте также: Другие статьи о Git

git clone https://github.com/zhanghang1989/PyTorch-Style-Transfer.git

Автор этого репозитория разместил код, который мы будем использовать, в папке experiments  в репозитории PyTorch-Style-Transfer. Клонировав все файлы, перейдите в этот каталог:

cd PyTorch-Style-Transfer/experiments

Просмотрите содержимое каталога experiments:

ls
camera_demo.py  dataset  images  main.py  models  myutils  net  option.py  __pycache__

В данном мануале для работы необходим каталог images/, в котором находятся стоковые изображения и скрипт main.py, который выполняет стилизацию изображения.

Прежде чем перейти к следующему разделу, вам также необходимо загрузить предварительно подготовленную модель обучения, необходимую для обработки стилизации. Эти модели могут быть объемными и поэтому не подходят для хранения на GitHub, поэтому автор репозитория предоставляет небольшой скрипт для загрузки файла. Вы найдете скрипт в models/download_model.sh.

Сделайте скрипт исполняемым:

chmod +x ./models/download_model.sh

Выполните скрипт, чтобы загрузить модель:

./models/download_model.sh

Теперь можно приступать к преобразованию изображений.

2: Тестовая стилизация изображения

Чтобы проиллюстировать стилизацию изображения с помощью нейронной сети, начнем с примера, предоставленного автором репозитория PyTorch-Style-Transfer. Поскольку при этом нужно будет отображать и просматривать изображения, удобнее будет использовать Jupyter notebook. Запустите Jupyter в терминале:

jupyter notebook

Затем войдите в Jupyter, следуя инструкциям.

После этого создайте новый документ, выбрав New> Python 3 в верхнем правом раскрывающемся меню.

В новый документ можно добавить код.

В начало документа поместите код, который загрузит требуемые библиотеки:

import torch
import os
import subprocess
from IPython.display import Image
from IPython.display import display

Вместе с torch также нужно импортировать стандартные библиотеки os и subprocess, которые нужны для запуска скриптов Python непосредственно из Jupyter notebook. Также нужно включить библиотеку IPython.display, которая позволяет отображать изображения в Jupyter notebook.

Примечание: Введите Alt+Enter (или Shift + Enter на macOS), чтобы запустить код и перейти в новый блок кода внутри документа. Это нужно делать после каждого блока кода, чтобы увидеть результаты.

В примере, представленном в файле README репозитория PyTorch-Style-Transfer, используются стоковые изображения, расположенные в каталоге images/ и скрипте main.py. Для запуска скрипта main.py необходимо предоставить как минимум пять аргументов:

  • Путь к исходному изображению, или content image (находится в /images/content).
  • Путь к изображению, чей стиль будет применяться, или style image (находится в /images/21styles).
  • Путь к предварительно подготовленной модели GAN (Generative Adversarial Network), используемой для обработки стиля (находится в /models).
  • Путь и имя выходного изображения.
  • Модели глубинного обучения работают намного быстрее на графических процессорах. Если у вас есть такой, укажите параметр —cuda=1, в противном случае используйте —cuda=0.

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

Сначала определите путь к рабочему каталогу в переменной workingdir:

# define the path to the working directory
experiment_dir = 'style_transfer/PyTorch-Style-Transfer/experiments'
workingdir = '{}/{}'.format(os.environ['HOME'], experiment_dir)

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

Затем определите путь к скрипту main.py и список аргументов для тестового запуска обработки изображения. В качестве исходного изображения используется venice-boat.jpg, а в качестве стиля – картина «Звездная ночь», файл starry_night.jpg. выходное изображение будет сохранено в файл test.jpg.

# specify the path to the main.py script
path2script = '{}/main.py'.format(workingdir)
# specify the list of arguments to be used as input to main.py
args = ['eval',
'--content-image',
'{}/images/content/venice-boat.jpg'.format(workingdir),
'--style-image',
'{}/images/21styles/starry_night.jpg'.format(workingdir),
'--model',
'{}/models/21styles.model'.format(workingdir),
'--output-image',
'{}/test.jpg'.format(workingdir),
'--cuda=0']

Прежде чем запустить тестовую стилизацию, вы можете быстро просмотреть изображения, которые вы выбрали для этого примера, с помощью этого кода в документе:

content_image = Image('{}/images/content/venice-boat.jpg'.format(workingdir))
style_image = Image('{}/images/21styles/starry_night.jpg'.format(workingdir))
display(content_image)
display(style_image)

В выводе вы увидите эти изображения.

Затем объедините вызов скрипта main.py и список аргументов и запустите преобразование в оболочке с помощью функции subprocess.check_output:

# build subprocess command
cmd = ['python3', path2script] + args
# run the command
x = subprocess.check_output(cmd, universal_newlines=True)

В зависимости от объема доступной памяти это может занять минуту или две. Как только скрипт завершит работу, вы увидите файл test.jpg в своем рабочем каталоге. Вы можете использовать команды Ipython magic для отображения содержимого вашего рабочего каталога в Jupyter notebook:

!ls $workingdir

Также можно использовать команду ls в терминале. Любой из методов вернет такой результат:

__pycache__ dataset  main.py  myutils  option.py
camera_demo.py  images   models   net      test.jpg

Файл test.jpg хранит выходное изображение.

Чтобы отобразить этот файл, используйте функцию Image:

Image('{}/test.jpg'.format(workingdir))

Художественный стиль картины «Звездная ночь» Винсента ван Вога был перенесен на исходное изображение. Стилизация выполнена успешно. Теперь попробуем повторить это упражнение с другими изображениями.

3: Стилизация ваших изображений

Только что вы успешно стилизовали стоковое изображение. Теперь выберите свое изображение и попробуйте проделать то же самое.

Для этого вы можете найти любое понравившееся изображение и использовать в команде его URL-адрес.

Чтобы загрузить изображение, используйте IPython.

!wget -O - 'https://some-domain.com/url/to/image/your-image.png' > $workingdir/your-image.png

После запуска команды появится такой вывод:

--2017-08-15 20:03:27--  https:// some-domain.com/url/to/image/your-image.png
Resolving some-domain.com (some-domain.com)... 151.101.20.233
Connecting to some-domain.com (some-domain.com)|151.101.20.233|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 10483 (10K) [image/png]
Saving to: 'STDOUT'
-                   100%[===================>]  10.24K  --.-KB/s    in 0.001s
2017-08-15 20:03:27 (12.9 MB/s) - written to stdout [10483/10483]

Команда Image отобразит новое изображение в документе:

Image('{}/your-image.png'.format(workingdir))

Теперь попробуйте преобразовать изображение your-image.png, используя стиль картины «Звездная ночь». Процесс остается таким же, как в предыдущем разделе.

Используйте тот же самый код, который использовали ранее, но на этот раз нужно указать имя вашего файла (your-image.png) в качестве исходного, а выходное изображение поместить в файл starry_image.jpg.

Затем выполните команду:

# specify the path to the main.py script
path2script = '{}/main.py'.format(workingdir)
# specify the list of arguments to be used as input to main.py
args = ['eval',
'--content-image',
'{}/your-image.png'.format(workingdir),
'--style-image',
'{}/images/21styles/starry_night.jpg'.format(workingdir),
'--model',
'{}/models/21styles.model'.format(workingdir),
'--output-image',
'{}/starry_image.jpg'.format(workingdir),
'--cuda=0']
# build subprocess command
cmd = ['python3', path2script] + args
# run the bash command
x = subprocess.check_output(cmd, universal_newlines=True)

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

Image('{}/starry_image.jpg'.format(workingdir))

Для примера попробуйте стилизовать ваше исходное изображение под другую картину, например, под «Музу» Пабло Пикассо. Измените style image в коде, указав la_muse.jpg. Выходное изображение будет помещено в musing_image.jpg

# specify the path to the main.py script
path2script = '{}/main.py'.format(workingdir)
# specify the list of arguments to be used as input to main.py
args = ['eval',
'--content-image',
'{}/your-image.png'.format(workingdir),
'--style-image',
'{}/images/21styles/la_muse.jpg'.format(workingdir),
'--model',
'{}/models/21styles.model'.format(workingdir),
'--output-image',
'{}/musing_image.jpg'.format(workingdir),
'--cuda=0']
# build subprocess command
cmd = ['python3', path2script] + args
# run the bash command
x = subprocess.check_output(cmd, universal_newlines=True)

После выполнения кода можно просмотреть полученное изображение с помощью команды:

Image('{}/musing_image.jpg'.format(workingdir))

Попробуйте самостоятельно преобразовать несколько изображений.

Заключение

В этом мануале вы научились стилизовать изображения с помощью Python и PyTorch. Область машинного обучения обширна, и здесь представлено только одно из его применений. Вот несколько дополнительных тем, которые вы можете изучить:

Tags: , , ,