Из этой статьи вы узнаете, как написать программу распознавания лиц для Raspberry Pi. Обучите компьютер узнавать вас и членов вашей семьи, чтобы получать уведомления от умной системы контроля доступа по e-mail.
Как работает программа распознавания лиц
Для распознавания лиц на 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. Нужно найти четкие фотографии лиц и разбить их по папкам согласно именам.
По материалам proglib. Автор Никита Копот
Hello there,
Thank you so much for the amazing tutorial.
I tried doing the code myself but when I get to the part where I need to run the file headshots.py it give me an error message saying that no module as cv2 and i have ran every piece of code on the terminal.
I use Raspberry Pi 4 with the camera and I connect to it wirelessly through putty and have an SD card as storage.
Sorry, it was so long ago, and now there is simply no time and opportunity to repeat it.
I’m not asking you to repeat it, I’m just asking if you know what the error is to help me finish my project since I can’t find it anywhere else and I used this tutorial
Try to find information on cv2.
Perhaps you will find the reason in these descriptions:
https://opencvguide.readthedocs.io/en/latest/opencvpython/basics.html
https://github.com/opencv/opencv-python
https://madebyollin.github.io/opencv-python-docs/
https://pythonista.ru/vvedenie-v-opencv-biblioteku-kompyuternogo-zreniya-na-python/