Мотивация

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

Во время своего рождественского отдыха я понял, что уровень моей активности, как показывает Oura ring, снижается во второй половине года :( что заставило меня задуматься о том, что я могу сделать, чтобы обратить вспять эту тенденцию. (Мы все знают, что простое добавление «будьте активнее» в новогоднюю резолюцию волшебным образом не решит проблему)

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

Ссылка на GitHub

Язык и пакеты: python, pytorch, opencv, sqlite3

Видео-демо: будет добавлено

Теперь мы можем с большей уверенностью добавить «будьте более активными» к новогоднему постановлению на 2021 год.

С Новым годом!

Функциональность и дизайн высокого уровня

  1. Напоминание о перерыве в работе: программа заблокирует компьютер, если пользователь просидел слишком долго.
  2. Коррекция осанки: во время работы, если у пользователя плохая или неэргономичная поза, программа уведомит пользователя (звуковой сигнал)
  3. Растяжка: по прошествии достаточного количества времени вне экрана пользователь может разблокировать экран, приняв самостоятельно определенные позы для растяжки (например, приседание, собака вниз и т. д.)

На рисунке ниже показан полный рабочий процесс программы. Что касается используемого оборудования, я использую веб-камеру 1080p (более низкое разрешение тоже нормально), чтобы периодически фотографировать себя, работающего за столом. Веб-камера подключена к ПК с RTX 2080 Ti, на котором работает вся программа.

Когда я начинаю работать за столом, веб-камера начинает делать снимки каждые T секунд (по умолчанию T = 2), изображение передается в модель OpenPose, которая предсказывает 18 ключевых точек человеческих тел. Затем два процесса принимают 18 ключевых точек в качестве входных данных: нейронную сеть для определения того, сижу ли я или стою, и основанный на правилах тест, чтобы определить, неправильная ли моя поза. Если у меня плохая осанка, скажем, наклон головы вперед, вызывающий боли в шее и плечах, сработает сигнализация. Статус сидя или стоя и координаты 18 точек хранятся в базе данных.

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

Когда экран заблокирован, веб-камера продолжает делать снимки. Изображения по-прежнему передаются в OpenPose, чтобы проверить, действительно ли я отключился от экрана, чтобы сделать перерыв: если будет обнаружена какая-либо из 18 ключевых точек, он будет думать, что я все еще нахожусь перед экраном, и, таким образом, перезапустил подсчет. Только когда пройдет достаточно НЕПРЕРЫВНОГО времени вне экрана, программа может перейти к следующему этапу.

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

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

Детали: дизайн, модель и реализация

Почему OpenPose?

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

Перед тем, как разрабатывать программу, я задал себе список вопросов:

  • Это должно быть в реальном времени? (Да)
  • Он предназначен для использования одним или несколькими людьми? (использование одного человека)
  • 2D или 3D? (2D достаточно с фиксированным обзором камеры)

OpenPose - это первая в реальном времени двухмерная двухмерная модель оценки позы человека с открытым исходным кодом. Здесь используется восходящий подход, который сначала прогнозирует карты достоверности для всех суставов и полей сродства частей (PAF), соответствующих конечностям, а затем использует жадный метод анализа для правильного соединения и назначения частей тела каждому человеку.

Машинное обучение или алгоритмы на основе правил?

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

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

Для задачи классификации сидя / стоя методы машинного обучения более подходят, чем основанные на правилах, потому что:

  • У пользователей есть различные позы сидя / стоя, и неэффективно и неполно жестко закодировать правила для ключевых частей тела (таких как ноги, бедра и руки), чтобы различать их.

  • Получение достаточного количества данных для обучения дешево: я написал код, чтобы фотографировать себя, сидящего / стоящего перед столом, раз в несколько минут. Я запускал код каждый день в течение недели и смог получить ~ 500 изображений сидя и еще ~ 500 изображений стоя, без особого дополнительного времени.

Как специалист по данным, я должен сказать, что ввод 18 пар координат ключевых точек непосредственно в нейронную сеть, без EDA или разработки функций, не является хорошей практикой. Было Рождество, и я очень торопился сыграть в Don’t Starve Together, поэтому на этот раз простил себя. Но я позаботился о том, чтобы не было переоборудования. Конечная точность была выше 97% как для обучающих, так и для тестовых наборов данных.

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

  • Первая причина проста: не существует таких понятий, как «стандартное сидение» или «стандартное положение стоя», вы можете сидеть или стоять, как хотите. Но существуют определенные стандарты выполнения поз. Для разблокировки экрана можно принимать только позы, соответствующие этим стандартам.

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

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

Предостережения, ограничения и дальнейшая работа

Неофициальная реализация PyTorch работает с неоптимальной скоростью

Для этой демонстрации я использовал неофициальную реализацию PyTorch и смог достичь только 8 ~ 9 кадров в секунду вместо 22 кадров в секунду, как в официальной реализации. (с графическим процессором, размер изображения 320 * 240) Причина, по которой я не использую официальную, заключается в том, что исходный код был написан на C ++ и Caffe, которые я не использую. Есть два возможных решения: (1) изучить C ++ (возможно, еще одно новогоднее решение) и (2) профилировать реализацию PyTorch для увеличения ее скорости.

Рамка из 18 пунктов может быть слишком разреженной для коррекции осанки.

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

Это не инвариант точки зрения

В текущих настройках камера должна быть установлена ​​с фиксированной точкой обзора. При изменении точки обзора необходимо пересчитать углы. Одним из будущих усовершенствований, призванных сделать программу более гибкой и мобильной (например, запускаемой на Jetson Nano), является переключение на 3D-модель и добавление инвариантного преобразования точки обзора.