Машинное обучение – это исследования в области информатики, искусственного интеллекта и статистики. В центре внимания машинного обучения – подготовка алгоритмов для изучения закономерностей и прогнозирования данных. Машинное обучение особенно ценно, потому что оно позволяет использовать компьютеры для автоматизации процессов принятия решений.
В 2015 году исследователи создали алгоритм neural style transfer, который соединял содержимое одного изображения с художественным стилем другого. Этот новый алгоритм генерировал уникальные образы; также он предложил уникальный взгляд на то, как визуальная система может вывести новые художественные концепции.
Этот алгоритм работает на основе нейросети. Подробности его реализации выходят за рамки данного мануала; найти больше можно в этом блоге.
Этот мануал научит вас преобразовывать стиль изображений с помощью нейросети, Jupyter Notebook и командной строки Linux.
Примечание: Для примера выберите любое простое изображение и найдите картину Винсента ван Гога «Звездная ночь». Внесите соответствующие поправки в код, указав имена ваших файлов.
Требования
- Сервер Ubuntu 16.04, настроенный согласно этому руководству.
- Jupyter Notebook (установить его вам поможет мануал Установка Jupyter Notebook для Python 3).
Примечание: Работа с моделями машинного обучения может потребовать много памяти. Для выполнения некоторых вычислений на машине должно быть не менее 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. Область машинного обучения обширна, и здесь представлено только одно из его применений. Вот несколько дополнительных тем, которые вы можете изучить: