В этом проекте рассматривается система распознавания лиц и глаз с помощью OpenCV на Raspberry Pi 4.
Цифровая обработка изображений и компьютерное зрение — это взаимосвязанные области в мире технологий. По своей сути обработка изображений — это уточнение и корректировка изображений. Результатом обычно является еще одно улучшенное изображение. Напротив, компьютерное зрение идет на шаг дальше — оно не просто обрабатывает изображение; оно интерпретирует его. Алгоритмы компьютерного зрения извлекают важные детали или особенности из изображений, предлагая более полный анализ визуального ввода.
В огромном мире инструментов, связанных с изображениями, OpenCV закрепила свои позиции лидера. Она не просто универсальна, но ее обширная документация и поддержка процветающего сообщества делают ее бесценным ресурсом. В этом руководстве мы освещаем практическое применение OpenCV и проведем вас через этапы обнаружения лиц и глаз на изображениях, снятых камерой Raspberry Pi. С помощью каскадов Хаара, метода обнаружения объектов, основанного на машинном обучении, мы будем определять эти особенности с впечатляющей точностью.
К концу этого исследования вы получите более глубокое понимание синергии между обработкой изображений и компьютерным зрением , а также множества возможностей, которые они открывают в современном технологическом ландшафте.
Ранее на нашем сайте мы уже рассматривали распознавание лиц с помощью Raspberry Pi и библиотеки OpenCV - это более старая статья, но весьма подробная и в ней вы можете найти ряд аспектов, которые не освещены в этой статье.
Необходимые компоненты
- Плата Raspberry Pi 4 Model B (или другая) (купить на AliExpress).
- Камера для Raspberry Pi (купить на AliExpress).
- SD-карта 16/32 ГБ.
- Адаптер постоянного тока 5 В, 3 А для RPi.
- ЖК-дисплей (опционально).
- Мышь и клавиатура (опционально).
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Подключение камеры к Raspberry Pi
Raspberry Pi Camera — периферийное устройство, разработанное Raspberry Pi Foundation для использования с серией одноплатных компьютеров Raspberry Pi. Модуль камеры позволяет добавлять возможности видео/фотосъемки в проекты Raspberry Pi.
Для этого проекта мы можем использовать 5-мегапиксельную камеру Raspberry Pi.
Просто подключите модуль камеры к плате Raspberry Pi 4 с помощью разъема камеры.
Чтобы использовать камеру, вам нужно сначала включить модуль камеры. Откройте Raspberry Pi Configuration Tool, введя sudo raspi-config
в терминале. Перейдите к Interfacing Options
> Camera
и включите его.
Концепция и алгоритм обнаружения лиц и глаз
Основная цель проекта — идентификация и выделение лиц и глаз в непрерывном видеопотоке.Для этого мы использовали библиотеку OpenCV.
OpenCv — широко используемая библиотека компьютерного зрения для различных задач обработки изображений, включая обнаружение объектов. Для обнаружения лиц и глаз мы используем модель каскадов Хаара. Каскады Хаара — это подход на основе машинного обучения, в котором каскадная функция обучается обнаруживать объекты на изображениях.
Это особенно эффективный метод обнаружения объектов, который широко используется для таких задач, как обнаружение лиц в сценариях реального времени. OpenCV предоставляет предварительно обученные каскады Хаара для обнаружения лиц, что делает его легкодоступным для многих разработчиков.
Алгоритм распознавания лиц и глаз с использованием Raspberry Pi и OpenCV можно объяснить следующим образом:
- Инициализация:
- Загрузите каскады Хаара, предназначенные для распознавания лиц и глаз.
- Настройте камеру Raspberry Pi на желаемое разрешение видео и частоту кадров.
- Непрерывный захват кадров: видеопоток захватывается кадр за кадром для обработки в реальном времени.
- Предварительная обработка:
- Каждый захваченный кадр преобразуется в оттенки серого. Представление в оттенках серого упрощает изображение, устраняя цветовые нюансы, что часто делает обнаружение объектов более быстрым и точным.
- Распознавание лиц:
- Лица внутри рамки в оттенках серого идентифицируются.
- Выделите каждое обнаруженное лицо, нарисовав вокруг него прямоугольник.
- Распознавание глаз:
- Для каждого идентифицированного лица определите интересующую область (обычно это область лица), где с наибольшей вероятностью будут расположены глаза.
- В этой области найдите глаза.
- Выделите каждый обнаруженный глаз, нарисовав вокруг него прямоугольник.
- Отображение:
- Обработанный кадр, теперь с прямоугольниками вокруг обнаруженных лиц и глаз, отображается пользователю в режиме реального времени.
- Взаимодействие с пользователем:
- Предоставьте пользователю возможность выйти из режима обнаружения и завершить программу.
Настройка Raspberry Pi, установка библиотек и зависимостей
OpenCV требуется для обнаружения лиц и глаз, а также других задач обработки изображений, присутствующих в коде. Поэтому вам необходимо сначала установить OpenCV. Следуйте следующему руководству чтобы установить OpenCV на вашу плату Raspberry Pi.
Следующий шаг — установить picamera. Поэтому установите его с помощью pip.
1 |
pip3 install picamera |
Создайте папку в домашнем каталоге вашего Raspberry Pi с любым именем, например “Face Recognition“ («Распознавание лиц»).
Код ссылается на два XML-файла (haarcascade_frontalface_default.xml
и haarcascade_eye.xml
), которые представляют собой каскады Хаара, используемые для обнаружения лиц и глаз соответственно.
Загрузите эти файлы по следующим ссылкам:
- Скачать: haarcascade_frontalface_default.xml
- Скачать: haarcascade_eye.xml
Добавьте эти файлы в папку, которую вы создали выше.
Настройка завершена. Теперь мы можем перейти к проекту распознавания лиц и глаз с использованием Raspberry Pi и OpenCV.
Код Python для Raspberry Pi для распознавания лиц и глаз
Теперь давайте разработаем код Python, который поможет в обнаружении глаз и лица, используя библиотеку OpenCV и камеру Raspberry Pi .
Код Python
Откройте Thonny IDE и вставьте следующий код в редактор Thonny. Сохраните этот файл под именем «face_detection.py» в папке, которую мы создали ранее. Убедитесь, что описанные выше XML-файлы присутствуют в каталоге, указанном в коде ( /home/mypi/Face Recognition/
).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
import cv2 import numpy as np import picamera import picamera.array def main(): # Load the face and eye detection cascades face_cascade = cv2.CascadeClassifier('/home/mypi/Face Recognition/haarcascade_frontalface_default.xml') eye_cascade = cv2.CascadeClassifier('/home/mypi/Face Recognition/haarcascade_eye.xml') # You'll need the XML file for eye detection with picamera.PiCamera() as camera: camera.resolution = (320, 240) camera.framerate = 15 with picamera.array.PiRGBArray(camera, size=(320, 240)) as stream: for frame in camera.capture_continuous(stream, format='bgr', use_video_port=True): image = frame.array # Convert the image to grayscale for face and eye detection gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # Detect faces faces = face_cascade.detectMultiScale(gray, 1.1, 5) for (x, y, w, h) in faces: cv2.rectangle(image, (x, y), (x+w, y+h), (255, 255, 0), 2) # Region of interest in the grayscale image for eyes detection roi_gray = gray[y:y+h, x:x+w] # Region of interest in the color image for drawing rectangles around eyes roi_color = image[y:y+h, x:x+w] # Detect eyes within the region of interest (i.e., the detected face) eyes = eye_cascade.detectMultiScale(roi_gray, 1.03, 5, minSize=(30,30)) for (ex, ey, ew, eh) in eyes: cv2.rectangle(roi_color, (ex, ey), (ex+ew, ey+eh), (0, 255, 0), 2) # Resize the frame for displaying in a larger window display_frame = cv2.resize(image, (640, 480)) # Display the frame cv2.imshow('Face and Eye Detection', display_frame) # Clear the stream for the next frame stream.truncate(0) # Close the window when 'q' is pressed if cv2.waitKey(1) & 0xFF == ord('q'): break cv2.destroyAllWindows() if __name__ == '__main__': main() |
Объяснение работы кода
1 2 3 4 |
import cv2 import numpy as np import picamera import picamera.array |
cv2
: Это библиотека OpenCV, мощная библиотека для задач компьютерного зрения.numpy
: Это библиотека для числовых операций. OpenCV использует массивы Numpy для манипуляций с изображениями.picamera
&picamera.array
: Это библиотеки для доступа к модулю камеры Raspberry Pi.
1 |
def main(): |
Эта строка определяет основную функцию, в которой будет находиться основная логика кода.
1 2 |
face_cascade = cv2.CascadeClassifier('/home/mypi/Face Recognition/haarcascade_frontalface_default.xml') eye_cascade = cv2.CascadeClassifier('/home/mypi/Face Recognition/haarcascade_eye.xml') |
Код загружает предварительно обученные классификаторы (называемые каскадами Хаара) для обнаружения лиц и глаз. Эти XML-файлы содержат данные для обнаружения лиц и глаз на изображениях.
1 2 3 |
with picamera.PiCamera() as camera: camera.resolution = (320, 240) camera.framerate = 15 |
Инициализирует камеру Raspberry Pi с разрешением 320×240 и частотой кадров 15 кадров в секунду.
1 2 3 |
with picamera.array.PiRGBArray(camera, size=(320, 240)) as stream: for frame in camera.capture_continuous(stream, format='bgr', use_video_port=True): image = frame.array |
- Функция
capture_continuous
непрерывно захватывает кадры. PiRGBArray
обеспечивает интерфейс 3D RGB-матрицы для изображений, полученных с камеры.- Каждый захваченный кадр преобразуется в массив NumPy для дальнейшей обработки.
1 |
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) |
Цветное изображение преобразуется в оттенки серого. Для обнаружения используются изображения в оттенках серого, поскольку для каскадных классификаторов цветовая информация обычно не требуется.
1 |
faces = face_cascade.detectMultiScale(gray, 1.1, 5) |
Обнаруживает лица на изображении в оттенках серого. Параметры помогают определить масштаб изображения и минимальное количество соседей, которое должно быть у прямоугольника, чтобы считаться лицом.
1 2 |
for (x, y, w, h) in faces: cv2.rectangle(image, (x, y), (x+w, y+h), (255, 255, 0), 2) |
Рисует прямоугольник вокруг каждого обнаруженного лица на исходном цветном изображении.
1 2 3 4 5 |
roi_gray = gray[y:y+h, x:x+w] roi_color = image[y:y+h, x:x+w] eyes = eye_cascade.detectMultiScale(roi_gray, 1.03, 5, minSize=(30,30)) for (ex, ey, ew, eh) in eyes: cv2.rectangle(roi_color, (ex, ey), (ex+ew, ey+eh), (0, 255, 0), 2) |
- Для каждого обнаруженного лица извлекается интересующая нас область (region of interest, ROI) (как в оттенках серого, так и в цветном варианте).
- Затем в этой области интереса обнаруживаются глаза.
- Вокруг каждого обнаруженного глаза в цветовой области интереса рисуются прямоугольники.
1 2 |
display_frame = cv2.resize(image, (640, 480)) cv2.imshow('Face and Eye Detection', display_frame) |
- Размер обработанного кадра изменяется для удобства отображения.
- Затем кадр отображается в окне под названием “Face and Eye Detection” («Распознавание лиц и глаз»).
1 2 3 |
stream.truncate(0) if cv2.waitKey(1) & 0xFF == ord('q'): break |
- Поток обрезается для подготовки к следующему кадру.
- Если пользователь нажмет «q», цикл (и программа) завершится.
1 |
cv2.destroyAllWindows() |
Закрывает все открытые окна OpenCV.
1 2 |
if __name__ == '__main__': main() |
Это распространенная идиома Python. Когда скрипт запускается напрямую (не импортируется), функция main()
выполняется.
Тестирование работы проекта
Запустите скрипт выше, нажав кнопку Run («Запустить»). Появится окно, в котором будут показаны живые изображения объекта с камеры.
Поднесите камеру к лицу. В окнах отобразится синий прямоугольник вокруг лица и два зеленых прямоугольника вокруг глаз.
Скрипт также может обнаруживать несколько лиц на изображении.
Вы можете попробовать это несколько раз, поднося камеру к разным людям. Лицо и глаза будут распознаны каждый раз.
Заключение
Используя библиотеку OpenCV с камерой Raspberry Pi, можно распознавать лица и глаза в реальном времени, демонстрируя мощь компактных систем в задачах компьютерного зрения. Хотя текущая установка с использованием каскадов Хаара эффективна, такие достижения, как глубокое обучение, могут обеспечить более высокую точность. Этот проект подчеркивает потенциал доступной и недорогой технологии в практических приложениях компьютерного зрения.
28 просмотров