В этой статье мы представим очень простой способ начать работу с распознаванием лиц с помощью Python и библиотеки с открытым исходным кодом OpenCV.
Меры предосторожности:
1) Убедитесь, что вы используете OpenCV v2.
2) Подготовьте веб-камеру, чтобы этот скрипт мог работать.
OpenCV
OpenCV — самая популярная библиотека компьютерного зрения. Первоначально он был написан на C/C++, а теперь предоставляет привязки для Python.
OpenCV использует алгоритмы машинного обучения для поиска лиц на изображениях. Поскольку лица настолько сложны, не существует простого теста, который скажет вам, найдено ли лицо. Вместо этого существуют тысячи небольших шаблонов и функций, которые должны совпадать. Эти алгоритмы разбивают задачу распознавания лиц на тысячи более мелких задач, каждую из которых легко решить. Эти задачи также называются классификаторами.
Для чего-то вроде лица у вас может быть 6000 или более классификаторов, каждый из которых должен соответствовать лицу, которое будет обнаружено (конечно, в пределах погрешности). Но вот проблема: для распознавания лиц алгоритм начинает с верхнего левого угла изображения и перемещается вниз к небольшим фрагментам данных, просматривая каждый фрагмент, постоянно спрашивая: «Это лицо? ... это человек». Лицо? ...это человеческое лицо?» С 6000 или более тестов на блок вам может потребоваться выполнить миллионы вычислений, которые остановят ваш компьютер.
Чтобы решить эту проблему, OpenCV использует каскады.
Каскад OpenCV разбивает проблему обнаружения лиц на несколько этапов. Для каждого блока выполняется очень грубый и быстрый тест. Если он проходит, он проводит более подробный тест и так далее.
Алгоритм может иметь от 30 до 50 таких этапов или каскадов и обнаружит лицо только в том случае, если все этапы пройдены. Преимущество в том, что большинство изображений будут возвращать отрицательные значения на первых нескольких этапах, а это значит, что алгоритм не тратит время на тестирование всех 6000 признаков.
Обнаружение лиц теперь можно выполнять в режиме реального времени, а не часами. Каскадирование на практике Хотя теория может показаться сложной, на самом деле все довольно просто. Сам каскад — это просто набор файлов XML, содержащих данные OpenCV для обнаружения объектов. Вы инициализируете код желаемым каскадом, тогда код будет работать на вас.
Поскольку обнаружение лиц очень распространено, OpenCV поставляется со множеством встроенных каскадов для обнаружения всего, от лиц до глаз, от рук до ног. Есть даже каскады нечеловеческих вещей.
Установить OpenCV
Во-первых, вам нужно найти правильные установочные файлы для вашей операционной системы. Я обнаружил, что установка OpenCV была самой сложной частью задачи. Если вы получаете странные необъяснимые ошибки, это может быть связано с конфликтами библиотек, различиями в 32/64 битах и т. д.
Мне было проще просто использовать виртуальную машину Linux и установить OpenCV с нуля. После установки вы можете проверить его работу, запустив сеанс 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)
Здесь мы читаем изображение и преобразуем его в оттенки серого. Многие операции в OpenCV выполняются в оттенках серого.
# Detect faces in the image
faces = faceCascade.detectMultiScale(
gray,
scaleFactor=1.1,
minNeighbors=5,
minSize=(30, 30),
flags = cv2.cv.CV_HAAR_SCALE_IMAGE
)
Эта функция обнаруживает настоящие лица и является ключевой частью нашего кода, давайте рассмотрим параметры:
- Функция detectMultiScale — это общая функция для обнаружения объектов. Так как мы вызываем его на каскаде лица, это то, что он обнаруживает.
- Первый вариант — изображение в градациях серого.
- Второй — масштабный фактор. Поскольку некоторые лица могут быть ближе к камере, они будут казаться больше, чем лица позади них. Масштабный коэффициент компенсирует это.
- Алгоритмы обнаружения используют движущиеся окна для обнаружения объектов. minNeighbors определяет, сколько объектов обнаружено рядом с текущим объектом, прежде чем объявить, что лицо найдено. Между тем, minSize дает размер каждого окна.
Примечание: я взял общие значения для этих полей. В реальной жизни экспериментируйте с разными значениями размера окна, коэффициента масштабирования и т. д., пока не найдете наилучшее значение.
Функция возвращает список прямоугольников, в которых, по ее мнению, она нашла лицо. Далее мы зациклимся там, где, по его мнению, он что-то нашел.
print "Found {0} faces!".format(len(faces))
# Draw a rectangle around the faces
for (x, y, w, h) in faces:
cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2)
Эта функция возвращает 4 значения: положение прямоугольника по осям x и y, а также ширину и высоту (w, h) прямоугольника.
Мы используем эти значения для рисования прямоугольника с помощью встроенной функции прямоугольника().
cv2.imshow("Faces found", image)
cv2.waitKey(0)
Наконец, мы отображаем изображение и ждем, пока пользователь нажмет клавишу.
результат испытаний
Давайте проверим это на фотографиях ABBA:
$ python face_detect.py abba.png haarcascade_frontalface_default.xml
Это сработало. Как насчет еще одного фото:
Это... не лицо. Давай попробуем еще. Я изменил параметры и обнаружил, что установка ScaleFactor на 1,2 удалила неправильную грань.
что случилось? Ну и первое фото сделано качественным фотоаппаратом.
Второй, кажется, был застрелен издалека, возможно, из мобильного телефона. Вот почему масштабный фактор должен быть изменен.
Как я уже сказал, алгоритм должен устанавливаться в каждом конкретном случае, чтобы избежать ложных срабатываний. Обратите внимание, однако, что, поскольку это основано на машинном обучении, результаты никогда не будут точными на 100%. В большинстве случаев будут получены достаточно хорошие результаты, но иногда алгоритм распознает неправильные объекты как лица.
Полный код здесь:GitHub.com/Шаньтоу Фьюри/FAC…
Расширение: обнаружение пешеходов
Чтобы удовлетворить потребности современного рынка, мы разработали видеоплатформу EasyCVR, которая поддерживает доступ к устройствам по нескольким протоколам.Мы используем python для выполнения тестов распознавания AI.Конкретный метод заключается в включении камеры локального компьютера. для распознавания в реальном времени или для прямой передачи. Введите изображение для обнаружения пешеходов, передайте источник данных в идентификационный код в коде анализа и увидьте источник = «0», но этот параметр должен открыть поток камеры локального компьютер, а затем выполнить обнаружение пешеходов.
Но нам нужно изменить здесь, использовать поток rtsp для распознавания пешеходов AI, а затем нам нужно проанализировать код, чтобы найти место, которое можно изменить, или коснуться параметра, чтобы изменить поток RTSP.
Я нашел, куда передается видеопоток. Далее следует проанализировать код внутри и изменить его на поток rtsp, а также записать поток rtsp для проведения анализа в реальном времени и достижения эффекта обнаружения пешеходов.
В ходе анализа было обнаружено, что исходный параметр использовался только LoadStreams и передавался напрямую.
Введите исходный параметр для проверки и обнаружите, что в нем есть значение по умолчанию, которое должно читать файл.Если это не файл, установите source=[source], а затем перейдите к исходному значению. В обходе также используется opencv для открытия потока камеры локального компьютера, а затем открывается поток для распознавания пешеходов в реальном времени.
В коде используется функция cv2.VideoCapture в opencv.Из использования этой функции в Интернете мы знаем, что эта функция может напрямую передавать адрес rtsp-потока, поэтому решение проблемы намного проще. Функция cv2.VideoCapture может передать адрес rtsp, поэтому попробуйте передать адрес rtsp и обнаружите, что с передачей адреса rtsp проблем нет.
Пока параметр источника изменен, обнаружение, наконец, реализовано: