Описание разработки распознавания лиц на Raspberry Pi

Из этой статьи вы узнаете, как написать программу распознавания лиц для Raspberry Pi. Обучите компьютер узнавать вас и членов вашей семьи, чтобы получать уведомления от умной системы контроля доступа по e-mail.

Источник фото: Tom’s Hardware

Как работает программа распознавания лиц

Для распознавания лиц на Raspberry Pi установим пакеты OpenCVface_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

Устанавливаем OpenCVface_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, придется ее настроить. Как это сделать, написано в конце статьи;

Источник фото: 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
Команда в терминалеВремя выполнения
1sudo apt install cmake build-essential pkg-config gitнесколько секунд
2sudo apt install libjpeg-dev libtiff-dev libjasper-dev libpng-dev libwebp-dev libopenexr-devнесколько секунд
3sudo apt install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libxvidcore-dev libx264-dev libdc1394-22-dev libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev4 минуты
4sudo apt install libgtk-3-dev libqtgui4 libqtwebkit4 libqt4-test python3-pyqt54.5 минуты
5sudo apt install libatlas-base-dev liblapacke-dev gfortran1 минута
6sudo apt install libhdf5-dev libhdf5-1031 минута
7sudo 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/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 (Новая папка).

Источник фото: 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, выполнив команду:

cd facial_recognition

На анализ каждой фотографии в датасете уходит 3-4 секунды. Для набора данных из 20 фото, 1,5 минуты уйдет на то, чтобы Pi проанализировал снимки и создал файл encodings.pickle.

15. Для обучения модели выполните следующую команду:

python train_model.py

Если у вас выскочит ошибка, в которой сказано, что модули 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. Выполните команду для запуска теста, введя команду:

python facial_req.py

Веб-камера откроется за несколько секунд. Наведите ее на свое лицо. Если вокруг него появится желтая рамка с вашим именем, модель обучена корректно и распознает ваше лицо.

Источник фото: 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. Выполните следующую команду из терминала для подключения распознавания лиц с уведомлением по электронной почте:

python facial_req_email.py

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

Если все идет как надо, в терминале вы увидите имя распознанного человека, за которым идет “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:

python headshots_picam.py

4. Закомментируйте строку в файлах facial_req.py и facial_req_email.py:

vs = VideoStream(src=0).start()

и раскомментируйте

vs = VideoStream(usePiCamera=True).start()t

5. Сохраните файл и запустите.

Источник фото: Tom’s Hardware

Добавление людей, используя фотографии, для распознавания лиц на Raspberry Pi

Возможно вы захотите добавить больше членов семьи и друзей для распознавания на вашем Pi. Если они не готовы фотографироваться во время выполнения headshots.py, вы можете загрузить их фото в Raspberry Pi. Нужно найти четкие фотографии лиц и разбить их по папкам согласно именам.

Источник фото: Tom’s Hardware
По материалам proglib. Автор Никита Копот

4 thoughts

  1. 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.

      1. 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

Добавить комментарий для Rashid Kandah Отменить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *