73656c6565
@73656c6565
أنتوني

OpenCV в Android. Как ускорить работу Haar-cascade / LBP-cascade?

Всем привет!

Столкнулся с такой проблемой как низкая скорость работы алгоритмов распознавания лиц из opencv в Android(+NDK).
Реальная машина для эксперимента - Galaxy S4 - OS-4.2.2.
OpenCV-2.4.11
Кручу в AS - 2.3.3

В общем, проект собирается и работает, лица распознает, но лагает до тошноты жутко...
Перегуглил SoF, там такие же проблемы у людей были, но нормальной "таблетки" я так и не нашел.
Из того, что понял/догуглил я:
1. Хаар работает медленнее, чем LBP, примерно на 30-50%.
2. Если изменить размер фрейма(на 640х480) который отдаем в native метод - то заметно поднимаем производительность, где то на 150-200%.
3. Если изображение "отскалировать" то работает процентов на 5-10% быстрее...(вот тут как обезъянка откопипастил, если кто может объясните пжлст почему так?)

Код
JNIEXPORT void JNICALL Java_com_example_abuumaribnhattab_facedetectionlightv1_OpenCVfinder_faceDetection
( JNIEnv *, jclass, jlong addrRgba ){
      Mat& frame = *( Mat* )addrRgba;
      detect( frame );
};

void detect( Mat& frame ){

      // -- slowely cascade...
      //String face_cascade_name = "/storage/emulated/0/data/haarcascade_frontalface_alt.xml";
      //const int HaarOptions = CV_HAAR_FIND_BIGGEST_OBJECT | CV_HAAR_DO_ROUGH_SEARCH;

      //--  faster cascade...
      String face_cascade_name = "/storage/emulated/0/data/lbpcascade_frontalface.xml";

      CascadeClassifier face_cascade;

      if( !face_cascade.load( face_cascade_name ) ){
            printf("--(!)Error loading\n"); return;
      };

      std::vector<Rect> faces;

      Mat frame_gray;

      cvtColor( frame, frame_gray, CV_BGR2GRAY );
      equalizeHist( frame_gray, frame_gray );

      //-- scale... wtf ?
      const int scale = 3;
      cv::Mat resized_frame_gray( cvRound( frame_gray.rows / scale ), cvRound( frame_gray.cols / scale ), CV_8UC1 );
      cv::resize( frame_gray, resized_frame_gray, resized_frame_gray.size() );

      //-- Detect faces LBP
      face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0, Size(30, 30) );

      //-- Detect faces haar
      //face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(50, 50) );

      //-- Detect faces haar whith options
      //face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, HaarOptions, Size(50, 50) );

      for( size_t i = 0; i < faces.size(); i++ ) {
            Point center( faces[i].x + faces[i].width*0.5, faces[i].y + faces[i].height*0.5 );
            ellipse( frame, center, Size( faces[i].width*0.5, faces[i].height*0.5), 0, 0, 360, Scalar( 255, 0, 255 ), 4, 8, 0 );
            Mat faceROI = frame_gray( faces[i] );
      }
};


Остальной код думаю не нужен, т.к. основная суть переваривается в Native среде, оттуда же и "валит" производительность(памяти жрет под 90%(18Mb) под приложение, процессор на 90-95%).
Кто уже "пережевал" эту проблему, поделитесь пожалуйста способами по ускорению работы!
  • Вопрос задан
  • 654 просмотра
Решения вопроса 1
Ni55aN
@Ni55aN
Можно попробовать на GPU вычислять с помощью OpenCL
Библиотека умеет с ним работать, но, кажется, не на все функции это распространяется
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы