[УЧЕБНИК] Собираем открытый проект Neural-Style - обработка ваших фотографий нейронными сетями в стиле Prisma, но при помощи открытого кода! [МАНУАЛ]
Сегодня один мой старый друг снова меня спросил про бота Prisma в телеграме - можно ли его автоматизировать, отправить например ему кучу фоток на обработку, а потом получить результат.
Посмотрел я на этого бота (он постоянно выдавал на любую фотку сообщение: извините, бот перегружен, попробуйте позже), и подумал: а зачем?
[УЧЕБНИК] Собираем открытый проект Neural-Style - обработка ваших фотографий нейронными сетями в стиле Prisma, но при помощи открытого кода! [МАНУАЛ]
Есть же открытый код для работы с нейронными сетями и обработкой изображений, лежит на гитхабе:
https://github.com/jcjohnson/neural-style
Дай, думаю, попробую собрать под Manjaro (почти Arch) и OpenCL, а заодно мануал напишу (среди поддерживаемых ОС упоминаются: Fedora, Ubuntu, Arch, Elementary OS и CentOS).
Чтобы собрать Neural Style, понадобится научный фреймворк для работы с OpenCL/CUDA для Lua, называется он Torch, а также понадобится LoadCaffe - модуль для загрузки моделей в вышеуказанный фреймворк. Ниже, в инструкции, я постарался охватить все этапы установки всех зависимостей.
Требования
- Современный компьютер с CUDA (видеокарты nVidia) или OpenCL (видеокарты AMD) - теоритически можно рендерить и на процессоре, но это дооооолго
- Несколько свободных гигабайт на диске
- Одна из поддерживаемых ОС: Ubuntu, Fedora, Arch, CentOS, Elemetary OS (на другие тоже можно поставить, но все этапы придётся проходить вручную)
- Около часа времени
Инструкция по установке находится в файле INSTALL.md
, но если вам лень читать, вот адаптированная мною инструкция для ubuntu/debian (должно работать и на более старых, чем 17.04, версиях):
Установка Neural Style под Ubuntu 17.04
.1. Ставим зависимости:
curl -s https://raw.githubusercontent.com/torch/ezinstall/master/install-deps | bash
.2. Ставим ещё зависимости:
sudo apt install build-essential libreadline-dev libprotobuf-dev protobuf-compiler
.3. Клонируем Torch:
git clone https://github.com/torch/distro.git ~/torch --recursive
.4. Ставим Torch:
cd ~/torch; ./install.sh
.5. Обновляем .bashrc, чтобы Torch нашёлся без перевхода в сеанс или перезагрузки:
source ~/.bashrc
.6. Ставим LoadCaffe:
luarocks install loadcaffe
.7. Скачаем репозиторий neural style в домашнюю папку и зайдем в него.
cd ~/
git clone https://github.com/jcjohnson/neural-style.git
cd neural-style
.8. Теперь нам нужно установить предварительно обученные модели. Вот так:
sh models/download_models.sh
Учтите, некоторые из них по 100, а некоторые - по 500 мб. Так что процесс займет некоторое время.
.9. а) Если у вас видеокарта nVidia, то практически всё готово (возможно, вам также нужно убедиться что установлена CUDA, все нужные драйвера/обёртки и компоненты к ним), и можно попробовать запустить процесс.
.9. б) Если у вас видеокарта AMD, с более общим и универсальным языком OpenCL, придётся ещё чутка попотеть.
git clone --recursive https://github.com/hughperkins/distro -b distro-cl ~/torch-cl
cd ~/torch-cl
bash install-deps
./install.sh
source ~/torch-cl/install/bin/torch-activate
Возможно, эти шаги для обладателей "красных" видеокарт (radeon) могли заменить полностью шаги 3 и 4 (то есть 3 и 4 можно было пропустить), но я не уверен. Поэтому пусть будет так :)
Как собрать под Arch / Manjaro
В целом, процесс такой же, за исключением установки зависимостей (в арче у вас получится их поставить автоматически, в manjaro же надо открыть файл install-deps и поставить их вручную либо отредактировать скрипт).
Кроме того, вам нужно поставить из AUR сам по себе OpenCL - пакет называется opencl-amd:
yaourt -A opencl-amd
Если у вас вдруг не установлен yaourt (в arch для этого надо вручную добавить французский репозиторий), очень советую поставить. В манджаре йогурт уже есть в репах пакмана: sudo pacman -S yaourt
.
Запускаем процессинг
Давайте для начала положим в папку neural-style 2 файла: один, например, с небоскрёбом, такой:
А второй, например, с яблоками, такой:
Попробуем стилизовать небоскрёбы под картину с яблоками при помощи наших драгоценных нейронных сетей и, конечно же, CUDA/OpenCL!
Картинку с небоскрёбом мы назовём, как бы вы думали? skyscraper.jpg, ну а с яблоками просто painting.jpg. Всё готово для запуска. Поехали:
CUDA:
th neural_style.lua -style_image painting.jpg -content_image skyscraper.jpg -backend cunn
OpenCL:
th neural_style.lua -style_image painting.jpg -content_image skyscraper.jpg -backend clnn
Спустя пару минут (у меня одна карта Radeon RX 480) я получил вот такую иллюстрацию:
На самом деле, в папке оказалось 10 иллюстраций, с разным уровнем смешивания. Решил сделать из них gif-анимацию
Разумеется, при помощи neural-style вы можете также разложить видео по кадрам, обработать его в нужном вам стиле и склеить обратно в единую "ленту". Вопрос вычислительной мощности и времени (а также написания скрипта ;).
Захотелось ли вам провести свои эксперименты с нейронными сетями и иллюстрациями? Попробуете ли вы пройтись по данному учебнику? Пишите в комментариях любые вопросы и вообще всё что касается тем обучения нейросетей и графического процессинга.
Надеюсь, вам было интересно.
Всегда ваш,
айтишник-линуксоид-графоман
Den Ivanov aka SXIII