Сделай сам: трекер, который напомнит, что пора отвлечься от дел и передохнуть
Автоматизируем напоминания о перерывах на работе.
В серии DIY-статей «Пространство для изобретений» мы пробуем в домашних условиях разработать необычные гаджеты и оставляем все необходимые инструкции, чтобы любой желающий мог повторить наш опыт. Серию статей поддерживает Selectel — провайдер ИТ-инфраструктуры, которая помогает в решении рабочих задач и разработке личных проектов. Посмотреть, что интересного есть у провайдера, и выбрать для себя подходящие решения можно на сайте.
В этом материале Станислав Грицинов, разработчик электронных устройств, собирает трекер, который наблюдает за пользователем во время работы и присылает уведомление в Telegram, если тот засиживается без перерыва больше трёх часов. А к сообщению прикрепляет видеотренировку — чтобы перерыв прошёл с пользой.
Список компонентов
По задумке трекер — это устройство с камерой, которая снимает сидящего за монитором человека, фиксируясь на его лице. Если лицо не пропадает из кадра больше трёх часов подряд, то трекер сигнализирует сообщением — в нашем случае в Telegram.
Устройство мы будем собирать на основе микрокомпьютера Raspberry Pi 4 (1–8 Gb RAM) с картой microSD. Карту стоит подобрать ресурсоёмкую (рассчитанную на большое количество циклов перезаписи), с объёмом больше 16 Гб. Помимо этого нам потребуются:
- радиатор;
- вентилятор [5V];
- блок питания [5V, 2A];
- кабель micro HDMI;
- монитор;
- USB-клавиатура;
- USB-мышь;
- USB-веб-камера.
Установка пакетов: Python 3, OpenCV, telegram-send, facial_recognition
После установки системы на SD-карту, запустив Terminal, вводим по очереди команды для обновления системы перед установкой пакетов:
Затем устанавливаем Python 3:
И проверяем установленные версии:
Переходим к установке OpenCV: это свободно распространяемая библиотека компьютерного зрения и машинного обучения, реализованная на С/С++ и предназначенная для обработки изображений в реальном времени в различных операционных системах.
Устанавливаем OpenCV, face_recognition и imutils (некоторые команды исполняются несколько минут):
Увеличим размер swap для успешной компиляции OpenCV (если swap небольшой — возможны зависания). Правильный расчёт размера файла подкачки выглядит следующим образом: 2 × RAM. В нашем примере «малинка» имеет 1 Гб оперативной памяти, поэтому размер файла подкачки будет составлять 2 Гб, то есть 2048 Мб. Внесите это значение в конфигурационный файл.
Откройте файл подкачки:
Измените размер swap CONF_SWAPSIZE=100 на CONF_SWAPSIZE=2048.
Затем выйдите по комбинации клавиш Ctrl + X и в ответ на запрос программы нажмите Y + Enter (сохранить файл).
Перезапускаем демона, управляющего файлом подкачки:
Я буду использовать версию OpenCV: 4.5.3. Скачиваем и распаковываем архивы с исходниками:
Настройка сборки, оптимизированной для Raspberry Pi:
Сборка и установка:
Команда make -j$(nproc) при использовании всех ядер процессора будет выполняться около часа. После успешной установки OpenCV вернём размер swap к исходному (для сохранения ресурса SD-карты):
Меняем размер swap CONF_SWAPSIZE=2048 на CONF_SWAPSIZE=100.
Снова применяем комбинацию клавиш «Выход» — Ctrl + X, а затем сохраняем файл — Y + Enter. Перезапускаем демона:
Устанавливаем Telegram-send:
А затем — пакет для распознавания лиц facial_recognition:
Настройка облачного хранилища Selectel
Я решил не ограничиваться только уведомлениями «Вы работаете без перерыва три часа». Чтобы трекер стал полезнее, я добавил в него видео с тренировкой для глаз, массажем шеи, короткой медитацией и зарядкой — какое именно, бот будет выбирать случайным образом. Видеозаписи нашёл в сети, но для корпоративного пользования подготовил бы их самостоятельно — чтобы все ролики были с хорошей картинкой и звуком, без лишних предисловий.
Чтобы не слишком забивать роликами по 5–10 минут локальное хранилище, выношу их в облако Selectel. Регистрируюсь в панели управления, оплачиваю объектное хранилище, нахожу «Облачное хранилище» в панели управления и перехожу в пункт меню «Пользователи». Создаю нового пользователя и контейнер в хранилище Selectel. Название хранилища стоит вводить без пробелов — иначе в ссылках, которые бот отправит в Telegram, нужно будет заменять пробелы на URL-код %20.
Тип хранилища — «Публичный», класс — «Стандартное хранение». В настройках контейнера выбираем «Управление доступом» и для указанного пользователя ставим «Чтение и запись».
Ниже список видео, которые присылает мой бот (их можно скачать и использовать для вашей разработки):
Загружаем файлы в контейнер, по ссылке — описание API для работы с хранилищем Selectel.
Настройка telegram-бота
Создаём бота через BotFather — находим его через поиск и начинаем диалог с помощью /newbot. Выбираем название и пользовательское имя бота, в ответ BotFather отправит вам токен.
Вводим команду в Terminal:
Затем вводим токен из сообщения BotFather (Use this token to access the HTTP API):
Получаем пароль — его нужно отправить боту после сообщения /start. Теперь он готов принимать сообщения-напоминания со ссылками видео.
Настройка распознавания лиц facial_recognition
Чтобы устройство отличало пользователя от кота или фикуса на окне, обучим его распознавать лицо:
- Откройте в File Manager папку /home/pi/facial_recognition/dataset/.
- Создайте папку с именем пользователя, время работы которого планируете отслеживать. В проекте пользователя я назвал «USER».
- Скопируйте в папку готовый набор фото в разных ракурсах с хорошим освещением (10 снимков вполне хватит).
Вместо готового набора фото можно создать набор с помощью веб-камеры. Для этого можно использовать, например, Text Editor: меняем в строке 3 файла headshots.py: 'Caroline' — на нужное имя и запускаем файл headshots.py из папки /home/pi/facial_recognition в Terminal:
Запускаем файл train_model.py для обучения:
Обработанные данные сохраняются в файле encodings.pickle.
Для проверки распознавания можно запустить файл facial_req.py:
Нажмите Ctrl + C для остановки работы тестовой программы распознавания.
Запуск python-программы
Распаковываем архив Work_Time_Python в новую папку и открываем Thonny Python IDE. Переходим в меню системы Raspberry, затем в меню Thonny Python IDE. Открываем файл cURL_request_def.py. Вводим в строках:
Строка 8: номер вашего аккаунта.
Строка 9: имя пользователя с доступом к контейнеру видеофайлов.
Строка 10: пароль аккаунта Selectel.
Строка 11: название контейнера с файлами.
Сохраняем файл cURL_request_def.py (его можно закрыть).
Открываем файл Work_time_tracker.py. Запускаем его кнопкой RUN (круглая зелёная).
Появляется окно Facial Recognition, отображающее кадры с веб-камеры и прямоугольник распознавания лица с заданным именем (USER или другое выбранное вами имя).
Чтобы остановить работу программы нужно нажать красную кнопку STOP.
С появлением пользователя в кадре и его распознавания начинается отсчёт: если человек не покидает рамок камеры три часа, то получит напоминание об этом в Telegram, а ещё — случайно выбранное видео из хранилища Selectel.
Время непрерывной работы задаётся в строке 15 файла Work_time_tracker.py: detection_interval (10 800 с. = 3 часа). Если пользователь продолжает работать, второе сообщение придёт через ещё один интервал (3 часа) detection_interval, и так далее.
При этом даже если в течение интервала detection_interval пользователь отвлекался от работы на незначительное время (например, отворачивался и камера его не распознавала), отсчёт не прерывается. Для этого в строке 16 задано absent_interval, 30 секунд. Если камера теряет его больше чем на полминуты — отсчёт прерывается и возобновляется, когда пользователь найден. Количество секунд можно настроить под себя так, чтобы трекер не засчитывал за отдых, например, выходы в туалет — в примере мы считаем их как перерыв. Интервал детектирования пользователя в кадре задаётся в строке 17: detection_interval (1 секунда).
Чтобы распознавание пользователя в кадре было корректным, в комнате должно быть достаточно рассеянного света (любителям ночной работы придётся немного поиграть с освещением и программой).
Это точно vc, а не хабр?
а вообще есть обратная фигня которая бы помогала заняться делами и отвлечься от ерунды?
Хабр все, каждый день там пробив дна и неадекватная аудитория из школьников и псевдоинтеллектуальных задротов.
хабр мертв, совершенно. Аудитория уехала на VC и DTF
На python я уже не потяну.
Делал такого бота на геткурсе с помощью процесса.
Он тупо каждые полчаса спрашивал в телеге- чем занимаешься?
Как ни странно-помогало.
А вот упражнения для глаз это хорошая идея. Доработаю своего.
а вообще есть обратная фигня которая бы помогала заняться делами и отвлечься от ерунды?Есть способы:
1. Кофе
2. Музыка
Если эти способы не помогают, значит нужно идти к врачу и лечить здоровье.
Нет, потому что читая VC ты уже занимаешься ерундой, был бы парадокс
Если лицо не пропадает из кадра более 3 часов, то подаем ток на баттплаг.