- Необходимые компоненты
- Установка OpenCV в Raspberry Pi
- Как определить части лица с помощью dlib
- Программирование Raspberry Pi для распознавания ориентиров на лице
- Тестирование распознавателя частей лица
Обнаружение лицевых ориентиров - это процесс обнаружения различных частей лица, таких как брови, глаза, нос, рот и челюсть. Есть много приложений, которые используют методы определения лицевых ориентиров.
Раньше мы строили систему распознавания лиц с использованием OpenCV, сегодня мы будем использовать тот же OpenCV с Raspberry Pi для определения лицевых ориентиров. Предварительно обученный модуль детектора лицевых ориентиров из библиотеки dlib будет использоваться для определения местоположения ключевых структур лица на лице, а Python OpenCV будет использоваться для визуализации обнаруженных частей лица.
Необходимые компоненты
Компоненты оборудования
- Raspberry Pi 3
- Модуль камеры Pi
Программное обеспечение и онлайн-сервисы
- OpenCV
- Длиб
- Python3
Прежде чем приступить к обнаружению ориентиров на лице Raspberry Pi 3 , сначала нам нужно установить OpenCV, imutils, dlib, Numpy и некоторые другие зависимости в этом проекте. OpenCV используется здесь для обработки цифровых изображений. Наиболее распространенными приложениями цифровой обработки изображений являются обнаружение объектов, распознавание лиц и счетчик посетителей.
Чтобы узнать больше о том, как подключить камеру Pi к Raspberry Pi, следуйте нашим предыдущим урокам.
Установка OpenCV в Raspberry Pi
Здесь библиотека OpenCV будет использоваться для QR-сканера Raspberry Pi. Чтобы установить OpenCV, сначала обновите Raspberry Pi.
sudo apt-get update
Затем установите необходимые зависимости для установки OpenCV на Raspberry Pi.
sudo apt-get install libhdf5-dev -y sudo apt-get install libhdf5-serial-dev –y sudo apt-get install libatlas-base-dev –y sudo apt-get install libjasper-dev -y sudo apt-get install libqtgui4 –Y sudo apt-get install libqt4-test –y
После этого установите OpenCV в Raspberry Pi, используя следующую команду.
pip3 установить opencv-contrib-python == 4.1.0.25
Ранее мы использовали OpenCV с Raspberry pi и создали по нему множество руководств.
- Установка OpenCV на Raspberry Pi с помощью CMake
- Распознавание лиц в реальном времени с помощью Raspberry Pi и OpenCV
- Распознавание номерных знаков с использованием Raspberry Pi и OpenCV
- Оценка размера толпы с использованием OpenCV и Raspberry Pi
Мы также создали серию руководств по OpenCV, начиная с начального уровня.
Установка imutils : imutils используется для выполнения нескольких необходимых функций обработки изображений, таких как перевод, поворот, изменение размера, скелетонизация и упрощение отображения изображений Matplotlib с помощью OpenCV. Итак, установите imutils, используя команду ниже:
pip3 установить imutils
Установка dlib: dlib - это современный набор инструментов, содержащий алгоритмы машинного обучения и инструменты для решения реальных проблем. Используйте команду ниже, чтобы установить dlib.
pip3 установить dlib
Установка NumPy : NumPy - это основная библиотека для научных вычислений, которая содержит мощный объект n-мерного массива, предоставляет инструменты для интеграции C, C ++ и т. Д.
Pip3 установить numpy
Как определить части лица с помощью dlib
Мы собираемся использовать предварительно обученный детектор лицевых ориентиров из библиотеки dlib для определения местоположения 68 (x, y) -координат, которые соответствуют лицевым структурам на лице. Средство прогнозирования ориентиров лица dlib обучено на наборе данных iBUG 300-W. Изображение, содержащее индексы 68 координат, приведено ниже:
Программирование Raspberry Pi для распознавания ориентиров на лице
Полный код Python для распознавания частей лица с предварительно обученным детектором лицевых ориентиров dlib приведен в конце страницы. Здесь мы объясняем некоторые важные части кода для лучшего понимания.
Итак, как обычно, запустите код, включив все необходимые библиотеки.
from imutils import face_utils import numpy as np import argparse import imutils import dlib import cv2 from picamera.array import PiRGBArray from picamera import PiCamera
Затем инициализируйте объект камеры и установите разрешение (640, 480) и частоту кадров 30 кадров в секунду.
camera = PiCamera () camera.resolution = (640, 480) camera.framerate = 30
Теперь в следующих строках используйте синтаксический анализатор аргументов, чтобы указать путь к предиктору лицевых ориентиров.
ap = argparse.ArgumentParser () ap.add_argument ("- p", "--shape-predictor", required = True, help = "путь предиктора лицевых ориентиров") args = vars (ap.parse_args ())
В следующих строках инициализируйте предварительно обученный детектор лица dlib на основе HOG и загрузите предварительно обученный предсказатель лицевых ориентиров.
детектор = dlib.get_frontal_face_detector () predictor = dlib.shape_predictor (args)
Затем используйте функцию capture_continuous, чтобы начать захват кадров с камеры Raspberry Pi.
для кадра в camera.capture_continuous (rawCapture, format = "bgr", use_video_port = True): image = frame.array cv2.imshow ("Frame", image) key = cv2.waitKey (1) & 0xFF rawCapture.truncate (0)
Используйте клавишу клавиатуры «S» для захвата определенного кадра. Затем измените размер захваченного изображения и преобразуйте его в оттенки серого.
если ключ == ord ("s"): image = imutils.resize (image, width = 400) gray = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY)
Используйте функцию детектора библиотеки dlib для обнаружения лиц на захваченном изображении.
rects = детектор (серый, 1)
Сделайте снимок, на котором было выполнено обнаружение лиц, определите лицевые ориентиры и преобразуйте 68 точек в массив NumPy. Оберните петлей каждую область лица индивидуально.
for (i, rect) в enumerate (rects): shape = predictor (серый, rect) shape = face_utils.shape_to_np (shape)
Затем возьмите копию исходного изображения и используйте ее для цикла, чтобы нарисовать имя части лица на изображении. Цвет текста будет красным, вы можете изменить его на другой цвет, изменив значения RGB.
for (name, (i, j)) в face_utils.FACIAL_LANDMARKS_IDXS.items (): clone = image.copy () cv2.putText (clone, name, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0), 255), 2)
Теперь мы переберем обнаруженные части лица и воспользуемся функцией рисования OpenCV, чтобы нарисовать круги на этих частях лица. Вы можете следовать этому документу OpenCV для получения дополнительной информации о функциях рисования
for (x, y) в форме: cv2.circle (clone, (x, y), 1, (0, 0, 255), -1)
Теперь в следующих строках мы извлечем каждую часть лица как отдельное изображение, вычислив ограничивающую рамку координат определенной части лица. Размер извлеченного изображения будет увеличен до 250 пикселей.
(x, y, w, h) = cv2.boundingRect (np.array (])) roi = image roi = imutils.resize (roi, width = 250, inter = cv2.INTER_CUBIC)
Теперь в последних строках кода отобразите части лица с их названиями и отдельное изображение этой части. Используйте клавишу ESC, чтобы изменить область лица.
cv2.imshow ("ROI", roi) cv2.imshow ("Image", clone) cv2.waitKey (0)
Тестирование распознавателя частей лица
Чтобы протестировать проект, создайте каталог и перейдите к нему, используя следующие команды:
mkdir детектор части лица cd детектор части лица
Теперь загрузите файл shape_predictor_68_face_landmarks.dat по этой ссылке, затем извлеките и скопируйте файл shape_predictor_68_face_landmarks.dat внутри этой библиотеки, а затем откройте новый файл с именем detect.py и вставьте приведенный ниже код.
Теперь запустите код Python, используя следующую команду:
python3 detect.py --shape-predictor shape_predictor_68_face_landmarks.dat
Вы увидите окно с изображением в реальном времени с вашей камеры. Затем нажмите клавишу «S», чтобы выбрать кадр из прямой трансляции. Вы увидите красные точки в области рта. Используйте клавишу ESC, чтобы увидеть другие части лица.
Полный код Python и демонстрационное видео приведены ниже.