Бавно разпознаване на лица на OpenCV?

Компилирах и инсталирах OpenCV (последната версия от SVN) на Mac Os X (това може би е източникът на проблема).

Примерът работи, но алгоритъмът за разпознаване на лица ми се струва бавен. Времето за разпознаване на лице е около 400 ms (току-що използвах примера). Тогава FPS е доста нисък.

В YouTube и всичко останало виждам супер гладко видео с разпознаване на лица в в реално време (дори на iPhone), така че се чувствам объркан. Спомням си, че беше още по-бързо на стария ми компютър с Windows.

400 ms правилно време за откриване ли е?

Забележка: моят 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)


Какъв е размерът на входното изображение. Предполагам 640x480. Обикновено хората, които публикуват видеоклипове в YouTube, преоразмеряват изображението до 160x120. В пълна резолюция от 640x480 е много трудно да получите повече от 2-3 fps. Опитайте да изпратите изображение 160x120. Трябва да получавате поне 10 кадъра в секунда.

person Krish    schedule 02.02.2011
comment
Благодаря, това е добър съвет. Този проект засега е на пауза, но +1 за отговора. - person Matthieu Napoli; 02.02.2011
comment
В момента използвам разпознаване на лица в поток на живо с FullHD уеб камера. Намаляването на видеото до 480x270 и разпознаването на лица работи с интерактивни скорости (20-40ms) на моя Corei7 с OpenCV 1.0. - person rotoglup; 03.02.2011

Добавяне към предишните отговори:

можете също да ускорите нещата, като зададете максималния и най-важното минималния размер за detectMultiScale.

[Също така, както се казва в предишните отговори, силното намаляване на мащаба е в ред, тъй като детекторът на Haar използва много прости функции (за отношенията до 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 GB RAM беше 500 ms на откриване, но забелязах, че има опция за мащабиране... получаване на това до:

./facedetect --scale=4

Получавам скорости на откриване от ‹20ms

Надявам се това да помогне,

Кеукпа

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

Когато работите върху изображение, трябва да намалите мащаба до определени граници. В случай на видеоклипове, заедно с разпознаването на лице, можете също да опитате проследяване. Можете да правите разпознаване на лице на всеки следващ кадър и да проследявате позицията на лицето между кадрите.

Освен това OpenCv поддържа използването на Canny за отхвърляне на региони, където шансовете за намиране на Face са никакви.

person saurabheights    schedule 25.05.2016

Преоразмерих кадъра във видео последователност с фактор 10 и работи страхотно. Също така за по-бърз процес Използвайте Face Detector във всеки x кадър и след това използвайте Face Tracker вместо това в 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 Face detection sample:

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;
    }

CPU, който използвах: Snapdragon 720G


Също така от свързан форум открих, че LBP е много по-бърз от HAAR. Не съм сигурен за това и за производителността и качеството, но реших, че ще е добре да спомена и тази точка.

person Shamshirsaz.Navid    schedule 19.03.2021