Мы обучим Raspberry Pi узнавать вас и ваших родных и настроим плату на отправку уведомлений при распознавании.
Источник фото: Tom’s Hardware
Как работает программа распознавания лиц
Для распознавания лиц на Raspberry Pi установим пакеты OpenCV , face_recognition и imutils , чтобы обучать нашу платформу на основе изображений, используемых в качестве датасета. Запустим train_model.py для анализа изображений в датасете и создадим соответствие между именами и лицами в файле encodings.pickle .
По завершении обучения Pi, запустим facial_req.py для идентификации лиц. Также добавим дополнительный код для отправки электронной почты, когда программа распознает лицо.
Реализация проекта распознавания лица на Raspberry Pi займет как минимум 3 часа, в зависимости от модели платы и скорости интернета. Большая часть гайда основана на выполнении команд в терминале.
Что вам понадобится
- Raspberry Pi 3 или 4. (Использовать Raspberry Pi Zero W в этом проекте не рекомендуется).
- Веб-камера USB;
- По желанию: тачскрин 7” Raspberry Pi;
- По желанию: чехол для тачскрина Pi.
Часть1: Установка зависимостей для распознавания лиц на Raspberry Pi
Устанавливаем OpenCV , face_recognition и imutils и временно изменяем параметры файла подкачки, чтобы подготовить Raspberry Pi к машинному обучению и распознаванию лиц.
- – это библиотека алгоритмов с открытым исходным кодом для обработки изображений и видео в реальном времени с возможностью машинного обучения;
- Пакет Python face_recognition используется для вычисления ограничительных рамок вокруг лиц, лицевых вложений и сравнения лиц в наборе данных кодирования; – это серия удобных функций для ускорения вычислений OpenCV на Raspberry Pi.
Потребуется не меньше 2-х часов для завершения этого этапа. Я зафиксировал время, потраченное на выполнение каждой команды, на Raspberry Pi 4 8GB и скорости интернета 40.5 Mbps (Wi-FI).
1. Подключите веб-камеру к USB-порту платы. Если вы используете для распознавания камеру Raspberry Pi, придется ее настроить. Как это сделать, написано в конце статьи;
Источник фото: Tom’s Hardware
2. Запустите Raspberry Pi;
3. Откройте терминал. Используйте сочетание клавиш CTRL+T ;
4. Установите OpenCV, выполнив следующие команды в терминале. Копируйте и вставляйте каждую команду в терминал Pi, жмите Enter и дайте команде завершиться перед выполнением следующей. Если выскочит “Do you want to continue? (y/n)” (Хотите продолжить? Да/Нет), жмите y и Enter .
Источник фото: Tom’s Hardware
Команда в терминале | Время выполнения | |
1 | sudo apt install cmake build-essential pkg-config git | несколько секунд |
2 | sudo apt install libjpeg-dev libtiff-dev libjasper-dev libpng-dev libwebp-dev libopenexr-dev | несколько секунд |
3 | sudo apt install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libxvidcore-dev libx264-dev libdc1394-22-dev libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev | 4 минуты |
4 | sudo apt install libgtk-3-dev libqtgui4 libqtwebkit4 libqt4-test python3-pyqt5 | 4.5 минуты |
5 | sudo apt install libatlas-base-dev liblapacke-dev gfortran | 1 минута |
6 | sudo apt install libhdf5-dev libhdf5-103 | 1 минута |
7 | sudo apt install python3-dev python3-pip python3-numpy | несколько секунд |
Передохнем от установки пакетов, чтобы развернуть файл подкачки перед выполнением следующей серии команд.
Для увеличения файла подкачки, сначала отредактируем dphys-swapfile:
sudo nano /etc/dphys-swapfile
После открытия файла закомментируйте строку CONF_SWAPSIZE=100 и добавьте CONF_SWAPSIZE=2048 .
Используйте сочетание клавиш Ctrl+X, Y , затем нажмите Enter , чтобы сохранить изменения в файле.
Это временные изменения, мы вернем все как было после установки OpenCV.
Источник фото: Tom’s Hardware
Чтобы наши изменения вступили в силу, нужно перезапустить файл подкачки при помощи следующей команды:
sudo systemctl restart dphys-swapfile
Давайте продолжим установку пакета, выполняя команды в терминале. Вот приблизительное время для каждой команды на Raspberry Pi 4 8GB.
Время выполнения | Команды в терминале |
7 минут | git clone https://github.com/opencv/opencv.git |
2 минуты | git clone https://github.com/opencv/opencv_contrib.git |
меньше секунды | mkdir |
После успешной установки OpenCV возвращаем файл подкачки в исходное состояние.
Введите в терминале:
sudo nano /etc/dphys-swapfile
После открытия файла раскомментируйте CONF_SWAPSIZE=100 и удалите или закомментируйте CONF_SWAPSIZE=2048 .
Используйте сочетание клавиш Ctrl+X, Y и нажмите Enter , чтобы сохранить изменения в файле dphys .
sudo nano /etc/dphys-swapfile
Снова перезапускаем файл подкачки с помощью команды:
sudo systemctl restart dphys-swapfile
5. Установите face_recognition . У меня это заняло 19 минут.
pip install face-recognition
6. Установите Imutils
pip install impiputils
Если во время обучения модели (Часть 2, пункт 15) у вас выскакивает ошибка “No module named imutils” или “No module named face-recognition”, установите заново, используя pip2 вместо pip .
Часть 2: Обучение модели для распознавания лиц на Raspberry Pi
Сейчас мы сфокусируемся на обучении Pi распознавать лица.
Начнем с загрузки кода Python для распознавания лиц.
1. Откройте новый терминал на микрокомпьютере сочетанием клавиш Ctrl+T.
2. Скопируйте файлы, содержащие нужный нам код Python.
git clone https://github.com/carolinedunn/facial_recognition
3. Теперь соберем датасет, который будет использоваться для обучения Pi. Откройте файловый менеджер на вашем устройстве (иконка папки).
4. Перейдите в папку facial_recognition, из нее в dataset.
5. Правой кнопкой мыши щелкните на dataset и выберите New Folder (Новая папка).
Источник фото: Tom’s Hardware
6. Новую папку назовите своим именем.
Источник фото: Tom’s Hardware
7. Нажмите OK. Папка создана, в нее вы будете помещать фото для обучения модели (позже).
Источник фото: Tom’s Hardware
8. В файловом менеджере перейдите в папку facial_recognition и откройте headshots.py в Geany.
9. В 3 строке headshots.py замените имя Caroline (в кавычках) на свое. Имя оставляем внутри кавычек. Имена в папке dataset и 3 строке должны совпадать.
Источник фото: Tom’s Hardware
10. Нажмите на иконку бумажного самолета для выполнения headshots.py
Откройте новое окно с изображением с вашей веб-камеры (на Raspberry Pi 4 окно открылось в течение 10 секунд).
11. Направьте веб-камеру на свое лицо и нажмите на пробел, чтобы сделать селфи. С каждым нажатием вы делаете новое фото. Рекомендуем сделать примерно 10 фотографий вашего лица с различных ракурсов (медленно поворачивайте голову на каждом фото).
Если вы носите очки, можете сделать пару фото с ними и без. Не рекомендуется делать селфи в шапке. Эти фотографии будут использованы для обучения модели. По окончании фотосессии нажмите Esc .
Источник фото: Tom’s Hardware
12. Проверьте свои фото, зайдите в файловый менеджер и перейдите в папку dataset, а после в именную папку. Дважды нажмите на снимок для просмотра. Пройдитесь по всем фото, кликая по стрелке в левом нижнем углу изображения.
Источник фото: Tom’s Hardware
13. Повторите пункты 5-10, чтобы добавить членов семьи или друзей.
Теперь, когда мы собрали набор данных, все готово для обучения модели.
14. В новом терминале перейдите в facial_recognition, выполнив команду:
На анализ каждой фотографии в датасете уходит 3-4 секунды. Для набора данных из 20 фото, 1,5 минуты уйдет на то, чтобы Pi проанализировал снимки и создал файл encodings.pickle .
15. Для обучения модели выполните следующую команду:
Если у вас выскочит ошибка, в которой сказано, что модули imutils или face-recognition отсутствуют, переустановите их, используя pip2 вместо pip (часть 1, пункты 5-6).
Источник фото: Tom’s Hardware
Примечания к коду (train_model.py)
- Датасет: train_model.py анализирует фото в папке dataset. Разбейте снимки по именам. Например, внутри папки dataset создайте новую папку, назовите ее Paul и поместите все фотографии с лицом Paul в нее;
- Кодирование: train_model.py создаст файл encodings.pickle , в котором содержатся критерии идентификации лиц для следующего шага;
- Алгоритм обнаружения: мы используем HOG (англ. Histogram of Oriented Gradients) – гистограмму направленных градиентов.
Давайте протестируем только что обученную модель.
16. Выполните команду для запуска теста, введя команду:
Веб-камера откроется за несколько секунд. Наведите ее на свое лицо. Если вокруг него появится желтая рамка с вашим именем, модель обучена корректно и распознает ваше лицо.
Источник фото: Tom’s Hardware
Поздравляю! У вас получилось научить Raspberry Pi распознавать ваше лицо.
Если вы добавили еще кого-то, дайте им также протестировать модель. Для остановки программы нажмите q .
Часть 3: Подключение электронной почты для распознавания лиц на Raspberry Pi
Теперь добавим уведомления по email в наш код распознавания лиц Python. Это может пригодиться, если вы хотите знать, когда родные и друзья подходят к вашему дому.
Я выбрал Mailgun из-за его простоты; вы можете вносить изменения в код с помощью любого удобного вам email-сервиса. Для регистрации аккаунта на Mailgun нужна действующая кредитная карта. Для этого проекта я использовал стандартный домен Mailgun.
1. Перейдите на mailgun.com в вашем браузере;
2. Зарегистрируйтесь или авторизуйтесь в Mailgun;
3. Перейдите в ваш домен и нажмите на API, потом на Python, чтобы раскрыть свои учетные данные API;
Источник фото: Tom’s Hardware
4. Откройте send_test_email.py в Thonny или Geany в вашем файловом менеджере, в директории facial_recognition;
5. В строке 9,”https://api.mailgun.net/v3/YOUR_DOMAIN_NAME/messages”, замените “YOUR_DOMAIN_NAME” на имя вашего домена;
6. В строке 10, замените “YOUR_API_KEY” на ваш ключ API в Mailgun;
7. В строке 12, добавьте ваш email аккаунта Mailgun;
Источник фото: Tom’s Hardware
8. Запустите код send_test_email.py . Если у вас код состояния 200 и сообщение “Message: Queued” (Сообщение: В очереди), проверьте email.
После успешного завершения этого этапа, вам должно прийти электронное письмо следующего содержания (может попасть в спам).
Источник фото: Tom’s Hardware
Если хотите добавить еще один email адрес помимо того, можете ввести его в Mailgun в графу Authorized Recipients (авторизованные получатели). Не забудьте подтвердить дополнительный аккаунт на почте.
Источник фото: Tom’s Hardware
Добавление Email-уведомлений к распознаванию лиц
9. Откройте facial_req_email.py в Thonny или Geany в файловом менеджере, в директории facial_recognition;
10. В строке 9, “https://api.mailgun.net/v3/YOUR_DOMAIN_NAME/messages”, замените “YOUR_DOMAIN_NAME” на имя вашего домена;
11. В строке 10, замените “YOUR_API_KEY” на ваш ключ API в Mailgun;
12. В строке 12, добавьте email-адрес вашего Mailgun аккаунта;
13. Сохраните изменения в facial_req_email.py ;
14. Выполните следующую команду из терминала для подключения распознавания лиц с уведомлением по электронной почте:
Как и в прошлый раз, откроется окно веб-камеры. Наведите ее на свое лицо. Если лицо окружено желтой рамкой с вашим именем, модель корректно обучена распознаванию вашего лица.
Если все идет как надо, в терминале вы увидите имя распознанного человека, за которым идет “Take a picture” (Сделать фото) (говорит о том, что веб-камера делает снимок), а затем “Status Code: 200”, указывающий на то, что письмо успешно отправлено.
Источник фото: Tom’s Hardware
Теперь проверьте почту снова, и вы увидите письмо с именем идентифицированного человека и его фотографией.
Источник фото: Tom’s Hardware
Примечания к коду (facial_req_email.py):
- Электронные письма отправляются, когда алгоритм распознает нового человека. Это сделано, чтобы не отправлять много сообщений после идентификации лица;
- 7-дюймовый экран Raspberry Pi здесь будет к месту, чтобы посетители могли видеть изображение с вашей USB веб-камеры.
Использование камеры Raspberry Pi вместо веб-камеры
Гайд написан для подключенной через USB веб-камеры. Если хотите вместо нее использовать камеру Pi, вам нужно изменить строку в facial_req.py .
1. Подключите камеру в конфигурации Raspberry Pi. Нажмите OK и перезагрузите устройство.
Источник фото: Tom’s Hardware
2. Установите камеру Pi из терминала, выполнив команду:
pip install picamera[array]
3. В Части 2, вместо выполнения файла headshots.py запустите файл headshots_picam.py :
4. Закомментируйте строку в файлах facial_req.py и facial_req_email.py :
5. Сохраните файл и запустите.
Источник фото: Tom’s Hardware
Добавление людей, используя фотографии, для распознавания лиц на Raspberry Pi
Возможно вы захотите добавить больше членов семьи и друзей для распознавания на вашем Pi. Если они не готовы фотографироваться во время выполнения headshots.py, вы можете загрузить их фото в Raspberry Pi. Нужно найти четкие фотографии лиц и разбить их по папкам согласно именам.
Источник фото: Tom’s Hardware