Вы находитесь на странице: 1из 16

Урок 12

Face Tracking

Материалы урока прикреплены к данному PDF-файлу. Для досту-


па к материалам, урок необходимо открыть в программе Adobe
Acrobat Reader.

2
Face Tracking

Face Tracking
Распознавание лиц — это технология, которая позво-
ляет обнаруживать лица на изображении или в видеопо-
токе. Данная технология применяется для решения ши-
рокого круга задач: охранные системы, онлайн-платежи,
обеспечение безопасности в местах большого скопления
людей, поиск и выделение лиц на фото в социальных се-
тях (рис. 1).

Рисунок 1
Автоматическое детектирование и распознавание лиц
используется в смартфонах, камерах слежения и многих
других гаджетах. В смартфонах распознавание лиц при-
меняется в качестве дополнительного способа разблоки-
ровки устройства. Кроме того, по лицу предоставляется
доступ к различным функциям, например, к платежным
системам и бесконтактным платежам. Технология распоз-
навания лиц используется в приложениях, которые по-
зволяют менять возраст, цвет волос, цвет глаз, наносить
макияж и многое другое (рис. 2).

3
Урок 12

Рисунок 2
Разработаем свою систему трекинга за лицом с по-
мощью Arduino и Python. Мы выбрали именно этот язык
программирования, поскольку он отлично подходит для
реализации алгоритмов компьютерного зрения.
Схема подключения компонентов показана на ри-
сунке 3.

Рисунок 3

4
Face Tracking

Будем использовать 2 сервопривода Micro Servo 9g


(рис. 4).

Рисунок 4
Для управления положением камеры будем использо-
вать Servo Pan Tilt Kit. Устройство будет управлять пово-
ротом и наклоном камер. Это идеальное решение, чтобы
получить дополнительный угол обзора (рис. 5).

Рисунок 5
И, конечно же, нам понадобится внешняя веб-каме-
ра или камера мобильного телефона (рис. 6).

5
Урок 12

Рисунок 6
Напишем программу на Python для распознавания
лиц. Открываем любую удобную среду программирова-
ния, например, PyCharm и создаем новый проект. Уста-
навливаем следующие пакеты: pyserial, OpenCV. Чтобы
установить пакеты, нам понадобятся такие команды:

pip install pyserial


pip install opencv-python

Убедимся, что все модули установлены (рис. 7).

Рисунок 7
6
Face Tracking

В дополнительных материалах есть файл haarcascade_


frontalface_default.xml, он должен находиться в папке со
скриптом faces.py. Сначала импортируем библиотеки:
import serial
import time
import cv2

Затем устанавливаем соединение с Arduino:


arduino = serial.Serial('COM5', 9600)

Здесь следует заменить COM5 на адрес порта, к ко-


торому подключена плата.
После этого ожидаем несколько секунд и выводим
сообщение в консоль:
time.sleep(2)
print(“Connected to arduino...”)

Поскольку основная задача данного скрипта — это


обнаружение лиц, то нужно загрузить классификатор,
который будет выполнять эту функцию. Будем исполь-
зовать каскады Хаара:
face_cascade =
cv2.CascadeClassifier(‘haarcascade_frontalface_default.xml’)

Затем подключаемся к камере для передачи видео-


потока:
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)

Мы использовали 0, чтобы подключиться к встроен-


ной веб-камере. Этого достаточно, чтобы протестировать

7
Урок 12

код. Однако позже это значение нужно будет заменить


на адрес внешней камеры.
Для стрима видео можно использовать внешнюю ка-
меру или смартфон. Если мы воспользуемся телефоном,
то нужно установить дополнительное ПО. Можно уста-
новить программу DroidCam на ПК или IP Webcam на
смартфон. Следовательно, в скрипте нужно будет ука-
зать адрес подключения:
cap = cv2.VideoCapture(“http://192.168.18.37:8090/video”)

Затем выбираем размеры окна:


cap_with = 500
cap_height = 500

Далее будем обрабатывать видеопоток и отправлять


на Arduino значения x и y, где было обнаружено лицо:
while True:
ret, img = cap.read()
cv2.resizeWindow(‘img’, cap_with, cap_height)
cv2.line(img, (cap_with, cap_height//2),
(0, cap_height//2), (0, 255, 0), 1)
cv2.line(img, (cap_with//2, 0),
(cap_with//2, cap_height), (0, 255, 0), 1)
cv2.circle(img, (cap_with//2, cap_height//2), 5,
(255, 255, 255), -1)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3)

В цикле происходит обнаружение лиц:


for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x + w, y + h),
(0, 255, 0), 5)

8
Face Tracking

roi_gray = gray[y:y + h, x:x + w]


roi_color = img[y:y + h, x:x + w]
arr = {y: y + h, x: x + w}
print(‘---------------------’)
print(‘---------------------’)
print(arr)
print(‘X: %d | Y: %d’ % (x, y))
print(‘x+w: %d | y+h: %d’ % (x + w, y + h))

Затем, если лицо обнаружено, оно выделяется пря-


моугольником. Находим центр этого прямоугольника:
xx = int(x + (x + h)) / 2
yy = int(y + (y + w)) / 2
print(‘xx: %d | yy: %d’ % (xx, yy))

center = (xx, yy)

После этого отправляем данные на Arduino:


print(“Center of Rectangle is :”, center)
data = “X{0:d}Y{1:d}Z”.format(xx, yy)
print(“output = ‘” + data + “’”)
arduino.write(data)
cv2.imshow(‘Stream video’, img)
key = cv2.waitKey(20)
if key == 27:
print(‘Stop streaming’)
break

Выполнение цикла завершится после нажатия на


клавишу ESC. Обязательно по окончании выполнения
скрипта нужно закрыть все окна:
cap.release()
cv2.destroyAllWindows()

9
Урок 12

Далее напишем скетч для Arduino. Нам нужно напи-


сать такой код, чтобы с его помощью можно было управ-
лять сервоприводами. Подключаем библиотеку:
#include <Servo.h>

Затем определяем пины, создаем объект сервопри-


вода и переменные:
# define SERVO_VER_PIN 5 //Attach Vertical Servo to Pin 5
# define SERVO_HOR_PIN 6 //Attach Horizontal Servo to Pin 6

Servo servoVer; //Vertical Servo


Servo servoHor; //Horizontal Servo

int x;
int y;

int prevX;
int prevY;

Устанавливаем режим работы пинов:


void setup() {
Serial.begin(9600);
servoVer.attach(SERVO_VER_PIN);
servoHor.attach(SERVO_HOR_PIN);
servoVer.write(90);
servoHor.write(90);
}

Затем напишем функцию для вращения сервопривода:


void servoPosition() {
if (prevX != x || prevY != y) {
int servoX = map(x, 600, 0, 70, 179);
int servoY = map(y, 450, 0, 179, 95);

10
Face Tracking

servoX = min(servoX, 179);


servoX = max(servoX, 70);
servoY = min(servoY, 179);
servoY = max(servoY, 95);

servoHor.write(servoX);
servoVer.write(servoY);
}
}

И далее описываем цикл. На вход Arduino получа-


ем значения x и y, обрабатывает их и подает команду на
сервопривод:
void loop() {

if (Serial.available() > 0) {
if (Serial.read() == ‘X’) {
x = Serial.parseInt();
if (Serial.read() == ‘Y’) {
y = Serial.parseInt();
servoPosition();
}
}

while (Serial.available() > 0) {


Serial.read();
}
}
}

Собираем конструкцию для удерживания веб-каме-


ры. Мы можем использовать готовый набор или создать
его самостоятельно из дерева, пластика или даже напе-
чатать на 3D принтере (рис. 8).

11
Урок 12

Рисунок 8
Соединяем все компоненты вместе (рис. 9).

Рисунок 9
После того, как все сделано подключено, нужно про-
верить работу устройства. Убедимся, что сервоприводы

12
Face Tracking

правильно подключены к Arduino, а скетч загружен. По-


сле загрузки кода обязательно нужно закрыть IDE, что-
бы порт мог свободно подключаться к скрипту на Python.
Теперь открываем скрипт face.py и запускаем код. Под-
ключение к Arduino займет всего несколько секунд, после
чего мы сразу увидим окно с видеопотоком.
Теперь программа обнаруживает лица в видеопото-
ке, а серво поворачивается вместе с тем, как меняется
положение лица. Крепим камеру к сервоприводу, что-
бы она меняла свое положение вместе с сервопривода-
ми (рис. 10).

Рисунок 10
Интеллектуальные системы с функцией распознава-
ния лиц используются в системах трекинга и распозна-
вания лиц. Например, камеры видеонаблюдения, уста-

13
Урок 12

новленные в зоне проверки безопасности в аэропорту,


могут отслеживать лица пассажиров и сравнивать их
с базой (рис. 11).

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

14
Face Tracking

15
Урок 12
Face Tracking

© Компьютерная Академия «Шаг»


www.itstep.org

Все права на охраняемые авторским правом фото-, аудио- и видеопро-


изведения, фрагменты которых использованы в материале, принадле-
жат их законным владельцам. Фрагменты произведений используются
в иллюстративных целях в объёме, оправданном поставленной задачей,
в рамках учебного процесса и в учебных целях, в соответствии со ст. 1274
ч. 4 ГК РФ и ст. 21 и 23 Закона Украины «Про авторське право і суміжні
права». Объём и способ цитируемых произведений соответствует
принятым нормам, не наносит ущерба нормальному использованию
объектов авторского права и не ущемляет законные интересы автора
и правообладателей. Цитируемые фрагменты произведений на момент
использования не могут быть заменены альтернативными, не охраня-
емыми авторским правом аналогами, и как таковые соответствуют
критериям добросовестного использования и честного использования.
Все права защищены. Полное или частичное копирование материалов
запрещено. Согласование использования произведений или их фраг-
ментов производится с авторами и правообладателями. Согласованное
использование материалов возможно только при указании источника.
Ответственность за несанкционированное копирование и коммерческое
использование материалов определяется действующим законодатель-
ством Украины.

Оценить