Лучшие выпускные работы весеннего семестра Технопроектов

l2wj7pe6zbg5yly3sw5vgfqyip4.jpeg


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

Предыдущие публикации: 1, 2, 3, 4, 5.

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


Facepick, Технополис


Сервис поиска фотографий по лицам.

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

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

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

pye9xywmgtsv1_p3y8ios9ln8k0.jpeg

2mm7gbraquemdkdpp22hzxnbefs.jpeg

Сервис представляет собой клиент-серверное приложение с REST API. Серверная часть состоит из двух основных компонентов: Java-приложения, в котором реализована логика взаимодействия пользователя с сервисом; и Python-приложения для определения лиц на фотографиях и извлечения их уникальных признаков при помощи нейронной сети.

Авторы делали упор на масштабируемость, поэтому применили балансировщик для регулирования нагрузки на бэкенд, а использование очереди сообщений Redis для взаимодействия Java- и Python-приложений позволяет независимо изменять число инстансов этих компонентов.

Все сервисы разворачивается в отдельных Docker-контейнерах, а для их оркестрации используется docker-compose. Для реализации клиентской части приложения использовали TypeScript и React. В качестве персистентного хранилища данных применена база данных PostgreSQL.

iykarcxz-gb8yotllkvtftceqig.jpeg

В дальнейшем выпускники хотят повысить точность распознавания, добавить фильтры по полу и возрасту, а также поддержку Facebook и Google Photos. Также есть идеи по монетизации сервиса ограничением бесплатной функциональности и введением рекламы.

Команда проекта: Вадим Дьячков, Егор Шахмин, Николай Рубцов.

Видео с защитой проекта.

Playmakers, Технопарк


Программно-аппаратное решение для журналирования спортивных тренировок.

Так получилось, что все участники команды проекта увлекаются спортом. Приходя в зал и наблюдая, как люди журналируют свои тренировки и прогресс, студенты задавались вопросом — можно ли улучшить этот процесс? После исследований и опросов команда поняла, что существующие приложения для ведения тренировок имеют слишком сложный UX, а носимые устройства, которые есть на рынке, хорошо работают, в основном, с кардиотренировками (бег, эллипс и т.п.). В результате они сформулировали свою схему работы:

53f1b9e1b33465189102e6d04fc66839.gif


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

В качестве аппаратной платформы выбрали модуль ESP32-WROOM в составе ESP32-devkit-v1. Она удовлетворяла определённым требованиям, под неё написаны утилиты генерирования кода и прошивки на Python, и к тому же её можно программировать из Arduino IDE как любую плату Arduino. На роль датчиков выбрали модуль Amperka IMU, в состав которого входит акселерометр и гироскоп. Вс` общение с датчиками происходит по протоколу I2C.

Схема прототипа:

21ffb1cf345c29d4fec318e93ed51972.png


l7sri56360e8ff47lbq7dqyxxy0.jpeg


Для следующей версии устройства печать платы и пайку компонентов заказали в Китае.

1e71541163b1ae7a676a6f7346fdf6ef.png
_fnpfpd4g8j0ug071o-nzb83hau.jpeg


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

Данные с акселерометра после фильтрации.

b14ef6e22fa8036cfb2aea2c51746c0b.png


09884c7dd19303c19f0a4cdc9b045876.png


Данные с гироскопа после фильтрации.

За классификацию упражнений отвечает рекуррентная нейронная сеть с архитектурой LSTM. Для удобства визуализации временных рядов использовали метод главных компонент (PCA).

da9659af3ff93d70327fd5e231dddec6.png


Результат работы нейросети (оранжевая линия — вероятность выполнения отжиманий, зеленая — приседаний).

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

Интерфейс приложения:

1e9432af111787cb75b2836e40b61162.gif


a00739a1fd90ec1afb798c32f07a72a9.gif


0767bf59f8b0fc77827ba8f014dd0f06.gif


Кроме клиентского приложения авторы разработали вспомогательную программу Batcher, которая облегчала запись и разметку данных для обучения нейросети:

ae9e4c96b785ca28322a206212ce80b2.png


Кроме того, авторы написали механизм валидации батчей после их сохранения в БД.

Для хранения временных рядов была выбрана база InfluxDB, которая адаптирована под такие задачи. Для реализации сервиса машинного обучения выбрали стандартный стэк из Python, Django и Celery. Очередь задач позволил выполнять задачу классификации асинхронно, не блокируя основной интерфейс приложения.

Для хранения данных о пользователях взяли Postgres, сам бэкенд приложения реализовали на Go с использованием фреймворка Gin.

fa19ce22df4bef43e3216cf2a771de33.png


Общая архитектура.

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

Команда проекта: Олег Соловьев, Темирлан Рахимгалиев, Владимир Елфимов, Антон Мартынов.

Видео с защитой проекта.

GestureApp, Техносфера


Фреймворĸ бесĸонтаĸтного интерфейса.

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

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

c16f8a379b3be0ebf0001373e985769e.jpg


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

Жесты распознаёт нейронная сеть MobileNet3D. Нейросеть выдает вероятности классов жестов, а также специального класса «отсутствие жеста». Такая архитектура позволяет распознавать как статичные, так и динамические жесты. Обучалась нейросеть на датасете Jester. Достигнута точность прогнозирования F1=0,92.

Поток захвата получает кадры с фронтальной камеры и помещает их в конец списка. Если его длина больше 32, поток захвата будит поток исполнения модели. Тот берет 32 кадра из начала списка, прогнозирует классы, затем удаляет элементы с конца, пока не останется один элемент. Благодаря этому не нужна тяжелая синхронизация и существенно повышается производительность: 20 FPS на iPhone 11, 18 FPS на iPhone XS Max, 15 FPS на iPhone XR. А с помощью «умного» конвейера предварительной и последующей обработки энергопотребление снижено до минимума.

Пока что фреймворк работает только под iOS и Windows. В разработке применялись фреймворк PyTorch, платформа TwentyBN и язык Swift.

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

Команда проекта: Максим Матюшин, Борис Константиновский, Мирослав Морозов.

Видео с защитой проекта.


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

© Habrahabr.ru