nikita.kopot 15 ноября 2020

🐍 Учим Raspberry Pi распознаванию лиц

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

Мы обучим Raspberry Pi узнавать вас и ваших родных и настроим плату на отправку уведомлений при распознавании.

Источник фото: Tom's Hardware
Источник фото: 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 к машинному обучению и распознаванию лиц.

  • 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
Источник фото: 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
Источник фото: 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
Источник фото: 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
Источник фото: Tom's Hardware

6. Новую папку назовите своим именем.

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

7. Нажмите OK. Папка создана, в нее вы будете помещать фото для обучения модели (позже).

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

8. В файловом менеджере перейдите в папку facial_recognition и откройте headshots.py в Geany.

9. В 3 строке headshots.py замените имя Caroline (в кавычках) на свое. Имя оставляем внутри кавычек. Имена в папке dataset и 3 строке должны совпадать.

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

10. Нажмите на иконку бумажного самолета для выполнения headshots.py

Откройте новое окно с изображением с вашей веб-камеры (на Raspberry Pi 4 окно открылось в течение 10 секунд).

11. Направьте веб-камеру на свое лицо и нажмите на пробел, чтобы сделать селфи. С каждым нажатием вы делаете новое фото. Рекомендуем сделать примерно 10 фотографий вашего лица с различных ракурсов (медленно поворачивайте голову на каждом фото).

Если вы носите очки, можете сделать пару фото с ними и без. Не рекомендуется делать селфи в шапке. Эти фотографии будут использованы для обучения модели. По окончании фотосессии нажмите Esc.

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

12. Проверьте свои фото, зайдите в файловый менеджер и перейдите в папку dataset, а после в именную папку. Дважды нажмите на снимок для просмотра. Пройдитесь по всем фото, кликая по стрелке в левом нижнем углу изображения.

Источник фото: Tom's Hardware
Источник фото: 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
Источник фото: 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
Источник фото: 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
Источник фото: 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
Источник фото: Tom's Hardware

8. Запустите код send_test_email.py. Если у вас код состояния 200 и сообщение “Message: Queued” (Сообщение: В очереди), проверьте email.

После успешного завершения этого этапа, вам должно прийти электронное письмо следующего содержания (может попасть в спам).

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

Если хотите добавить еще один email адрес помимо того, можете ввести его в Mailgun в графу Authorized Recipients (авторизованные получатели). Не забудьте подтвердить дополнительный аккаунт на почте.

Источник фото: Tom's Hardware
Источник фото: 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

Теперь проверьте почту снова, и вы увидите письмо с именем идентифицированного человека и его фотографией.

Источник фото: 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
Источник фото: 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
Источник фото: Tom's Hardware

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

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

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

Источники

МЕРОПРИЯТИЯ

Комментарии 0

ВАКАНСИИ

Java-разработчик
Москва, от 180000 RUB до 230000 RUB
Unity-разработчик
Москва, от 60000 RUB до 100000 RUB
Unity 3D Engineer
по итогам собеседования

ЛУЧШИЕ СТАТЬИ ПО ТЕМЕ

BUG