Машинное обучение для контроля за ноутбуком

В журнале Linux Format (LXF238) прочитал статью о машинном обучении с использованием Google TensorFlow. Кратко - это библиотека для создания нейросети, в статье говорилось об уже готовой сети, предназначенной для распознавания картинок, приведен пример - распознование цветов (тюльпан, роза и т.д.). Все предполагалось установить на raspberry Pi, и использовать уже готовую сеть, отрезав верхний уровень и переобучив на своем наборе данных (пример цветы и рыбы). Я захотел освоить такую технологию, тем более что сейчас есть время, но какую выбрать идею?

Я решил завести учет времени, которое семья проводит за компьюером.

Постановка задачи

За компьютером (у меня ноут hp с видеокамерой) могут сидеть: я, жена, ребенок. Так же он может быть просто включен, например для просмотра фильма (на телевизоре) или воспроизведения музыки. Программа должна используя видеокамеру понимать кто сидит за компьютером (может быть что и ни кто) и записывать в БД. Потом по этой БД можно будет строит отчеты.

Требования к БД

БД - sqllite, формат записи:

2019-01-10 12:23:00; Andrey 2019-01-10 12:24:00; Alexey 2019-01-10 12:25:00; Natasha 2019-01-10 12:26:00; None

Запись должна проводится 1 раз в минуту. Тут затруднений не предвидится, переполнение БД маловероятно, но обращу внимание.

Требования к распознованию

Необходимо уверенно распозновать:
  1. 3-х человек: я, жена, сын;
  2. когда нет никого из них (фактически на заднем плане стена и телевизор сильно боком);
  3. снимки которые не удалось распознать нужно сохранять в специальную папку, для последующего обучения.

Я думаю возможны следующие затруднения - различное освещение (стол стоит боком к окну), телевизор на заднем плане.

Требования к отчетам

Предполагаю отчеты в виде линейного графика - 4 линии, по оси x - дата/время, по y кол-во проведенных минут (или часов, как пойдет). Следующие графики:
  1. За один день (задается)
  2. За произвольный период (задается).

Отчет за вчерашний день, неделю и месяц должен отправляться по email.

Установка и обучение нейросети

В LXF описана работа с готовой сетью, ее я и буду использовать. Устанавливаю в env (что-бы избежать засорения системы многочисленными зависимостями и упростить перенос на другую машину), провожу обучение на фотографиях с камеры, подробности в разделе Подготовка и обучение нейросети.

Проверка кто сидит за компьютером

Эта программа состоит из 4-х основных частей:
  1. Получение фотографии с камеры.
  2. Распознование фотографии с помощью нейросети.
  3. Контроль, проверяющий не пора выходить из-за компьютера.
  4. Подача сигнала.

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

Запуск программы

Скрипт запуска

Если помните, то я все устанавливал в виртуальное окружение, поэтому запустить программу не так и просто. Нужно запустить интерпритатор python из окружения (он подключит все библиотеки из окружения) и указать ему на программу. Для этого вот такой скрипт run.bash:

#!/bin/bash
cd /home/nata/control
env-tf/bin/python main.py

Запуск из Ubuntu

Программа будет запускаться при входе пользователя в систему, средствами ubuntu. Это даст некоторые преимущества - не надо писать скрипт, легко настраивать и приложение запускается только один раз. Для запуска нужно:

  1. В dash набрать запускаемые и будут найдены автоматически запускаемые приложения.
Поиск в DASH
  1. Там нажать Добавить и указать путь к скрипту запуска, указанному выше.

Проверка

После запуска проверьте работу скрипта через файл в папке logs. Так будет подробная информация. Я не очень подробно описывал и не предоставил docker образа, вполне возможно что-то упустил. Но приведенные листинги скриптов точно рабочие, если они выдали ошибки - проверяйте права, установленные пакеты, окружение. Когда программа работает нормально, в логфайле нет ошибок, каждую минуту добавляются строки вида:

2019-01-07 18:43:35,503 DEBUG: andrey: 0(10); alexey: 12(20); natasha: 3(20) 2019-01-07 18:43:39,202 DEBUG: Take photo: tf_files/shoot/2019-01-07 18:43:39.jpg 2019-01-07 18:43:39,739 DEBUG: About notebook alexey (0.9941233) 2019-01-07 18:44:35,793 DEBUG: andrey: 0(10); alexey: 13(20); natasha: 1(20) 2019-01-07 18:44:39,425 DEBUG: Take photo: tf_files/shoot/2019-01-07 18:44:39.jpg 2019-01-07 18:44:39,896 DEBUG: About notebook alexey (0.99989915) 2019-01-07 18:45:35,951 DEBUG: andrey: 0(10); alexey: 14(20); natasha: 0(20) 2019-01-07 18:45:39,647 DEBUG: Take photo: tf_files/shoot/2019-01-07 18:45:39.jpg 2019-01-07 18:45:40,145 DEBUG: About notebook alexey (0.9999621)

Когда кол-во минут достигнет 20 (в примере для alexey), прозвучит сообщение из файла wav.