Медленное обнаружение лица на OpenCV?

Я скомпилировал и установил OpenCV (последняя версия из SVN) на Mac Os X (это, возможно, источник проблемы).

Образец работает, но алгоритм обнаружения лиц кажется мне медленным. Время обнаружения лица составляет около 400 мс (я только что использовал включенный пример). Тогда FPS будет довольно низким.

На YouTube и во всем остальном я вижу очень плавное видео с реальным временем распознаванием лиц (даже на iPhone), поэтому я чувствую себя сбитым с толку. Я помню, что на моем старом ПК с Windows это было еще быстрее.

Является ли 400 мс правильным временем обнаружения?

Примечание: мой Macbook не старый (2009 г.) и на нем все работает нормально. Я использую веб-камеру iSight (встроенную веб-камеру). У меня только одно лицо (мое лицо) на веб-камере. И это примерно в то же время, если нет лица.


person Matthieu Napoli    schedule 21.09.2010    source источник
comment
Вы компилировали с включенным OpenMP? Хреново без него.   -  person GManNickG    schedule 22.09.2010
comment
Я компилирую с конфигурацией по умолчанию (поэтому понятия не имею). Это включено по умолчанию?   -  person Matthieu Napoli    schedule 22.09.2010
comment
Зависит от вашего компилятора, но обычно нет. Какой у вас компилятор? Посмотрите, как включить OpenMP с его помощью, перекомпилируйте и попробуйте.   -  person GManNickG    schedule 22.09.2010
comment
Я читал об обновлении OpenCV 2.1: OpenCV был полностью переключен с OpenMP на TBB, поэтому, думаю, мне не следует об этом беспокоиться, учитывая, что я использую последнюю версию SVN? (ссылка: opencv.willowgarage.com/wiki/OpenCV%20Monthly)   -  person Matthieu Napoli    schedule 23.09.2010
comment
Ах, извините. Прошло некоторое время с тех пор, как я использовал OpenCV. Итак, я думаю, что следующим делом было бы просмотреть документацию и посмотреть, есть ли какие-либо определения препроцессора, которые вам нужно сделать, чтобы сообщить OpenCV, что у вас есть / он должен использовать TBB. Я смогу помочь посмотреть позже. Кроме того, добавляйте @GMan к вещам, чтобы я был уведомлен о том, что вы ответили.   -  person GManNickG    schedule 23.09.2010


Ответы (6)


Каков размер входного изображения. Думаю 640х480. Обычно люди, которые размещают видео на YouTube, изменяют размер изображения до 160x120. В полном разрешении 640х480 очень сложно получить больше 2-3 фпс. Попробуйте отправить изображение 160x120. Вы должны получить по крайней мере 10 кадров в секунду.

person Krish    schedule 02.02.2011
comment
Спасибо, это хороший совет. Этот проект пока приостановлен, но +1 за ответ. - person Matthieu Napoli; 02.02.2011
comment
В настоящее время я запускаю распознавание лиц в прямом эфире с веб-камеры FullHD. Масштабирование видео до 480x270 и обнаружение лиц выполняются с интерактивной скоростью (20-40 мс) на моем Corei7 с OpenCV 1.0. - person rotoglup; 03.02.2011

Добавление к предыдущим ответам:

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

[Кроме того, как говорится в предыдущих ответах, требуется серьезное уменьшение масштаба, поскольку детектор Хаара использует очень простые функции (для отношений до 6 пикселей; в больших масштабах вы добавляете прямоугольные области, как если бы это был всего один пиксель) . На стандартном mac/mbp2011 я мог получить около 60 кадров в секунду, этого более чем достаточно.]

Для еще большего ускорения вы также можете исключить неизменяемые области, например, используя templateMatching.

person Barney Szabolcs    schedule 01.11.2012

Недавно я нашел библиотеку Simd, в которой есть реализация каскадных классификаторов HAAR и LBP. Он может использовать стандартные каскады HAAR и LBP от OpenCV. Эта реализация имеет оптимизацию SIMD с использованием SSE4.1, AVX2 и NEON(ARM), поэтому работает в 2-3 раза быстрее оригинальной реализации OpenCV.

person William    schedule 20.10.2016

У меня была та же проблема, на четырехъядерном компьютере с 4 ГБ ОЗУ было 500 мс на обнаружение, однако я заметил, что есть параметр «Масштаб» …. чтобы получить это:

./facedetect --масштаб=4

Я получаю скорость обнаружения ‹20 мс

Надеюсь, это поможет,

Кеукпа

person keukpa    schedule 18.03.2011
comment
Ставить Scale=4 неправильно!! масштабный фактор обозначает размер шага, с которым вы хотите изменить searchWindowSize... означает, предположим, что изначально вы ищете с размером окна 1 * 100, в следующий раз вы будете искать с размером окна = 1 * 400 .... и, таким образом, мы выполняем меньше итераций, но также мы можем пропустить грани, которые лежат между двумя. Размер шага по умолчанию близок к 1,1, что означает изменение размера окна на 10%. - person ; 31.05.2011

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

Кроме того, OpenCv поддерживает использование Canny для отбрасывания регионов, где шансов найти Face нет.

person saurabheights    schedule 25.05.2016

Я изменил размер кадра в видеоряде с коэффициентом 10, и он отлично работает. Также для ускорения процесса используйте Детектор лиц в каждом x кадре, а затем используйте Отслеживание лиц вместо этого в x-1 кадрах между ними (Чтобы избежать дрейфа).

проверить эту ссылку: Отслеживание и обнаружение


А также, возможно, кому-то поможет пример кода (это простое обнаружение, не отслеживание или распознавание):

ЭТО ПРИМЕР ДЛЯ ANDROID, но он очень похож на opencv для других платформ и языков.

mRgba = inputFrame.rgba();
mGray = inputFrame.gray();

int resizeFactor=10;//or any other number based on your input resolution
Imgproc.resize(mGray,mGray,newSize(mGray.width()/resizeFactor,mGray.height()/resizeFactor));
mRgba = proc(mRgba, mGray,resizeFactor);

И функция proc примерно такая - я нашел и обновил это из примера обнаружения лиц OpenCV4Android:

public Mat proc(Mat mRgba, Mat mGray, int resizeFactor) {
MatOfRect faces = new MatOfRect();
        if (mJavaDetector != null)
            mJavaDetector.detectMultiScale(mGray, faces, 1.1, 2, 2, new Size(0,0), new Size());//change this according to your usage-> Size(0, 0)

        Rect[] facesArray = faces.toArray();
        for (Rect rect : facesArray) {
            Point t1 = rect.tl();
            t1.x *= resizeFactor;
            t1.y *= resizeFactor;
            Point br = rect.br();
            br.x *= resizeFactor;
            br.y *= resizeFactor;
            Imgproc.rectangle(mRgba, t1, br, FACE_RECT_COLOR, 3);
        }

        return mRgba;
    }

Процессор, который я использовал: Snapdragon 720G


Также на соответствующем форуме я обнаружил, что LBP намного быстрее, чем HAAR. Я не уверен в этом, а также в производительности и качестве, но я подумал, что было бы неплохо упомянуть и этот момент.

person Shamshirsaz.Navid    schedule 19.03.2021