Сказ о том, как я нейросеть учил картины рисовать

 Публичный пост
30 мая 2021  340

По уже сложившейся традиции, решил я на день рождения жены сделать подарок своими руками. Долго думать не пришлось - захотелось мне подарить картину сгенерированную нейросетью в стиле Сальвадора Дали. Было трудно и интересно. Об этом и расскажу, а также и обо всех технологиях, что пришлось использовать.

Что делать-то?

Решение о таком подарке пришло не само-собой. Я как раз закончил курсы по Deep Learning на Udacity и вот решил попробовать. Конечно же, как и любой новичок, я быстро встрял уже на самых первых этапах. На курсах-то понятно - там и расскажут, и покажут, и направление укажут. А тут? Вот вроде бы понятно что нужно делать, вроде и материал такой проходил, но вот шаг влево и шаг вправо и все, припыли. Перед тем, как я расскажу "куда", давайте сначала посмотрим на матчасть.

Нейросеть

Начнем с азов - с нейросетей. О них очень хорошо рассказано в этом материале. Для меня, как backend программиста, главная проблема была поменять мышление - ведь нет тут никаких циклов, операторов ветвления, классов, модулей, а есть матрицы и только матрицы, ну и различные операции с ними.

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

Обычные простые, их еще называют fully connected networks, варианты нейросетей хороши для небольших операций, например, для работы с текстовой информацией, но в моем случае - для генерации изображения, мне требовалось что-то посолидней - Convulational Layers.

Convulational Layers

Если говорить очень грубо, ну вот прямо чуть ли не матом, то Convulational Layers позволяют разложить изображение на различные фрагменты и, в зависимости от архитектуры, каждый слой в такой нейросети будет содержать свою абстракцию - в одном только прямые линии, в другом только тени, в третьем только окружности и так далее. В принципе, никто особо и не заморачивается в изучении того, в каком слое что находится, так как нейросеть сама определит это в процессе тренировки.

Однако, в 2016 году Leon A. Gatys, Alexander S. Ecker, Matthias Bethge предложили идею метода Style transfer с помощью Convulational Layers. Они обнаружили, что в архитектуре нейросети VGG-19, некоторые слои всегда отвечают за стиль и последующее манипулирование данными в них могут привести к смене стиля у конкретного изображения. Другими словами, можно взять вашу фотограцию, пропустить через VGG-19, взять другую фотографию, например с марсианскими пейзажами, также пропустить через VGG-19, смешать стиль и вуаля - ваше личное фото уже сделано марсианском стиле. Эдакий Photoshop 21-ого века.

Вот с этого я и начал. Взял фотографию с женой, взял картину Дали и начал эксперементировать. Результат получился неплохой, но как я и описал выше - неплохой такой Photoshop, но хотелось изюминки. Следующим шагом была генерация изображения с помощью архитектуры GAN или Generative adversarial network.

Generative adversarial network

Идея у такой архитектуры заключается в том, чтобы создать 2 нейросети. Одна будет точно знать, как отделить реальное изображение от сфабрикованного, а вторая будет пытаться обмануть первую, сгенерировав что-то правдоподобное. В итоге, после тренировки, первую нейросеть можно смело выкинуть, а вторую использовать. Важной особенностью такого типа нейросетей является то, что они тренируют сами себя. Как только вы увидите, что Generator (тот, что генерирует изображение) научился хорошо обманывать Descriminator (тот, что отделяет фейк от реального), значит все готово.

Данная архитектура была прeдложена еще в 2014 году и оказала огромное влияние на развитие нейросетей для работы со сложной информацией, какой как звук, изображение или видеоданные.

Я начал свою работу с архитектуры DCGAN - это первая архитектура, которая предложила использовать GAN вместе с Convulational Layers для генерации изображений. После 10000 итераций у меня получилось это:

Тогда я еще не понимал, что же все-таки пошло не так, поэтому меня это никак не остановило и с криком - "да это просто архитектура не той системы" я принялся искать другие варианты. Остановился, в итоге, на Relativistic GAN - просто понравилось описание. Итак, новый заход и после 15000 пробегов начало получаться уже что-то адекватное. Судите сами.

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

Датасет

Как и человеческий мозг, нейросеть сначала должна быть обучена. Для этого нам потребуется датасет - набор файлов или данных. В моем случае, это работы Сальвадора Дали. К сожалению, великий художник совсем не думал о будущих датасайнтистах и вместо несколько тысяч своих картин, нарисовал лишь несколько десятков. Я подошел творчески, поэтому скачал все его картины по несколько раз в разном качестве. В сумме получилось 216 изображений, но и этого, к сожалению, все равно было недостаточно.

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


Сгенерированные портреты людей с помощью архитектуры Stylegan2 от Nvidia

Облачные вычисления

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

На моем дешевом MacBook'e хорошей видеокарты нет и первое, что я сделал, это оптимизировал Stylegan и Stylgan2 для работы на CPU. Звучит, конечно, мощно, но на самом деле, я просто изменил часть кода и отключил несколько проверок на наличие GPU.

Потренировав все это дело пару дней я понял, что дальше так вести себя нельзя. Нужно как-то выходить из дремучего леса ближе к цивилизации и как-то оптимизировать свое время. Так я открыл для себя мир облачных вычислений.

Так как курс на Udacity, с которого началось мое знакомство с миром нейросетей, познакомил меня с AWS (без ссылок, чтобы не рекламировать), то с него я и решил начать. Если коротко, то как-то все запутано, а главное, SageMaker - так называется сервис для MachineLearning на AWS, требует адаптировать код под местный SDK, что мне очень не понравилось. И так кругом все неизвестно и непонятно, а тут еще дополнительная преграда. Что-то в итоге сделал, но в конце-концов плюнул я на это дело и пошел искать что по-проще.

Google Colab мог бы стать отличным для меня вариантом - простой инструмент со всеми необходимыми возможностями. Не успел я было обрадоваться находке, как выяснилось, что ускорение вычислений с помощью GPU доступно только для жителей США. Опять мимо.

Финальной попыткой стал Microsoft Azure. Тут все было просто и понятно. Создал ноутбук, потренеровал нейросеть несколько дней, забыл выключить виртуальную машину и налетел на хороший счет. Как все просто было однако с обычными хостингами или VPS - ну полежит у тебя сайт несколько дней. Кому какая раница, ведь свои деньги ты уже оплатил? А тут два дня простоя и вот тебе уже -50 евро на счете. Спасибо стартовому бонусу в 150 евро, который покрыл все непредвиденные расходы.

Итак, что у меня получилось? Неудавшаяся попытка со Style Transfer, несколько испробованных архитектур в виде DCGan, Stylegan2, RelativisticGan и вот результат:


25 вариантов сгенерированных картин с помощью архитектуры RelativisticGAN

Что же пошло не так? Как я уже описал выше - датасет. Данных в нем явно недостаточно, чтобы нейросеть смогла обучиться. Даже попытки натренировать ее с помощью GPU и новейших архитектур не дали существенных улучшений.

Врагу не сдается наш гордый начинающий датасайнтист

Решил я тогда пойти другим путем. Нарисовать картину самостоятельно и позволить нейросети раскрасить ее в стиле Сальвадора Дали. Сказано - сделано. Нарисовал карандашом 3 эскиза, выбрал лучший, взял акварель у дочери и принялся творить. Последний раз, к слову, рисовал только комиксы в 5-ом классе.


Акварель. Кисть. Художник Андрей Ерёмин.

За основу, как нетрудно догадаться, я взял картину Дали "Сон". Все же как ни крути, а если не вдаваться в детали, она самая простая. Ну почти.


Картина Сон. Сальвадор Дали.

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


Моя работа обработанная нейросетью с помощью Style Transfer.

Тут, конечно, Остапа понесло, и я решил попробовать забрать стили и от других картин Дали.


Финал

Стоит упомянуть, что финальную обработку с помощью Style Transfer я делал уже на своем ноутбуке, который смог вытянуть только разрешение в 1024 пикселя. Для печати такого касества явно не хватало, ну разве что в виде фото. Я был готов к такому варианту и на этот случай припас еще одну архитектуру - ESRGan, которая может увеличивать изображения в несколько раз без потери качества.

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


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

Полезные материалы

  • [мой репозиторий|https://github.com/developer88/style_transfers] с Jupyter ноутбуками по Style Transfer
  • неплохой nano-degree курс от Udacity, который познакомил меня с миром нейросетей
  • мой репозиторий с Relativistic GAN который я использовал для генерации картины по датасету на основе работ Сальвадора Дали

ℹ️ Изначально это было опубликовано тут, но там меня никто не читает. 😎

7 комментариев 👇
Ivan Puhachov, канадский аспирант 31 мая в 02:03

Отличная работа! Об этом редко пишут, но ганы тренировать очень сложно - они часто расходятся и выдают чушь. Это происходит потому что generator и discriminator играют в минимакс игру - один пытается минимизировать успех другого (второй - дискриминатор - хочет максимизировать свой успех). И часто оказывается, что точка равновесия у этой игры неустойчивая (из неё легко выпасть) и обе сети уходят в дебри, где дискриминатор работает неадекватно, а генератор ничему толком и не учится.
Странно, что Colab не завёлся, вроде бы для всех доступно вычисления на ГПУ. На США ограничивается только Colab Pro за 10 долларов в месяц (видеокарты мощнее) - но и то потому что гуглу лень разбираться с законодательством, никакой проверки по локейшену там вроде бы нет. У меня есть эта подписка (из Канады), все работает, но может в Европе и не так.

  Развернуть 1 комментарий

Наверное все таки Convolutional Layers :)

  Развернуть 1 комментарий

Молодец, что репостнул сюда. Комбинация личного опыта и интересной темы - ради таких постов многие в клубе и сидят.

Что насчёт самого контента: в каком формате ты подарил картину жене? Мне кажется, получить постер с таким бекграундом было бы сильно приятнее, чем картинку в ВК. Картина наблюдала бы со стены как вы проваливаетесь в "сон" 🌚.
Хотя может это я такой пропащий материалист.

  Развернуть 1 комментарий

@rinat, я распечатал картину. Все как положено. Теперь висит на стене

  Развернуть 1 комментарий
Александр Лядов, Computer vision Инженер 30 мая в 20:59

Почему именно nano degree от Udacity, сравнивали ли до этого с другими курсами?
А так отличный пет проект :)

  Развернуть 1 комментарий

@AleksandrLiadov, изначально не сравнивал. Зашёл в дип лёрнинг как раз через удасити. В последствии, в этом году уже опробовал специализацию от deep learning.ai на курсере, но удасити в чем-то все же лучше для тех, кто хочет начать.

У deep learning.ai дают глубокие знания, четко, структурировано, однако, вот только сейчас они обновили используемые технологии. Изложение мне понравилось, но оно хорошо, если ты сразу окунаешься с головой, то есть ты уже знаешь зачем тебе это и ты хочешь этим заниматься. Если ты просто для саморазвития зашел, то может быть тяжело. Удасити в этом плане больше для тех, кто хочет расширить кругозор. Многому не научат, но со многим познакомят

  Развернуть 1 комментарий
Maksim Merkulov, Sr. Software configuration engineer 24 августа в 16:03

Крутая статья и работа!
Ух, понимаю боль когда забываешь удалить инстанс на клауде :)

  Развернуть 1 комментарий

😎

Автор поста открыл его для большого интернета, но комментирование и движухи доступны только участникам Клуба

Что вообще здесь происходит?


Войти  или  Вступить в Клуб