Источник: 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 — вес. Читаем оба файла и загружаем модель.
Создаём папку
Реализуем проверку. Если папка не существует, то она будет создана. Папка для выходных файлов 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.
Обнаружение лиц
Используя cv2.imread, читаем изображение и создаем blob с помощью cv2.dnn.blobFromImage. Далее отправляем этот blob в модель и получаем обнаружения, используя model.forward().
Мы выполнили основные шаги. Следующим шагом будет построение белых рамок вокруг лиц и сохранение их в каталоге updated_images. Далее сохраняем извлечённые лица в каталоге faces.
1. Создаём боксы вокруг лиц
Далее перебираем все лица, обнаруженные на изображении, и извлекаем начальную и конечную точки. Затем извлекаем значение достоверности. Если алгоритм более чем на 50% уверен, что обнаружение является лицом, то вокруг него показываем прямоугольник.
Далее, используя cv2.imwrite, сохраняем изображение в папку updated_images с тем же именем файла.
2. Извлекаем лицо
Как говорилось выше, перебираем все лица, вычисляем достоверность обнаружения и, если она больше 50%, извлекаем лицо. Обратите внимание на строку frame = image[startY:endY, startX:endX]. Здесь происходит извлечение.
Далее сохраняем это новое изображение в папку faces. Имена файлов присваиваются следующим образом: если имя исходного изображения было sampleImage.png, имя файла после обработки будет 0_sampleImage.png С каждым лицом увеличиваем счётчик и после полного выполнения выводим его на консоль.
Теперь всё готово. Вы можете обрабатывать столько изображений сколько захотите, создавая наборы данных для дальнейших проектов.
Читайте также:
Читайте нас в телеграмме и vk
Перевод статьи Karan Bhanot: Extracting faces using OpenCV Face Detection Neural Network