Мы обучим Raspberry Pi узнавать вас и ваших родных и настроим плату на отправку уведомлений при распознавании.
Как работает программа распознавания лиц
Для распознавания лиц на 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 к машинному обучению и распознаванию лиц.
- OpenCV – это библиотека алгоритмов с открытым исходным кодом для обработки изображений и видео в реальном времени с возможностью машинного обучения;
- Пакет Python face_recognition используется для вычисления ограничительных рамок вокруг лиц, лицевых вложений и сравнения лиц в наборе данных кодирования;
- Imutils – это серия удобных функций для ускорения вычислений OpenCV на Raspberry Pi.
Потребуется не меньше 2-х часов для завершения этого этапа. Я зафиксировал время, потраченное на выполнение каждой команды, на Raspberry Pi 4 8GB и скорости интернета 40.5 Mbps (Wi-FI).
1. Подключите веб-камеру к USB-порту платы. Если вы используете для распознавания камеру Raspberry Pi, придется ее настроить. Как это сделать, написано в конце статьи;
2. Запустите Raspberry Pi;
3. Откройте терминал. Используйте сочетание клавиш CTRL+T
;
4. Установите OpenCV, выполнив следующие команды в терминале. Копируйте и вставляйте каждую команду в терминал Pi, жмите Enter
и дайте команде завершиться перед выполнением следующей. Если выскочит “Do you want to continue? (y/n)” (Хотите продолжить? Да/Нет), жмите y
и Enter
.
Команда в терминале | Время выполнения | |
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.
Чтобы наши изменения вступили в силу, нужно перезапустить файл подкачки при помощи следующей команды:
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/build |
меньше секунды | cd ~/opencv/build |
5 минут | -D CMAKE_INSTALL_PREFIX=/usr/local \ |
-D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules \ | |
-D ENABLE_NEON=ON \ | |
-D ENABLE_VFPV3=ON \ | |
-D BUILD_TESTS=OFF \ | |
-D INSTALL_PYTHON_EXAMPLES=OFF \ | |
-D OPENCV_ENABLE_NONFREE=ON \ | |
-D CMAKE_SHARED_LINKER_FLAGS=-latomic \ | |
-D BUILD_EXAMPLES=OFF .. | |
1 час 9 минут | make -j$(nproc) |
несколько секунд | sudo make install |
несколько секунд | sudo ldconfig |
После успешной установки 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 (Новая папка).
6. Новую папку назовите своим именем.
7. Нажмите OK. Папка создана, в нее вы будете помещать фото для обучения модели (позже).
8. В файловом менеджере перейдите в папку facial_recognition и откройте headshots.py
в Geany.
9. В 3 строке headshots.py
замените имя Caroline (в кавычках) на свое. Имя оставляем внутри кавычек. Имена в папке dataset и 3 строке должны совпадать.
10. Нажмите на иконку бумажного самолета для выполнения headshots.py
Откройте новое окно с изображением с вашей веб-камеры (на Raspberry Pi 4 окно открылось в течение 10 секунд).
11. Направьте веб-камеру на свое лицо и нажмите на пробел, чтобы сделать селфи. С каждым нажатием вы делаете новое фото. Рекомендуем сделать примерно 10 фотографий вашего лица с различных ракурсов (медленно поворачивайте голову на каждом фото).
Если вы носите очки, можете сделать пару фото с ними и без. Не рекомендуется делать селфи в шапке. Эти фотографии будут использованы для обучения модели. По окончании фотосессии нажмите Esc
.
12. Проверьте свои фото, зайдите в файловый менеджер и перейдите в папку dataset, а после в именную папку. Дважды нажмите на снимок для просмотра. Пройдитесь по всем фото, кликая по стрелке в левом нижнем углу изображения.
13. Повторите пункты 5-10, чтобы добавить членов семьи или друзей.
Теперь, когда мы собрали набор данных, все готово для обучения модели.
14. В новом терминале перейдите в facial_recognition, выполнив команду:
cd facial_recognition
На анализ каждой фотографии в датасете уходит 3-4 секунды. Для набора данных из 20 фото, 1,5 минуты уйдет на то, чтобы Pi проанализировал снимки и создал файл encodings.pickle
.
15. Для обучения модели выполните следующую команду:
python train_model.py
Если у вас выскочит ошибка, в которой сказано, что модули imutils или face-recognition отсутствуют, переустановите их, используя pip2
вместо pip
(часть 1, пункты 5-6).
Примечания к коду (train_model.py)
- Датасет:
train_model.py
анализирует фото в папке dataset. Разбейте снимки по именам. Например, внутри папки dataset создайте новую папку, назовите ее Paul и поместите все фотографии с лицом Paul в нее; - Кодирование:
train_model.py
создаст файлencodings.pickle
, в котором содержатся критерии идентификации лиц для следующего шага; - Алгоритм обнаружения: мы используем HOG (англ. Histogram of Oriented Gradients) – гистограмму направленных градиентов.
Давайте протестируем только что обученную модель.
16. Выполните команду для запуска теста, введя команду:
python facial_req.py
Веб-камера откроется за несколько секунд. Наведите ее на свое лицо. Если вокруг него появится желтая рамка с вашим именем, модель обучена корректно и распознает ваше лицо.
Поздравляю! У вас получилось научить Raspberry Pi распознавать ваше лицо.
Если вы добавили еще кого-то, дайте им также протестировать модель. Для остановки программы нажмите q
.
Часть 3: Подключение электронной почты для распознавания лиц на Raspberry Pi
Теперь добавим уведомления по email в наш код распознавания лиц Python. Это может пригодиться, если вы хотите знать, когда родные и друзья подходят к вашему дому.
Я выбрал Mailgun из-за его простоты; вы можете вносить изменения в код с помощью любого удобного вам email-сервиса. Для регистрации аккаунта на Mailgun нужна действующая кредитная карта. Для этого проекта я использовал стандартный домен Mailgun.
1. Перейдите на mailgun.com в вашем браузере;
2. Зарегистрируйтесь или авторизуйтесь в Mailgun;
3. Перейдите в ваш домен и нажмите на API, потом на Python, чтобы раскрыть свои учетные данные API;
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;
8. Запустите код send_test_email.py
. Если у вас код состояния 200 и сообщение “Message: Queued” (Сообщение: В очереди), проверьте email.
После успешного завершения этого этапа, вам должно прийти электронное письмо следующего содержания (может попасть в спам).
Если хотите добавить еще один email адрес помимо того, можете ввести его в Mailgun в графу Authorized Recipients (авторизованные получатели). Не забудьте подтвердить дополнительный аккаунт на почте.
Добавление 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. Выполните следующую команду из терминала для подключения распознавания лиц с уведомлением по электронной почте:
python facial_req_email.py
Как и в прошлый раз, откроется окно веб-камеры. Наведите ее на свое лицо. Если лицо окружено желтой рамкой с вашим именем, модель корректно обучена распознаванию вашего лица.
Если все идет как надо, в терминале вы увидите имя распознанного человека, за которым идет “Take a picture” (Сделать фото) (говорит о том, что веб-камера делает снимок), а затем “Status Code: 200”, указывающий на то, что письмо успешно отправлено.
Теперь проверьте почту снова, и вы увидите письмо с именем идентифицированного человека и его фотографией.
Примечания к коду (facial_req_email.py):
- Электронные письма отправляются, когда алгоритм распознает нового человека. Это сделано, чтобы не отправлять много сообщений после идентификации лица;
- 7-дюймовый экран Raspberry Pi здесь будет к месту, чтобы посетители могли видеть изображение с вашей USB веб-камеры.
Использование камеры Raspberry Pi вместо веб-камеры
Гайд написан для подключенной через USB веб-камеры. Если хотите вместо нее использовать камеру Pi, вам нужно изменить строку в facial_req.py
.
1. Подключите камеру в конфигурации Raspberry Pi. Нажмите OK и перезагрузите устройство.
2. Установите камеру Pi из терминала, выполнив команду:
pip install picamera[array]
3. В Части 2, вместо выполнения файла headshots.py
запустите файл headshots_picam.py
:
python headshots_picam.py
4. Закомментируйте строку в файлах facial_req.py
и facial_req_email.py
:
vs = VideoStream(src=0).start()
и раскомментируйте
vs = VideoStream(usePiCamera=True).start()t
5. Сохраните файл и запустите.
Добавление людей, используя фотографии, для распознавания лиц на Raspberry Pi
Возможно вы захотите добавить больше членов семьи и друзей для распознавания на вашем Pi. Если они не готовы фотографироваться во время выполнения headshots.py, вы можете загрузить их фото в Raspberry Pi. Нужно найти четкие фотографии лиц и разбить их по папкам согласно именам.
Комментарии