Lei Feng.com: Это техническое объяснение использования OpenCV для распознавания лиц. Прежде чем читать эту статью, вот примечания:
-
Рекомендуется прочитать эту статью перед запуском кода — вам нужно понять, что делает код. Запустить один раз — это не цель, это возможность сделать выводы из одного случая и найти баги в новых задачах.
-
Убедитесь, что вы используете OpenCV v2
-
вам нужна веб-камера
OpenCV
OpenCV — самая популярная библиотека компьютерного зрения, изначально разработанная на C и C++, а теперь также поддерживающая Python.
Он использует алгоритмы машинного обучения для поиска изображений человеческих лиц. Для чего-то столь сложного, как лицо, нет простого обнаружения, которое могло бы сделать вывод, существует ли лицо, но требуется сопоставление тысяч признаков. Алгоритм разбивает задачу распознавания лиц на тысячи небольших задач, ни одна из которых не является сложной. Эти задачи также называются классификаторами.
Для объектов, похожих на лица, может понадобиться не менее 6000 классификаторов, каждый из которых нужно успешно сопоставить (конечно, с допустимой ошибкой), чтобы обнаружить лицо. Но есть проблема: для распознавания лиц алгоритм начинает с левого верхнего угла вычислять блоки данных один за другим, и постоянно спрашивает «это лицо». С более чем 6000 тестов на блок общие вычисления будут исчисляться миллионами, и компьютер, вероятно, заставит вас ждать.
OpenCV использует каскады, чтобы избежать этого. Что такое Каскад? Лучший ответ уже есть в словаре: водопад или непрерывный водопад.
Подобно непрерывному водопаду, каскад OpenCV разбивает проблему распознавания лиц на несколько этапов. Для каждого блока данных выполняется грубая и быстрая проверка. Если он пройден, будет проведена более тщательная проверка и так далее. Алгоритм имеет от 30 до 50 таких стадий или каскадов. Только через все этапы алгоритм определит, что лицо было обнаружено. Преимущество этого в том, что большинство графиков будут иметь отрицательную обратную связь на первых нескольких шагах, поэтому алгоритму не нужно тестировать на нем все 6000 признаков, что экономит много времени. Это позволяет распознавать лица в режиме реального времени по сравнению с «нормальным процессом», который занимает несколько часов.
Каскад на практике
Его теория может показаться сложной, но на практике она очень проста. Эти каскады представляют собой просто серию файлов XML, содержащих данные OpenCV. Вы инициализируете код нужным вам каскадом, и он сделает за вас то, что вы хотите.
Благодаря повсеместному распознаванию лиц OpenCV имеет ряд встроенных каскадов, которые могут обнаруживать все, от глаз до рук и ног. Есть даже каскады для нечеловеческих объектов. Например, если вы управляете фруктовым магазином, где продаются бананы, и хотите следить за тем, как люди воруют бананы, один парень разработалалгоритм!
Установить OpenCV
Во-первых, вам нужно найти тот, который соответствует вашемуОперационная системаправильный файл настроек.
Я обнаружил, что установка OpenCV была самой сложной частью. Если вы получаете странные необъяснимые ошибки, это может быть сбой библиотеки, проблемы совместимости с 32- и 64-разрядными версиями и т. д. Личный опыт показывает, что проще всего установить OpenCV с нуля, используя только виртуальную машину Linux.
После установки вы можете запустить сеанс Python и ввести следующий код, чтобы проверить, работает ли он:
$ python
>>> import cv2
>>>
Если ошибки не появляются, можно переходить к следующему шагу.
понять код
Исходный код доступен по адресуБиблиотека ресурсовскачать. Не забудьте взять текст face_detect.py, изображение abba.png и haarcascade_frontalface_default.xml. Ниже я разбиваю код.
# Get user supplied values
imagePath = sys.argv[1]
cascPath = sys.argv[2]
Передайте изображение и имя каскада в качестве аргументов командной строки. Мы будем использовать изображения Abba и каскад по умолчанию, предоставляемый OpenCV для обнаружения лиц.
# Create the haar cascade
faceCascade = cv2.CascadeClassifier(cascPath)
Теперь мы создаем каскад и инициализируем его каскадом лица. Это загрузит каскад лиц в память, поэтому он готов к использованию. Помните, что этот каскад — всего лишь XML-файл, содержащий данные распознавания лиц.
# Read the image
image = cv2.imread(imagePath)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
Прочитайте изображение и преобразуйте его в формат оттенков серого.
# Detect faces in the image
face = faceCascade.detectMultiScale(
серый,
масштабный коэффициент = 1,1,
минСоседи=5,
минимальный размер = (30, 30),
flags = cv2.cv.CV_HAAR_SCALE_IMAGE
)
Что делает эта функция, так это обнаруживает лица, что является основной частью кода. Итак, пройдемся по вариантам.
Функция DetectMultiScale — это общая функция для обнаружения объектов. Мы называем это каскадом лиц, и он обнаруживает лица. Первый вариант — изображение в градациях серого.
Второй — масштабный фактор. Некоторые лица ближе к камере, чем другие. ScaleFactor компенсирует это.
Алгоритмы обнаружения используют движущиеся окна для обнаружения объектов. minNeighbors определяет, сколько объектов в настоящее время находится вокруг него, прежде чем система объявит, что она обнаружила лицо. MinSize дает размер каждого окна.
Я использую общие значения для этих полей. На самом деле вы будете экспериментировать с разными значениями размера окна, коэффициента масштабирования и т. д., пока не найдете то, которое работает лучше всего.
Когда функция считает, что нашла лицо, она возвращает список прямоугольников. Затем мы зацикливаемся, пока он не решит, что что-то обнаружил.
print "Found {0} faces!".format(len(faces))
# Draw a rectangle around the faces
for (x, y, w, h) in faces:
cv2.rectangle (изображение, (x, y), (x+w, y+h), (0, 255, 0), 2)
Функция возвращает четыре значения: координаты x и y прямоугольника, а также его высоту и ширину. Мы используем эти значения и встроенную функцию прямоугольника() для рисования матрицы.
cv2.imshow("Faces found" ,image)
cv2.waitKey(0)
Наконец, мы отображаем модель, где пользователь нажимает клавишу.
результат испытаний
Уточните у Аббы.
$ python face_detect.py abba.png haarcascade_frontalface_default.xml
Нет проблем, попробуйте другое фото.
Эти две вещи не лица, попробуем еще раз. Я изменил параметры и обнаружил, что установка для ScaleFactor значения 1,2 устраняет ложные обнаружения.
что случилось? Первый снимок был сделан с близкого расстояния камерой высокого разрешения, а второй — с относительно большего расстояния и, вероятно, с помощью мобильного телефона. Вот почему масштабный фактор необходимо настроить. Как я уже сказал, вам нужно настроить алгоритм в соответствии с реальным сценарием и избежать ложных срабатываний.
Здесь Leifeng.com (публичная учетная запись: Leifeng.com) напоминает всем, что, поскольку это основано на машинном обучении, результаты никогда не будут точными на 100%. В большинстве случаев вы получите достойные результаты. Но алгоритмы иногда ошибаются.
Окончательный код находится вздесь.
с веб-камерой
Что делать, если вы хотите использовать веб-камеру? OpenCV считывает каждый кадр с камеры, и вы можете выполнять распознавание лиц, обрабатывая каждый кадр. Вам нужен мощный ПК, но мой пятилетний ноутбук сойдет.
с помощьюrealpython, составлено Leifeng.com
Статьи по Теме:
Босс идет: распознавание лиц + мобильный телефон, вы сразу узнаете, когда босс придет!
Научите, как реализовать распознавание лиц с помощью OpenCV + Python
Авторские статьи Leifeng.com, несанкционированное воспроизведение запрещено. Подробнее см.Уведомление о перепечатке.