машинное обучение15 марта 2021

Как мы обучили нейросеть поздравлять женщин с 8 марта

Дмитрий ПереверзаСтарший фулстек-разработчик

Введение

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

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

Генерация изображений цветов

Главная задача состояла в синтезе реалистичных изображений цветов. В любых проектах по машинному обучению важно подготовить набор данных. К счастью, поиск датасета с фотографиями цветов не составил проблем. Google по запросу flowers dataset первой же строчкой выдает набор из 102 категорий и 8189 фотографий.

Так как проект исключительно развлекательный, и высокая точность не требуется, нас устроило качество датасета. Если бы перед нами, например, стояла задача распознавать на фото только опыленные цветы, то потребовался бы более тщательный подход.

Для визуализации категорий в наборе данных использовались функции SIFT в качестве дескриптора формы и HSV в качестве дескриптора цвета. Изображения выбираются из категории случайным образом.

SIFT (масштабно-инвариантная трансформация признаков англ. scale-invariant feature transform) — алгоритм компьютерного зрения для выявления и описания локальных признаков в изображениях.

HSV — цветовая модель, в которой координатами цвета являются:

  • Hue — цветовой тон;
  • Saturation — насыщенность;
  • Value — яркость.

Архитектура нейронной сети

Для синтеза новых изображений решили использовать GAN. Генеративно-состязательная нейросеть (Generative adversarial network) — архитектура, состоящая из генератора и дискриминатора, настроенных на работу друг против друга, отсюда и название.

Как работают GAN?

Внутри любой GAN-модели принципиально должны быть две нейросети: генератор и дискриминатор. Если провести грубую аналогию, то представьте, что генератор — это художник, который пытается подделывать подлинные картины. Подлинные картины — это те данные, что были в датасете, на котором обучалась нейросеть. Дискриминатор выступает как эксперт лаборатории, которого надо убедить в подлинности картины.

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

Как это происходит пошагово:

  • Генератор получает случайно сгенерированный шум и возвращает сгенерированное изображение.
  • Это сгенерированное изображение подается в дискриминатор вместе с потоком изображений, взятых из фактического набора данных.
  • Дискриминатор принимает как реальные, так и поддельные изображения и возвращает вероятности, числа от 0 до 1, причем 1 представляет собой подлинное изображение, соответственно 0 — фальшивое.

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

  • Дискриминатор находится в цикле с достоверными изображениями
  • Генератор находится в цикле вместе с дискриминатором

Как проходило обучение

Выбрав архитектуру, можно приступать к обучению. Так как обучение нейросети процесс ресурсозатратный, то для него принято использовать не центральный процессор (CPU), а более мощный — графический (GPU). Чаще всего для таких задач используют облачные решения. Мы воспользовались Google Collab, который позволяет выполнять код на Python через браузер.

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

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

Морфинг

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

Генерация текстов поздравлений

Теперь, когда у нас есть цветы, нам остается синтезировать тексты поздравлений.

Модель

Для генерации текстов поздравлений мы использовали RuGPT-3, это открытая предобученная Сбером нейронная сеть GPT-3, о которой мы подробно рассказывали в октябрьском выпуске нашего дайджеста. RuGPT-3 обучена на более чем 600 Гб информации из открытых наборов данных. Нельзя предсказать заранее результат, который будет получен с помощью применения модели.

Если не производить дообучения модели, а просто на входе попросить ее поздравить с 8 марта, то можно увидеть подобные поздравления:

  • Поздравляю! Хорошие фотографии. Думаю, любой фотограф может достичь такого результата, главное - желание:) Нормально, что хоть что то видите… С каждым годом все лучше и лучше.
  • Поздравляю! и не «привет», а «покорнейше благодарю за вашу помощь в устранении моей обиды».
  • Поздравляю с 8 марта. я тебя угораздил.(правда я вёл себя так как будто у меня красный диплом об окончании)

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

В результате получили файл с 3199 поздравлений. Этого должно быть достаточно для наших целей.

Обучение

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

«С днем восьмого марта поздравляю! Пусть в жизни будет много счастья. Пускай сбудутся твои заветные мечты... С 8 Марта поздравляем, Вас мы любим и уважаем вас всей душой своей — с международным женским днём от души вам пожелаю я любви огромной взаимной без конца; пусть все ваши беды будут мимо неё стороной обходят тебя никогда: ни за что бы ты не узнала о том дне или ночи когда муж пришёл к тебе домой уставший после рабочего дня на кухню вымыть посуду он принёс её поставил рядом накрыл мой любимый плед а потом достал из шкафа всё это сложил вместе взял мою любимую шубку которая стояла у плиты надел туфли чтоб было тепло ему приготовил еду для любимой погладил по голове чтобы она была молода вот так решил оставить свой след мужчина который любит свою жену готов душу спасти но увы вынужден уйти жить со словами «я же сказал» ну ладно хватит об этом сейчас главное любовь большая ведь счастье всегда впереди нас всех дорогая мама любимая жена родная моя тётя очень сильно изменилась как только вошла во взрослую жизнь...»

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

Результаты:

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

Деплоймент

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

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


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

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

Другие статьи

Ко всем статьям

Интересные статьи и кейсы
от Work Solutions

Нажимая кнопку «Подписаться», я даю согласие на обработку персональных данных

Спасибо за подписку!