Face detection with OpenCV

Сегодня я собираюсь поделиться с вами одним секретом, касающимся библиотеки OpenCV:

Вы можете выполнять быстрое и точное обнаружение лица с помощью OpenCV, используя предварительно обученый детектор лиц с глубоким обучением, поставляемый с библиотекой.

Возможно, вы уже знаете, что OpenCV поставляется из коробки с предварительно обученными каскадами Haar, которые можно использовать для обнаружения лиц …

… Но я готов поспорить, что вы не знаете о «скрытом» детекторе лица, основанном на глубоком обучении, который был частью OpenCV начиная с OpenCV 3.3.

В оставшейся части сегодняшнего поста я расскажу:

  • Где этот «скрытый» детектор лица с глубоким обучением живет в библиотеке OpenCV
  • Как вы можете выполнять распознавание лиц на изображениях, используя OpenCV и глубокое обучение
  • Как вы можете выполнять распознавание лиц в видео, используя OpenCV и глубокое обучение

Как мы увидим, легко заменить каскады Хаара на их более точные аналоги детектора лиц с глубоким обучением.

Сегодняшняя тема разбита на три части.

В первой части мы рассмотрим происхождение более точных детекторов лиц OpenCV и их местонахождение в библиотеке OpenCV.

Оттуда я покажу, как вы можете выполнять распознавание лиц на изображениях, используя OpenCV и глубокое обучение.

Затем мы рассмотрим, как можно применять распознавание лиц к видеопотокам, используя OpenCV и глубокое обучение.

Где эти «лучшие» детекторы лица живут в OpenCV и откуда они взялись?

Еще в августе 2017 года был официально выпущен OpenCV 3.3, в который был добавлен модуль «глубоких нейронных сетей» (dnn).

Этот модуль поддерживает ряд структур глубокого обучения, включая Caffe, TensorFlow и Torch / PyTorch.

Основной участник модуля dnn, Александр Рыбников, проделал огромную работу, чтобы сделать этот модуль возможным (и мы должны ему большое спасибо и аплодисменты).

А с момента выпуска OpenCV 3.3 Adrian Rosebrock поделился с нами несколькими углубленными учебными пособиями по OpenCV, включая:

Однако, большинство пользователей OpenCV не знают, что Рыбников включил более точный детектор лиц, основанный на глубоком обучении, который включен в официальный выпуск OpenCV (хотя это может быть довольно сложно найти, если вы не знаете, где искать ).

Детектор лица на основе Caffe можно найти в подкаталоге face_detector примеров dnn:
https://github.com/opencv/opencv/tree/master/samples/dnn/face_detector

При использовании модуля глубокой нейронной сети OpenCV с моделями Caffe вам понадобятся два набора файлов:
Файл .prototxt, который определяет архитектуру модели (то есть сами слои)
Файл .caffemodel, который содержит веса для фактических слоев

Оба файла необходимы для использования моделей, обученных использованию Caffe для глубокого изучения.

Тем не менее, вы найдете файлы прототипа только здесь, в репозитории GitHub.

Весовые файлы не включены в каталог примеров OpenCV, и для их поиска требуется немного больше копаний …

Где можно найти более точные детекторы лиц OpenCV?

Для вашего удобства я включил оба:
Прототипы файлов Caffe
и файлы весов модели Caffe

… Внутри раздела «Загрузки» этого блога.

Как работает детектор лица с глубоким обучением OpenCV?

Детектор лица OpenCV с глубоким обучением основан на платформе Single Shot Detector (SSD) с базовой сетью ResNet (в отличие от других SSD OpenCV, которые вы, возможно, видели, которые обычно используют MobileNet в качестве базовой сети).

Полный обзор SSD и ResNet выходит за рамки этой статьи, поэтому, если вам интересно узнать больше об одиночных SSD детекторах  (в том числе о том, как обучать свои собственные детекторы объектов с глубоким обучением), начните с этой статьи здесь, а затем ознакомьтесь с книгой Deep Learning for Computer Vision with Python, в которой содержатся подробные обсуждения и код, позволяющий вам обучать свои собственные детекторы различных объектов.

Распознавание лиц на изображениях с помощью OpenCV и глубокого обучения

В этом первом примере мы узнаем, как применить распознавание лиц с OpenCV к изображениям.

В следующем разделе мы узнаем, как изменить этот код и применить распознавание лиц с помощью OpenCV к видео, видеопотокам и веб-камерам.

Откройте новый файл, назовите его detect_faces.py и вставьте следующий код:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# import the necessary packages
import numpy as np
import argparse
import cv2
 
# construct the argument parse and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True,
	help="path to input image")
ap.add_argument("-p", "--prototxt", required=True,
	help="path to Caffe 'deploy' prototxt file")
ap.add_argument("-m", "--model", required=True,
	help="path to Caffe pre-trained model")
ap.add_argument("-c", "--confidence", type=float, default=0.5,
	help="minimum probability to filter weak detections")
args = vars(ap.parse_args())

Здесь мы импортируем наши необходимые пакеты (строки 2-4) и анализируем аргументы командной строки (строки 7-16).

У нас есть три обязательных аргумента:
—image: путь к входному изображению.
—prototxt: путь к файлу прототипа Caffe.
—model: путь к предварительно обученной модели Caffe.

Необязательный аргумент —confidence может перезаписать пороговое значение по умолчанию, равное 0,5, если вы хотите.
Оттуда загрузим нашу модель и создадим блоб из нашего изображения:

18
19
20
21
22
23
24
25
26
27
# load our serialized model from disk
print("[INFO] loading model...")
net = cv2.dnn.readNetFromCaffe(args["prototxt"], args["model"])
 
# load the input image and construct an input blob for the image
# by resizing to a fixed 300x300 pixels and then normalizing it
image = cv2.imread(args["image"])
(h, w) = image.shape[:2]
blob = cv2.dnn.blobFromImage(cv2.resize(image, (300, 300)), 1.0,
	(300, 300), (104.0, 177.0, 123.0))

Сначала мы загружаем нашу модель, используя пути к файлам —prototxt и —model. Мы храним модель как net (строка 20).
Затем мы загружаем изображение (строка 24), извлекаем размеры (строка 25) и создаем BLOB-объекты (строки 26 и 27).
dnn.blobFromImage отвечает за предварительную обработку, которая включает установку размеров и нормализацию BLOB-объектов. Если вы заинтересованы в получении дополнительной информации о функции dnn.blobFromImage, я подробно рассмотрю этот пост в блоге.

Далее мы применим распознавание лиц:

29
30
31
32
33
# pass the blob through the network and obtain the detections and
# predictions
print("[INFO] computing object detections...")
net.setInput(blob)
detections = net.forward()

Чтобы обнаружить лица, мы пропускаем каплю (blob) через net в строках 32 и 33.
И оттуда мы будем перебирать обнаружения и рисовать прямоугольники вокруг обнаруженных лиц:

35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# loop over the detections
for i in range(0, detections.shape[2]):
	# extract the confidence (i.e., probability) associated with the
	# prediction
	confidence = detections[0, 0, i, 2]
 
	# filter out weak detections by ensuring the `confidence` is
	# greater than the minimum confidence
	if confidence > args["confidence"]:
		# compute the (x, y)-coordinates of the bounding box for the
		# object
		box = detections[0, 0, i, 3:7] * np.array([w, h, w, h])
		(startX, startY, endX, endY) = box.astype("int")
 
		# draw the bounding box of the face along with the associated
		# probability
		text = "{:.2f}%".format(confidence * 100)
		y = startY - 10 if startY - 10 > 10 else startY + 10
		cv2.rectangle(image, (startX, startY), (endX, endY),
			(0, 0, 255), 2)
		cv2.putText(image, text, (startX, y),
			cv2.FONT_HERSHEY_SIMPLEX, 0.45, (0, 0, 255), 2)
 
# show the output image
cv2.imshow("Output", image)
cv2.waitKey(0)

Мы начинаем обрабатывать обнаружения в цикле на строке 36.
Оттуда мы извлекаем достоверность (строка 39) и сравниваем ее с доверительным порогом (строка 43). Мы выполняем эту проверку, чтобы отфильтровать слабые обнаружения.
Если достоверность соответствует минимальному порогу, мы приступаем к рисованию прямоугольника вместе с вероятностью обнаружения на линиях 46-56.
Для этого мы сначала вычисляем (x, y) -координаты ограничительной рамки (строки 46 и 47).

Затем мы строим нашу доверительную текстовую строку (строка 51), которая содержит вероятность обнаружения.
В случае, если наш текст выйдет за пределы изображения (например, когда обнаружение лица происходит в самом верху изображения), мы сместим его на 10 пикселей (строка 52).

Наш прямоугольник лица и текст уровня достоверности будет нарисован на изображении в строках 53-56.
Оттуда мы возвращаемся к дополнительным обнаружениям, следуя за процессом снова. Если никаких обнаружений не осталось, мы готовы показать наше выходное изображение на экране (строки 59 и 60).

Распознавание лиц на изображениях с результатами OpenCV

Давайте попробуем детектор лица глубокого обучения OpenCV.

Убедитесь, что вы используете раздел «Загрузки» этого блога для загрузки:

  • Исходный код, используемый в этом блоге
  • Файлы прототипов Caffe для глубокого изучения лица
  • Весовые файлы Caffe, используемые для глубокого изучения лица
  • Примеры изображений, использованных в этом посте

Оттуда откройте терминал и выполните следующую команду:

1
2
$ python detect_faces.py --image yourimage.jpg --prototxt deploy.prototxt.txt \
	--model res10_300x300_ssd_iter_140000.caffemodel

 

 

  • No Related Post
Вы можете оставить комментарий, или ссылку на Ваш сайт.

Оставить комментарий

Яндекс.Метрика