Найти в Дзене
Nuances of programming

Распознавание лиц с помощью OpenCV

Оглавление

Источник: Nuances of Programming

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

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

Весь проект доступен в репозитории GitHub. Я решил использовать свою фотографию из инстаграм.

Изображение для тестирования
Изображение для тестирования

Цель

Мы будем работать с двумя основными элементами:

  • Белая рамка вокруг распознанного лица. Нам понадобится файл data_generator.py
  • Вырезанные лица из изображений. Каждое из них будет сохранятся отдельно в папку. Файл face_extractor.py
Обнаружение лица и извлечение
Обнаружение лица и извлечение

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

Проект

Импорт библиотек

Импортируем os для получения доступа к файлам. Далее cv2 — для работы с изображениями. И наконец numpy, который поможет работать с многомерными массивами.

import os
import cv2
import numpy as np

Определяем пути и загружаем модель

Модели prototxt и caffemodel можно взять в репозитории OpenCV. Я разместил их в папке model_data. Файл prototxt содержит текстовое описание сети, а caffemodel — вес. Читаем оба файла и загружаем модель.

-4

Создаём папку

Реализуем проверку. Если папка не существует, то она будет создана. Папка для выходных файлов updated_images.

if not os.path.exists('updated_images'):
print("New directory created")
os.makedirs('updated_images')

Так же поступаем и с папкой для вырезанных лиц faces.

if not os.path.exists('faces'):
print("New directory created")
os.makedirs('faces')

Чтение изображений

Перебираем все изображения в папке images. Далее делаем проверку на соответствие расширений файлов, чтобы работать только с файлами .png и .jpg.

-5

Обнаружение лиц

Используя cv2.imread, читаем изображение и создаем blob с помощью cv2.dnn.blobFromImage. Далее отправляем этот blob в модель и получаем обнаружения, используя model.forward().

-6

Мы выполнили основные шаги. Следующим шагом будет построение белых рамок вокруг лиц и сохранение их в каталоге updated_images. Далее сохраняем извлечённые лица в каталоге faces.

1. Создаём боксы вокруг лиц

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

-7

Далее, используя cv2.imwrite, сохраняем изображение в папку updated_images с тем же именем файла.

Изображение с белой рамкой вокруг лица
Изображение с белой рамкой вокруг лица

2. Извлекаем лицо

Как говорилось выше, перебираем все лица, вычисляем достоверность обнаружения и, если она больше 50%, извлекаем лицо. Обратите внимание на строку frame = image[startY:endY, startX:endX]. Здесь происходит извлечение.

-9

Далее сохраняем это новое изображение в папку faces. Имена файлов присваиваются следующим образом: если имя исходного изображения было sampleImage.png, имя файла после обработки будет 0_sampleImage.png С каждым лицом увеличиваем счётчик и после полного выполнения выводим его на консоль.

Извлечённое изображение
Извлечённое изображение

Теперь всё готово. Вы можете обрабатывать столько изображений сколько захотите, создавая наборы данных для дальнейших проектов.

Читайте также:

Читайте нас в телеграмме и vk

Перевод статьи Karan Bhanot: Extracting faces using OpenCV Face Detection Neural Network