Это был беззаботный мартовский день 2018 года, когда я и трое моих товарищей по группе решили представить идею для хакатона Mozofest, который состоится в нашем колледже, Институте науки и технологий SRM. У нас была короткая дискуссия, в ходе которой мы придумали идею трека ИИ. Поскольку большинство из нас работали над машинным обучением и компьютерным зрением, мы решили создать приложение, основанное на нескольких концепциях ML и CV.

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

Модуль распознавания лиц:

Это первая часть нашей системы, на которую я потратил больше всего времени. Я использовал сверточную нейронную сеть и локальный графический процессор 1050 Ti, чтобы обучить ее на наборе данных, содержащем около 13 000 изображений, разделенных в соотношении 90 : 10 на наборы для обучения и тестирования. Во-первых, мы использовали OpenCV и предварительно обученный каскад Хаара, чтобы нарисовать прямоугольник вокруг лица и извлечь часть для дальнейшей обработки.

После этого модуль распознавания лиц передает эту небольшую часть изображения сверточной нейронной сети (CNN). CNN обучается партиями и оптимизируется с помощью оптимизатора ADAM. При получении изображения он выводит вероятность, основанную на восьми классах, на которых он обучен. Эти классы включают в себя следующие — Нейтральный, Гнев, Удивление, Счастье, Отвращение, Страх, Презрение и Печаль.

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

Сверточная модель:

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

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

Система рекомендаций:

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

Передача нейронного стиля:

С точки зрения непрофессионала, NST похож на применение фильтра к изображению, как в Snapchat или Instagram.

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

Мы используем его в бинарном контексте. В нашем случае у нас есть знаменитая картина Эдварда Мунка «Крик» и еще одна картина для грустного/нейтрального и счастливого настроения соответственно.

Подробнее о переносе нейронного стиля здесь: https://medium.com/artists-and-machine-intelligence/neural-artistic-style-transfer-a-comprehensive-look-f54d8649c199

Видео-демонстрация нашей модели: https://www.youtube.com/watch?v=Q_uBWfOltvw&t=3s

Код на Github: https://github.com/AbhilashPal/Blissify.ai