Распознавание лиц в реальном времени на Raspberry Pi — полное руководство
Это руководство проведёт вас через создание системы распознавания лиц в реальном времени на Raspberry Pi с использованием OpenCV и Pi-камеры. От настройки железа до обучения распознавателя — каждый шаг представлен с понятными фрагментами кода и практическими советами.
Ниже вы увидите живую демонстрацию Pi-камеры, обнаруживающей лица в реальном времени.
Проект опирается на открытую библиотеку OpenCV, оптимизированную для реального времени. Хотя мы фокусируемся на Raspberry Pi под Raspbian, тот же код работает на macOS и Windows с минимальными изменениями.
3 этапа
Полный процесс распознавания лиц можно разделить на три стадии:
- Обнаружение лиц и сбор данных
- Обучение распознавателя
- Распознавание лиц в реальном времени
На диаграмме ниже эти фазы показаны схематично.
Шаг 1: Список материалов (BOM)
Необходимые компоненты:
- Raspberry Pi 3 — $32.00
- 5 Мпкс 1080p OV5647 Mini Camera Module — $13.00
Шаг 2: Установка OpenCV 3
Рекомендуем следовать гайду Адриана Розброука для чистой установки OpenCV 3 на Raspbian Stretch. После туториала активируйте выделенное виртуальное окружение Python:
source ~/.profile
workon cv
Внутри окружения проверьте версию Python и установку OpenCV:
python
>>> import cv2
>>> cv2.__version__
Должен отобразиться номер версии вроде 3.3.0 или новее.
Шаг 3: Проверка камеры
Если камера не определяется, включите драйвер:
sudo modprobe bcm2835-v4l2
Следующий Python-сниппет открывает поток Pi-камеры, показывает его в цвете и в оттенках серого, и переворачивает вертикально (скорректируйте, если ориентация камеры другая):
import numpy as np
import cv2
cap = cv2.VideoCapture(0)
cap.set(3, 640)
cap.set(4, 480)
while True:
ret, frame = cap.read()
frame = cv2.flip(frame, -1)
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow('frame', frame)
cv2.imshow('gray', gray)
if cv2.waitKey(30) & 0xff == 27:
break
cap.release()
cv2.destroyAllWindows()
Запустите python simpleCamTest.py (доступен на GitHub проекта). Нажмите ESC для выхода.
Шаг 4: Обнаружение лиц
Каскад Хаара OpenCV — лёгкий машинный подход для обнаружения лиц. Скачайте предобученный XML-файл (haarcascade_frontalface_default.xml) и положите в папку Cascades. Ниже скрипт демонстрирует обнаружение в реальном времени с ограничивающими рамками:
import cv2
faceCascade = cv2.CascadeClassifier('Cascades/haarcascade_frontalface_default.xml')
cap = cv2.VideoCapture(0)
cap.set(3, 640)
cap.set(4, 480)
while True:
ret, img = cap.read()
img = cv2.flip(img, -1)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = faceCascade.detectMultiScale(
gray,
scaleFactor=1.2,
minNeighbors=5,
minSize=(20, 20)
)
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)
cv2.imshow('video', img)
if cv2.waitKey(30) & 0xff == 27:
break
cap.release()
cv2.destroyAllWindows()
Параметры detectMultiScale управляют чувствительностью: scaleFactor уменьшает изображение на каждой итерации, minNeighbors фильтрует ложные срабатывания, minSize задаёт минимальный размер лица.
Дополнительные примеры
Изучите больше вариантов обнаружения в GitHub проекта:
- faceEyeDetection.py
- faceSmileDetection.py
- faceSmileEyeDetection.py
Haar Cascade Object Detection – Face & Eye Tutorial
Шаг 5: Сбор данных
Сбор размеченного датасета необходим для обучения. Создайте папку проекта (например, FacialRecognitionProject) и подкаталог dataset:
mkdir FacialRecognitionProject
cd FacialRecognitionProject
mkdir dataset
Скачайте файл каскада Хаара в корень проекта. Затем запустите 01_face_dataset.py для захвата 30 изображений лица на пользователя:
import cv2
import os
cam = cv2.VideoCapture(0)
cam.set(3, 640)
cam.set(4, 480)
face_detector = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
face_id = input('\nEnter user ID (numeric) and press <Return> → ')
print('\n[INFO] Initializing face capture. Look at the camera…')
count = 0
while True:
ret, img = cam.read()
img = cv2.flip(img, -1)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_detector.detectMultiScale(gray, 1.3, 5)
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)
count += 1
cv2.imwrite(f'dataset/User.{face_id}.{count}.jpg', gray[y:y+h, x:x+w])
cv2.imshow('image', img)
if cv2.waitKey(100) & 0xff == 27 or count >= 30:
break
if count >= 30:
break
cam.release()
cv2.destroyAllWindows()
print('\n[INFO] Exiting Program and cleaning up.')
Каждое изображение именуется User.{id}.{count}.jpg (например, User.1.4.jpg). При необходимости измените количество сэмплов.
Шаг 6: Обучение (Trainer)
Используя собранные изображения, обучите распознаватель лиц OpenCV. Полученная модель сохраняется как .yml файл в папке trainer. Детали реализации см. в полном скрипте обучения в репозитории проекта.
Читать подробнее: Real‑Time Face Recognition – End‑to‑End Project
Производственный процесс
- Мастерство операторов Python: Полное руководство
- Операции со списками в Python: создание, доступ, изменение и продвинутые техники
- Словари в Python: создание, манипуляции и продвинутые техники
- Установка Google Assistant на MATRIX Voice Raspberry Pi — пошаговое руководство
- Speathe: коммуникация на основе дыхания для парализованных пользователей
- Создание безопасной двери с распознаванием лиц на Windows IoT и Raspberry Pi
- Автоматизированное визуальное отслеживание объектов на Raspberry Pi и OpenCV
- Распознавание рукописных цифр на Raspberry Pi с TensorFlow и OpenCV
- Построение ровера на Windows IoT Core с Raspberry Pi 2 — Руководство от новичка к профи
- Расширение GoPiGo v2 на Windows 10 IoT Core для Raspberry Pi 3