Рубрики
Без рубрики

Обнаружение лица с помощью Python и Opencv

Получите практические, реальные навыки Python на наших ресурсах и пути

Автор оригинала: Mike Driscoll.

Машинное обучение, искусственное распознавание интеллекта и лица – это большие темы прямо сейчас. Поэтому я думал, что было бы удовольствием увидеть, насколько легко использовать Python для обнаружения граней на фотографиях. Эта статья будет сосредоточиться на том, чтобы выявить грани, а не распознавать лицо, которое фактически присваивает имя лица. Самый популярный и, вероятно, самый простой способ обнаружения граней с использованием Python, использует пакет OpenCV. Opencv – это библиотека компьютерного зрения, которая написана на C ++ и имела привязки Python. Это может быть сложно установить в зависимости от того, какая вы используете ОС, но по большей части вы можете просто использовать PIP:

pip install opencv-python

У меня были проблемы с Opencv на более старых версиях Linux, где я просто не могу получить новейшую версию для правильной установки. Но это работает нормально в Windows и, кажется, работает хорошо для последних версий Linux прямо сейчас. Для этой статьи я использую версию 3.4.2 версию привязки Python OpenCV.

Найти грани

Существует в основном два основных способа найти грани с использованием OpenCV:

  • Хаар классификатор
  • Lbp cascade классификатор

Большинство учебных пособий используют Хаар, потому что он более точен, но он также намного медленнее, чем LBP. Я собираюсь придерживаться Haar для этого учебника. Пакет OpenCV на самом деле имеет все данные, которые вам необходимо эффективно использовать HARR. По сути, вам просто нужен файл XML с правильными данными лица в нем. Вы можете создать свои собственные, если вы знаете, что вы делали, или вы можете просто использовать то, что поставляется с OpenCV. Я не ученый данных, поэтому я буду использовать встроенный классификатор. В этом случае вы можете найти его в вашей установленной библиотеке OpenCV. Просто иди к /Lib/сайт-пакеты/cv2/data Папка в вашей установке Python и ищите haarcascade_frontalface_alt.xml Отказ Я копировал этот файл и положил его в одну папку, в котором я написал мой код обнаружения лица.

Хаар работает, глядя на серию положительных и отрицательных изображений. В основном кто-то пошел и пометил функции в кучу фотографий как актуальных, либо нет, а затем пробежал его через алгоритм машинного обучения или нейронной сети. Хаар смотрит на край, линии линии и четырех прямоугольников. Есть довольно хорошее объяснение на Сайт opencv Отказ После того, как у вас есть данные, вам не нужно делать какие-либо дальнейшие тренировки, если вам не нужно, чтобы уточнить свой алгоритм обнаружения.

Теперь, когда у нас есть предварительные проезда, давайте напишем какой-нибудь код:

import cv2
import os

def find_faces(image_path):
image = cv2.imread(image_path)

# Make a copy to prevent us from modifying the original
color_img = image.copy()

filename = os.path.basename(image_path)

# OpenCV works best with gray images
gray_img = cv2.cvtColor(color_img, cv2.COLOR_BGR2GRAY)

# Use OpenCV's built-in Haar classifier
haar_classifier = cv2.CascadeClassifier('haarcascade_frontalface_alt.xml')

faces = haar_classifier.detectMultiScale(gray_img, scaleFactor=1.1, minNeighbors=5)
print('Number of faces found: {faces}'.format(faces=len(faces)))

for (x, y, width, height) in faces:
cv2.rectangle(color_img, (x, y), (x+width, y+height), (0, 255, 0), 2)

# Show the faces found
cv2.imshow(filename, color_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

if __name__ == '__main__':
find_faces('headshot.jpg')

Первое, что мы делаем здесь, являются нашим импортом. Привязки OpenCV называются CV2 в питоне. Затем мы создаем функцию, которая принимает путь к файлу изображения. Мы используем OpenCV Imread Метод для чтения файла изображения, а затем мы создаем их копию, чтобы предотвратить случайное изменение исходного изображения. Далее мы преобразуем изображение в серый масштаб. Вы обнаружите, что компьютерное зрение почти всегда работает лучше с серым, чем в цвете или, по крайней мере, это имеет место с OpenCV.

Следующим шагом является загрузка классификатора Haar, используя XML-файл OpenCV. Теперь мы можем попытаться найти грани на нашем изображении, используя объект классификатора Detectmultiscale метод. Я распечатаю количество граней, которые мы нашли, если таковые имеются. Объект классификатора на самом деле возвращает итератор кортежей. Каждый кортеж содержит координаты X/Y лица, которую он найден, а также ширина и высота лица. Мы используем эту информацию, чтобы нарисовать прямоугольник вокруг лица, который был найден с использованием OpenCV Прямоугольник метод. Наконец мы покажем результат:

Это довольно хорошо работало с фотографией себя, глядя прямо на камеру. Просто для удовольствия, давайте попробуем запустите это Роялти-ФРЕК Я нашел через наш код:

Когда я запустил это изображение в коде, я закончил следующим образом:

Как видите, OpenCv нашел только два из четырех лиц, так что конкретные каскады файлы недостаточно хороши для поиска всех граней на фотографии.

Найти глаза на фотографии

OpenCV также имеет файл XML-файла Haar Cascade для поиска глаз на фотографиях. Если вы сделаете много фотографии, вы, вероятно, знаете, что когда вы делаете портрета, вы хотите попытаться сосредоточиться на глазах. Фактически, некоторые камеры даже имеют возможность Eye Autofocus. Например, я знаю, что Sony похвастается своей функцией фокуса глаз в течение нескольких лет, и она на самом деле работает довольно хорошо в моих испытаниях одной из их камер. Это, вероятно, использует что-то вроде хааров, чтобы найти глаз в режиме реального времени.

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

import cv2
import os

def find_faces(image_path):
    image = cv2.imread(image_path)
    
    # Make a copy to prevent us from modifying the original
    color_img = image.copy()
    
    filename = os.path.basename(image_path)
    
    # OpenCV works best with gray images
    gray_img = cv2.cvtColor(color_img, cv2.COLOR_BGR2GRAY)
    
    # Use OpenCV's built-in Haar classifier
    haar_classifier = cv2.CascadeClassifier('haarcascade_frontalface_alt.xml')
    eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')
    
    faces = haar_classifier.detectMultiScale(gray_img, scaleFactor=1.1, minNeighbors=5)
    print('Number of faces found: {faces}'.format(faces=len(faces)))
    
    for (x, y, width, height) in faces:
        cv2.rectangle(color_img, (x, y), (x+width, y+height), (0, 255, 0), 2)
        roi_gray = gray_img[y:y+height, x:x+width]
        roi_color = color_img[y:y+height, x:x+width]
        eyes = eye_cascade.detectMultiScale(roi_gray)
        for (ex,ey,ew,eh) in eyes:
            cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)
    
    # Show the faces / eyes found
    cv2.imshow(filename, color_img)
    cv2.waitKey(0) 
    cv2.destroyAllWindows()
    
if __name__ == '__main__':
    find_faces('headshot.jpg')

Здесь мы добавляем второй объект каскадного классификатора. На этот раз мы используем встроенный OpenCV haarcascade_eye.xml файл. Другим изменением находится в нашей петле, где мы петлю на найден лица. Здесь мы также пытаемся найти глаза и петлю над ними во время рисования прямоугольников вокруг них. Я попытался запустить свой оригинальный образ головы через этот новый пример и получил следующее:

Это сделала довольно хорошую работу, хотя она не нарисовал прямоугольник вокруг глаз справа.

Обертывание

OpenCV имеет много возможностей, чтобы вы начали делать компьютерное зрение с Python. Вам не нужно писать очень много строк кода, чтобы создать что-то полезное. Конечно, вам может потребоваться многое другое, чем показано в этом учебном обучении ваших данных и уточнение вашего набора данных, чтобы сделать этот тип кода правильно. Мое понимание заключается в том, что тренировочная часть – это действительно много времени. Во всяком случае, я настоятельно рекомендую проверить OpenCV и придавая ему попробовать. Это действительно аккуратная библиотека с достойной документацией.

Связанное чтение